代码之家  ›  专栏  ›  技术社区  ›  kubal5003

C#-范围内的范围#标识

  •  10
  • kubal5003  · 技术社区  · 14 年前

    我查过文件 SCOPE_IDENTITY()

    问题是:那里的范围是什么?在一个连接下执行后续命令是否等同于批处理?或者每个命令都在不同的作用域中,我需要一个事务才能工作?

    2 回复  |  直到 14 年前
        1
  •  7
  •   John Sansom    14 年前

    我建议把C#命令和T-SQL“批处理”看作是完全独立的。

    将SQLCommand看作是您的执行包装器,在这个包装器中,组成批的实际定义由T-SQL语言定义和控制。

    你可能会发现下面的MSDN论坛帖子很有意思。请注意,初始示例如何执行两个单独的SQL命令,但第二个调用的SCOPE IDENITY()可以看到上一个调用的结果。这是因为当前作用域在连接级别可见。

    SQLCommand With Parameters and Scope_Indentity

    [编辑]

    进一步阅读更多好奇的读者,请在下面找到VB.NET代码,该代码提供了在单个连接上执行两个单独命令的示例,第二个命令成功地发出SCOPE_IDENTITY()函数。

    可以从SSIS包任务的脚本组件中执行源代码。您还需要编辑环境的连接详细信息,并创建引用的表对象。

    create table TestTable
    (
        ID int identity(1,1) primary key not null,
        SomeNumericData int not null
    );
    

    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
    
        2
  •  1
  •   RameshVel    14 年前

    我相信scope只适用于单个命令,而不适用于整个连接。

    strSQL = "INSERT INTO tablename (name) VALUES (@name);SELECT SCOPE_IDENTITY()"
    SQLCommand.CommandText = strSQL
    Id = SQLCommand.ExecuteScalar()
    

    在上面的代码中 strSQL语言 是一个完整的作用域,它始终返回关联的insert语句的@@identity值。