0

我正在尝试通过 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 并使用它......

4

3 回答 3

1

您需要像这样将输出参数传递给数据库

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;

编辑:

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

于 2013-07-29T18:10:16.150 回答
1

你不必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();
于 2013-07-29T18:13:44.767 回答
1

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

Scope_Identity 返回十进制(38,0)

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

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;
}
于 2013-07-29T18:04:37.610 回答