C# 在SQL INSERT命令期间/之后返回标识列的值

C# 在SQL INSERT命令期间/之后返回标识列的值,c#,.net,sql-server,C#,.net,Sql Server,使用VS2010、ASP.NET和.NET3.0以及C 当我使用System.Web.UI.WebControl.SqlDataSource并调用其Insert方法插入新行,并且该表有一个标识列时,我希望我的方法返回该列的值 例如,在我的SQL 2005表中,我有: 客户Id 客户名 Customer.LastName 其中Customer.Id是一个标识栏 当我调用InsertNewCustomerRecord John,Smith方法时,我希望能够返回数据库中自动生成的Customer.Id

使用VS2010、ASP.NET和.NET3.0以及C

当我使用System.Web.UI.WebControl.SqlDataSource并调用其Insert方法插入新行,并且该表有一个标识列时,我希望我的方法返回该列的值

例如,在我的SQL 2005表中,我有:

客户Id 客户名 Customer.LastName 其中Customer.Id是一个标识栏

当我调用InsertNewCustomerRecord John,Smith方法时,我希望能够返回数据库中自动生成的Customer.Id

很抱歉提出了这样一个粗略的问题。让我知道我是否可以添加更好的细节。谢谢。

我宁愿和你一起去

作用域\标识和@@标识返回 最后一个标识值是 在当前数据库中的任何表中生成 一场但是,范围和身份 返回仅在中插入的值 目前的范围@@身份不是 限于特定的范围

请注意@@IDENTITY可能不会返回您期望的结果

例如,有两个表,T1 和T2,插入触发器为 在T1上定义。插入行时 对于T1,触发器触发并插入 第二排。这个场景说明了 两个作用域:T1上的insert和 通过触发器插入T2

假设T1和T2都有 标识列、@@identity和 范围_标识将返回不同的 插入结束时的值 关于T1的声明@@身份意志 返回最后一个标识列值 跨中的任何作用域插入 本届会议。这就是价值 插入T2。范围和身份将 返回插入到中的标识值 T1。这是最后一次插入 发生在同一范围内。这个 SCOPE\u IDENTITY函数将返回 如果函数为空,则为空值 在任何INSERT语句之前调用 在 范围


如果您使用的是SQL Server 2005或更高版本,则可以使用OUTPUT子句在一条语句中执行此操作:


如果您使用的是SQL Server 2000,则应使用SCOPE_IDENTITY,如下所示:

请注意,使用此方法一次只能执行一个Insert,因为我们希望在Insert语句之后立即调用SCOPE_IDENTITY

如果您使用的是SQL Server 2000之前的版本,则要使用@@IDENTITY

问题是,如果表上有触发器,@@Identity会做一些古怪的事情

编辑您在C中询问如何使用此信息。您可以像调用SELECT查询一样使用它:

var connString = ConfigurationManager.ConnectionStrings["MyConnectionStringName"].ConnectionString;
DataTable newData;

using ( var conn = new SqlConnection( connString ) )
{
    conn.Open();
    const string sql = "Insert Foo(Name) Output inserted.Id, inserted.Name Values(@Name)";
    using ( var cmd = new SqlCommand( sql, conn ) )
    {
        cmd.Parameters.AddWithValue("@Name", "bar");
        using ( var da = new SqlDataAdapter( cmd ) )
        {
            da.Fill( newData );
        }
    }
}
这里我假设您的配置文件中有一个用于MyConnectionStringName的ConnectionString条目。此外,为了使用ConfigurationMananager类,您需要添加对System.Configuration的引用。我没有检查这段代码,但它应该非常接近您所需要的。在本例中,我直接编写查询。还有其他解决方案,例如使用数据源控件和设置SelectCommand。

该方法使用属性

因此,将InsertCommand修改为

INSERT Mytable (col1, col2) VALUES (@param1, @parame);SELECT SCOPE_IDENTITY();
或用于SQL Server 2005+

INSERT Mytable (col1, col2) OUTPUT INSERTED.IDCol VALUES (@param1, @param2);

我从哪里开始通过C/ASP.NET调用它?谢谢。我不知道如何将原始的t-SQL转换为可以在ASP.NET web应用程序的.cs页面中使用的内容。你能为我指出正确的方向吗?在ASP.NET页面中,将此转换为C的正确方法是什么?
var connString = ConfigurationManager.ConnectionStrings["MyConnectionStringName"].ConnectionString;
DataTable newData;

using ( var conn = new SqlConnection( connString ) )
{
    conn.Open();
    const string sql = "Insert Foo(Name) Output inserted.Id, inserted.Name Values(@Name)";
    using ( var cmd = new SqlCommand( sql, conn ) )
    {
        cmd.Parameters.AddWithValue("@Name", "bar");
        using ( var da = new SqlDataAdapter( cmd ) )
        {
            da.Fill( newData );
        }
    }
}
INSERT Mytable (col1, col2) VALUES (@param1, @parame);SELECT SCOPE_IDENTITY();
INSERT Mytable (col1, col2) OUTPUT INSERTED.IDCol VALUES (@param1, @param2);