Sql 用VB.Net访问数据库存储过程后返回真/假
我正在用VB.Net编写一个程序,与我一直在创建的SQL Server数据库进行接口。在数据库中,我创建了以下存储过程,以便将新条目添加到数据库中的一个表中: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
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