将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并使用它…
您不必使用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。你可以使用你想要的类型。