sql - sql从存储过程中检索输出参数( 标识列),VB.Net oledbcommand

  显示原文与译文双语对照的内容

我正在尝试从 SQL Server 2008 R2的存储过程中检索一个输出参数值( 标识字段) 。

我查看了以下stackoverflow链接。 我正在做同样的事情,但仍然面临着问题: 使用oledb命令 VB.Net 存储过程从存储过程中检索输出参数存储过程- 返回标识作为输出参数或者标量参数。

我的存储过程:


ALTER proc [dbo].[sp_Custom_InsertxRef]


 @DocumentID int,


 @RevNr int,


 @xRefDocument int,


 @xRefRevNr int,


 @xRefProjectId int,


 @RefCount int,


 @xRef int OUTPUT


AS


BEGIN


 SET NOCOUNT ON



 DECLARE @HasFullPath bit=1;


 DECLARE @RelativePath nvarchar(300)='';


 DECLARE @RefCountEdit float=NULL;


 DECLARE @RefTimeStamp as datetime=GETDATE();


 DECLARE @xrType as int = 1;



INSERT INTO [EpiGrid].[dbo].[XRefs]


 ([DocumentID]


, [RevNr]


, [XRefDocument]


, [XRefProjectID]


, [XRefRevNr]


, [HasFullPath]


, [RelativePath]


, [RefCount]


, [RefCountEdit]


, [RefTimeStamp]


, [XrType])


 VALUES


 (


 @DocumentID,


 @RevNr,


 @xRefDocument,


 @xRefProjectId,


 @xRefRevNr,


 @HasFullPath,


 @RelativePath,


 @RefCount,


 @RefCountEdit,


 @RefTimeStamp,


 @xrType


 )


 SET @xRef=(SELECT SCOPE_IDENTITY());


 --select @xRef=(SELECT SCOPE_IDENTITY());


 return @xRef;


END



我的VB.Net 代码:


Using connection As New System.Data.OleDb.OleDbConnection(Connectionstring)


 connection.Open()


 Using command As New OleDbCommand("sp_Custom_InsertxRef", connection)


 command.CommandType = CommandType.StoredProcedure


 command.Parameters.Add("@DocumentID", OleDbType.Integer, 4, ParameterDirection.Input).Value = epdmParDoc.ID


 command.Parameters.Add("@RevNr", OleDbType.Integer, 4, ParameterDirection.Input).Value = epdmParDoc.GetLocalVersionNo(parFolderId)


 command.Parameters.Add("@xRefDocument", OleDbType.Integer, 4, ParameterDirection.Input).Value = targetReplaceDoc.ID


 command.Parameters.Add("@xRefRevNr", OleDbType.Integer, 4, ParameterDirection.Input).Value = targetReplaceDoc.CurrentVersion


 command.Parameters.Add("@xRefProjectId", OleDbType.Integer, 4, ParameterDirection.Input).Value = parFolderId


 command.Parameters.Add("@RefCount", OleDbType.Integer, 4, ParameterDirection.Input).Value = count


 'command.Parameters.Add("@xRef", OleDbType.Integer, 4, ParameterDirection.InputOutput).Value = -1


 command.Parameters.Add("@xRef", OleDbType.Integer)


 command.Parameters("@xRef").Direction = ParameterDirection.Output


 command.ExecuteReader()


 xRefId = command.Parameters("@xRef").Value


 End Using


 connection.Close()


 End Using



我尝试作为输出和返回值,并看到相同的结果。 记录在数据库( 无错误) 中创建,但我的代码没有为输出参数获取任何内容。 知道为什么?

当我调试 SQL Server 管理工作室中的存储过程时,它会创建记录,我看到的返回或者输出( 同时尝试) 。


Exec [dbo].[sp_Custom_InsertxRef]


 @DocumentID =12,


 @RevNr =1,


 @xRefDocument = 15,


 @xRefRevNr =1,


 @xRefProjectId =1,


 @RefCount =2,


 @xRef=-1;



请告知。

时间: 原作者:

首先,为什么要使用执行读取器函数? 如果你不想从存储中返回任何值,那么只需使用 ExecuteNonQuery() 方法而不是 ExecuteReader() 。 如果你想读取存储过程的值,那么你可以使用 ExecuteReader(),但是你必须指定 DataReader 对象。

例如


Dim dr As OleDBDataReader = Nothing


Try 


 dr = command.ExecuteReader()


 IF dr.HasRows Then


 While (dr.Read())


 var value = dr.getValue(0)


 End While


 End IF


 dr.Close()


Catch


 'OleDB Exception will be thrown here 


Finally


 IF dr IsNot Nothing Then


 IF dr.IsClosed = false Then dr.Close()


 End If


End Try



但是,要使用上面的方法,你应该在存储过程中进行一些更改。

替换以下行:


SET @xRef=(SELECT SCOPE_IDENTITY());


--select @xRef=(SELECT SCOPE_IDENTITY());


return @xRef;




SELECT SCOPE_IDENTITY();



在存储过程中不需要这些输出参数之后。

原作者:

使用与 sql client相同的SP ( 无更改) 代替oledb完成任务。 可能是 Bug 。


Using connection As New System.Data.SqlClient.SqlConnection(connectionstrng)


 connection.Open()


 Using command As New System.Data.SqlClient.SqlCommand("sp_Custom_InsertxRef", connection)


 command.CommandType = CommandType.StoredProcedure


 command.Parameters.Add("@DocumentID", SqlDbType.Int, 4, ParameterDirection.Input).Value = epdmParDoc.ID


 command.Parameters.Add("@RevNr", SqlDbType.Int, 4, ParameterDirection.Input).Value = epdmParDoc.GetLocalVersionNo(parFolderId)


 command.Parameters.Add("@xRefDocument", SqlDbType.Int, 4, ParameterDirection.Input).Value = targetReplaceDoc.ID


 command.Parameters.Add("@xRefRevNr", SqlDbType.Int, 4, ParameterDirection.Input).Value = targetReplaceDoc.CurrentVersion


 command.Parameters.Add("@xRefProjectId", SqlDbType.Int, 4, ParameterDirection.Input).Value = parFolderId


 command.Parameters.Add("@RefCount", SqlDbType.Int, 4, ParameterDirection.Input).Value = count


 'command.Parameters.Add("@xRef", OleDbType.Integer, 4, ParameterDirection.InputOutput).Value = -1


 command.Parameters.Add("@xRef", SqlDbType.Int)


 command.Parameters("@xRef").Direction = ParameterDirection.Output


 command.ExecuteReader()


 xRefId = command.Parameters("@xRef").Value


 End Using


 connection.Close()


 End Using



...