Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 用VB.Net访问数据库存储过程后返回真/假_Sql_Sql Server_Vb.net_Stored Procedures - Fatal编程技术网

Sql 用VB.Net访问数据库存储过程后返回真/假

Sql 用VB.Net访问数据库存储过程后返回真/假,sql,sql-server,vb.net,stored-procedures,Sql,Sql Server,Vb.net,Stored Procedures,我正在用VB.Net编写一个程序,与我一直在创建的SQL Server数据库进行接口。在数据库中,我创建了以下存储过程,以便将新条目添加到数据库中的一个表中: CREATE PROCEDURE CreatePurchaseOrder( @OrderNum VARCHAR(20), @JobNum VARCHAR(10), @Supplier VARCHAR(75), @Contact VARCHAR(100), @User VARCHAR(1

我正在用VB.Net编写一个程序,与我一直在创建的SQL Server数据库进行接口。在数据库中,我创建了以下存储过程,以便将新条目添加到数据库中的一个表中:

CREATE PROCEDURE CreatePurchaseOrder(
    @OrderNum VARCHAR(20),
    @JobNum   VARCHAR(10),
    @Supplier VARCHAR(75),
    @Contact  VARCHAR(100),
    @User     VARCHAR(100),
    @Notes    VARCHAR(MAX) = NULL
) AS
BEGIN
    DECLARE @JobID int, @SupplierID int, @ContactID int, @UserID int, @StatusID int

    SELECT @JobID = job_id
      FROM jobs
     WHERE job_number = @JobNum

    SELECT @SupplierID = supplier_id
      FROM suppliers
     WHERE supplier_name = @Supplier

    SELECT @ContactID = contact_id
      FROM supplier_contacts
     WHERE (first_name = SUBSTRING(@Contact, 1, CHARINDEX(' ', @Contact) - 1) AND
            last_name = SUBSTRING(@Contact, CHARINDEX(' ', @Contact) + 1, LEN(@Contact))) OR
           (first_name = SUBSTRING(@Contact, 1, CHARINDEX(' ', @Contact) - 1)) AND 
           supplier_id = @SupplierID

    SELECT @UserID = users_id
      FROM users
     WHERE first_name = SUBSTRING(@User, 1, CHARINDEX(' ', @User) - 1) AND
           last_name = SUBSTRING(@User, CHARINDEX(' ', @User), LEN(@User))

    SELECT @StatusID = status_id
      FROM purchase_statuses
     WHERE status_description = 'Ordered'

    IF(NOT EXISTS(SELECT order_id FROM purchase_orders WHERE order_number = @OrderNum))
        BEGIN
            INSERT INTO purchase_orders(order_number, job_id, supplier_id, contact_id, users_id, status_id, notes)
            VALUES (@OrderNum, @JobID, @SupplierID, @ContactID, @UserID, @StatusID, @Notes)
            RETURN 0
        END
    ELSE
        RETURN 1
END
该过程的目的是在数据库中创建新文件,如果文件插入成功,则返回0。如果失败,则返回1。我试图使布尔返回值与SQL保持一致,因为在正常的成功查询中,SQL返回0表示成功,返回1表示错误/失败iirc

无论如何,当我用VB.Net程序访问存储过程时,我遇到了获取布尔返回值的问题。这是调用过程的方法(这是一个用于调用任何
SqlCommand
的通用方法)

当我为我的
CreatePurchaseOrder
过程调用我的
ExecuteCMD()
函数时,它返回的数据集中根本没有值。因此,我无法检测表插入是否成功。我是否需要更改SQL端的某些内容以获得所需的结果?或者是.Net代码中需要更改的内容

编辑:这是调用
ExecuteCMD()
函数的代码:

Public Function CreatePurchaseOrder(ByVal orderNum As String, ByVal jobNum As String, ByVal supplier As String, ByVal contact As String, ByVal user As String, Optional ByVal notes As String = "") As Boolean
    Dim CMD As New SqlCommand("CreatePurchaseOrder")
    CMD.Parameters.Add("@OrderNum", SqlDbType.VarChar).Value = orderNum ' L154-2002'
    CMD.Parameters.Add("@JobNum", SqlDbType.VarChar).Value = jobNum 'L154'
    CMD.Parameters.Add("@Supplier", SqlDbType.VarChar).Value = supplier 'A2A Systems'
    CMD.Parameters.Add("@Contact", SqlDbType.VarChar).Value = contact 'Ian '
    CMD.Parameters.Add("@User", SqlDbType.VarChar).Value = user 'John Doe'
    CMD.Parameters.Add("@Notes", SqlDbType.VarChar).Value = notes
    CreatePurchaseOrder = CBool(ExecuteCMD(CMD).ToString())
End Function

每个参数添加末尾的结束注释都是将要使用的数据集的示例。

当存储过程以返回x结束时,您可以使用属性方向设置为ParameterDirection.ReturnValue的参数来检索x的值。
您不需要DataSet和DataAdapter来获取此值

您可以通过这种方式更改方法(请注意,我假设您已经准备好SP所需的6个参数)

Public Function ExecuteCMDWithReturnValue(ByRef CMD作为SqlCommand)作为布尔值
尝试
OpenDBConnection()
CMD.Connection=DB\u连接
CMD.Parameters.Add(“@ret”,SqlDbType.Int).Direction=ParameterDirection.ReturnValue
“嗯,这应该在创建和准备命令时完成,而不是在这里。
CMD.CommandType=CommandType.storedProcess
CMD.ExecuteNonQuery()
Dim结果为Object=CMD.Parameters(“@ret”).Value
返回If(Convert.ToInt32(result)=1,False,True)
特例
抛出新异常(“数据库错误:&ex.Message”)
返回错误
最后
CloseDBConnection()
结束尝试
端函数

请注意,尝试为每种可能的数据库交互情况创建一个“一刀切”的通用方法是一项非常复杂的任务。我建议您使用适当的ORM来处理您的数据库任务,或者至少为您的每个任务编写一个特定的数据库层,而不是通用的数据库层来为所有任务提供服务。

您能展示一下添加这些任务的代码吗存储过程所需的参数?听起来您可以在过程中使用输出参数。@Steve已编辑并添加到操作系统DataAdapter的目的是捕获SELECT语句的结果,而不是RETURN语句。因此,您只需在末尾选择1即可。您可以使用ExecuteScalar()取而代之的是获取单个值,而不是使用整个数据集包含1个字段。这里有一些选项:。如您所见,
RETURN 1
通常用于表示特定的内容,而不仅仅是验证错误。@JoelCoehoorn传入的SqlCommand对象可能已经有一些绑定参数了你是怎么想的?
Public Function CreatePurchaseOrder(ByVal orderNum As String, ByVal jobNum As String, ByVal supplier As String, ByVal contact As String, ByVal user As String, Optional ByVal notes As String = "") As Boolean
    Dim CMD As New SqlCommand("CreatePurchaseOrder")
    CMD.Parameters.Add("@OrderNum", SqlDbType.VarChar).Value = orderNum ' L154-2002'
    CMD.Parameters.Add("@JobNum", SqlDbType.VarChar).Value = jobNum 'L154'
    CMD.Parameters.Add("@Supplier", SqlDbType.VarChar).Value = supplier 'A2A Systems'
    CMD.Parameters.Add("@Contact", SqlDbType.VarChar).Value = contact 'Ian '
    CMD.Parameters.Add("@User", SqlDbType.VarChar).Value = user 'John Doe'
    CMD.Parameters.Add("@Notes", SqlDbType.VarChar).Value = notes
    CreatePurchaseOrder = CBool(ExecuteCMD(CMD).ToString())
End Function