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

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...