C#范围内的SCOPE_IDENTITY
我检查了
SCOPE_IDENTITY()的文档,它说“范围是模块:存储过程,触发器,功能或批处理”.当我在SSMSE中运行查询时,这很简单,但是在C#中,我使用SqlCommand来执行我的语句.
问题是:这里有什么范围?在一个连接下执行后续命令相当于批次?或者也许每个命令都在不同的范围内,我需要一个交易才能工作? 解决方法
我建议您将C#命令和T-SQL“批次”视为彼此完全分开.
将SQLCommand视为执行包装器,其中构成批处理的实际定义由T-SQL语言定义和控制. 会话范围维护在Connection对象级别. 你可能会发现以下MSDN论坛发表有趣的阅读.注意初始示例如何执行两个单独的SQL命令,但第二个调用的SCOPE_IDENITY()可以看到上次调用的结果.这是因为当前范围在连接级别可见. SQLCommand With Parameters and Scope_Indentity 为了说明的完整性,使用参数不起作用的原因(如下面在链接示例中演示的)是因为sp_executesql在其自己的范围内执行,因此无法看到连接的范围. [编辑] 进一步阅读更好看的读者,请查找下面的VB.NET代码,其中提供了在单个连接上执行两个单独命令的示例,第二个命令成功发出SCOPE_IDENTITY()函数. 源代码可以从SSIS包任务的SCRIPT组件中执行.您还需要编辑环境的连接详细信息,并创建引用的表对象. 创建表脚本: create table TestTable ( ID int identity(1,1) primary key not null,SomeNumericData int not null ); VB.NET源代码列表: Imports System Imports System.Data Imports System.Math Imports Microsoft.SqlServer.Dts.Runtime Imports System.Data.SqlClient.SqlConnection Imports Windows.Forms.MessageBox Public Class ScriptMain Public Sub Main() ' ' Add your code here Dim oCnn As New Data.SqlClient.SqlConnection Dim sSQL As String Dim sSQL2 As String Dim resultOne As Integer Dim resultTwo As Integer Dim messageBox As Windows.Forms.MessageBox resultOne = 0 resultTwo = 0 oCnn.ConnectionString = "Server=ServerName;Database=DatabaseName;Trusted_Connection=true" sSQL = "INSERT INTO TestTable(SomeNumericData) VALUES(666) " sSQL2 = "SELECT SCOPE_IDENTITY()" Dim oCmd As SqlClient.SqlCommand = New SqlClient.SqlCommand(sSQL,oCnn) Dim oCmd2 As SqlClient.SqlCommand = New SqlClient.SqlCommand(sSQL2,oCnn) oCmd.CommandType = CommandType.Text oCmd.Connection = oCnn oCnn.Open() resultOne = oCmd.ExecuteNonQuery() resultTwo = Convert.ToInt32(oCmd2.ExecuteScalar()) oCnn.Close() messageBox.Show("result1:" + resultOne.ToString + Environment.NewLine + "result2: " + resultTwo.ToString) Dts.TaskResult = Dts.Results.Success End Sub End Class (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |