将SQL作用域标识存储在C#变量中

本文关键字:变量 存储 SQL 作用域 标识 | 更新日期: 2023-09-27 18:25:19

我正试图通过SQL命令提取最后一个插入自动生成的RowID(或键),并将其存储为C#变量。

我能做第一部分,但做不到第二部分。。。。

更新:-

Int32 newRowID = 0;
    // -------------------------------------------------------------------- //
    // SQL Query-1: to store validated information in the Enrollment table. //
    // -------------------------------------------------------------------- //
    SqlConnection Connection = new SqlConnection(xxx_DBConnect.SqlServerConnection);
    String strSQL = " OPEN SYMMETRIC KEY zzzzzzzKey DECRYPTION BY CERTIFICATE zzzzzzzCertificate1"
        + " INSERT INTO [xxx].[dbo].[yyy]"
        + " (Type, Name, DBA, Address1, City, State, Zip, TIN, TINLast4, NPI)"
        + " values (@Type, @Name, @DBA, @Address1, @rCity, @State, @Zip, ENCRYPTBYKEY(KEY_GUID('zzzzzzz'),CONVERT(VARCHAR, @TIN)), @TINLast4, @rNPI)"
        + " CLOSE SYMMETRIC KEY zzzzzzzKey;"
        + " SET @RowId = SCOPE_IDENTITY();";
    // Connection is explicitly opened.
    Connection.Open();
    SqlCommand command = new SqlCommand(strSQL, Connection);
    SqlParameter parameter = new SqlParameter();
    parameter.ParameterName = "@RowId";
    parameter.SqlDbType = SqlDbType.Int;
    parameter.Direction = ParameterDirection.Output;
    command.Parameters.Add(parameter);

    command.Parameters.AddWithValue("@Type", _type);
    command.Parameters.AddWithValue("@Name", _Name);
    command.Parameters.AddWithValue("@DBA", _DBA);
    command.Parameters.AddWithValue("@Address1", _address);
    command.Parameters.AddWithValue("@City", _city);
    command.Parameters.AddWithValue("@State", _state);
    command.Parameters.AddWithValue("@Zip", _zip);
    command.Parameters.AddWithValue("@TIN", _tIN);
    command.Parameters.AddWithValue("@TINLast4", _TINlast4);
    command.Parameters.AddWithValue("@NPI", _nPI);
    //newRowID = (Int32)command.ExecuteScalar();// <--- how do I write this in the correct syntax ?? ....
    command.ExecuteNonQuery();

    if (parameter.Value != DBNull.Value)
        {
            newRowID = (int)parameter.Value;
        }

    Connection.Close();

我没有得到错误,但newRowID=0…其中预期结果为130…我假设返回的SQLparamater返回一个"0"

下面的语法有正确的写法吗?

这样我就可以在C#代码中的任何位置访问变量newRowID并使用它…

将SQL作用域标识存储在C#变量中

您不必使用declare @RowId int;。只需将最后一条语句更改为SELECT:

 String strSQL = " OPEN SYMMETRIC KEY zzzzzzzKey DECRYPTION BY CERTIFICATE zzzzzzzCertificate1"
        + " INSERT INTO [xxx].[dbo].[yyy]"
        + " (Type, Name, DBA, Address1, City, State, Zip, TIN, TINLast4, NPI)"
        + " values (@Type, @Name, @DBA, @Address1, @rCity, @State, @Zip, ENCRYPTBYKEY(KEY_GUID('zzzzzzz'),CONVERT(VARCHAR, @TIN)), @TINLast4, @rNPI)"
        + " CLOSE SYMMETRIC KEY zzzzzzzKey;"
        + " SELECT SCOPE_IDENTITY();";

这将使ExecuteScalar()返回值。

更新

为了避免强制转换错误(由于SCOPE_IDENTITY()返回DECIMAL),您可以在两个位置将其强制转换为int

用替换上面查询中的最后一个选择

 SELECT CONVERT(int, SCOPE_IDENTITY());

并且在您的C#代码中使用

int newRowID = (int)command.ExecuteScalar();

添加RowId作为输出参数(配置参数和参数数据类型)。

Scope_Identity返回十进制(38,0)

从sql查询中删除declare statement for @RowId

SqlParameter parameter = new SqlParameter();
parameter.ParameterName = "@RowId";
parameter.SqlDbType = SqlDbType.Decimal; 
parameter.Direction = ParameterDirection.Output;
command.Parameters.Add(parameter);

command.ExecuteNonQuery();
if (parameter.Value!=DbNull.Value)
{
   newRowID = (Int32) parameter.Value;
}

YOu需要向数据库传递一个输出参数,如

SqlParameter sqlParameter = new SqlParameter();
sqlParameter.ParameterName = "@RowId";
sqlParameter.SqlDbType = SqlDbType.Int;
sqlParameter.Direction = ParameterDirection.Output;
command.Parameters.Add(sqlParameter);

然后,您需要从sql 中删除这一行

declare @RowId int;

最后,在执行查询后,您可以获得这样的值

if(sqlParameter.Value != DBNull.Value)
   newRowID  = (Int32)sqlParameter.Value;

编辑:

由于问题中没有提到paramter的返回类型,因此我在这里使用了Int32。你可以使用你想要的类型。