Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多语句SQL事务在null参数处失败_C#_Sql Server_Tsql_Transactions - Fatal编程技术网

C# 多语句SQL事务在null参数处失败

C# 多语句SQL事务在null参数处失败,c#,sql-server,tsql,transactions,C#,Sql Server,Tsql,Transactions,我有一个在SqlTransaction中发生的多语句SQL查询,如下所示: string sName = ""; string sNumber = ""; string sFirstName = ""; string sqlQuery1 = @"INSERT INTO myTable(Name, Number) VALUES (@_Name, @_Number)"; string sqlQuery2 = @"INSERT INTO myOtherTable( ID, FirstName) VA

我有一个在SqlTransaction中发生的多语句SQL查询,如下所示:

string sName = "";
string sNumber = "";
string sFirstName = "";

string sqlQuery1 = @"INSERT INTO myTable(Name, Number) VALUES (@_Name, @_Number)";
string sqlQuery2 = @"INSERT INTO myOtherTable( ID, FirstName) VALUES ( @_ID, @_First )";

SqlConnection conn = new SqlConn(***);
conn.Open();
SqlTransaction transaction;

SqlCommand command1 = new SqlCommand(sqlQuery1, conn, transaction);
SqlCommand command2 = new SqlCommand(sqlQuery2, conn, transaction);

command1.Parameters.Add("@_Name", SqlDbType.NVarChar, 255).Value = sName;
command1.Parameters.Add("@_Number", SqlDbType.NVarChar, 255).Value = sNumber;

int? returnedID = (int?)command1.ExecuteScalar();

command2.Parameters.Add("@_ID", SqlDbType.Int).Value = (int)returnedID;  <--- Error
command2.Parameters.Add("@_First", SqlDbType.NVarChar, 255).Value = sFirstName;

command2.ExecuteNonQuery();

transaction.Commit();
字符串sName=”“;
字符串sNumber=“”;
字符串sFirstName=“”;
字符串sqlQuery1=@“插入myTable(名称、编号)值(@_名称、编号)”;
字符串sqlQuery2=@“插入myOtherTable(ID,FirstName)值(@_ID,@_First)”;
SqlConnection-conn=新的SqlConn(***);
conn.Open();
SqlTransaction;
SqlCommand command1=新的SqlCommand(sqlQuery1,conn,事务);
SqlCommand command2=新的SqlCommand(sqlQuery2,conn,事务);
command1.Parameters.Add(“@_Name”,SqlDbType.NVarChar,255)。Value=sName;
command1.Parameters.Add(“@_Number”,SqlDbType.NVarChar,255)。Value=sNumber;
智力?returneId=(int?)command1.ExecuteScalar();

command2.Parameters.Add(“@_ID”,SqlDbType.Int).Value=(Int)returnedID
ExecuteScalar
返回查询()返回的结果集中第一行的第一列。您的语句是insert,它不返回任何结果集

修复示例的最简单方法是在一个命令中运行所有查询,并使用以获取插入的id

string sqlQuery =
    @"INSERT INTO myTable(Name, Number) VALUES (@_Name, @_Number);
      INSERT INTO myOtherTable( ID, FirstName) VALUES ( SCOPE_IDENTITY(), @_First )";

ExecuteScalar
返回查询()返回的结果集中第一行的第一列。您的语句是insert,它不返回任何结果集

修复示例的最简单方法是在一个命令中运行所有查询,并使用以获取插入的id

string sqlQuery =
    @"INSERT INTO myTable(Name, Number) VALUES (@_Name, @_Number);
      INSERT INTO myOtherTable( ID, FirstName) VALUES ( SCOPE_IDENTITY(), @_First )";

由于
insert
语句不返回值,
ExecuteScalar()
无法根据需要返回标识。您可以将
insert
select scope\u identity()
组合在一起,就像
ExecuteScalar()
文档中的那样,以获得我认为您期望的功能。

由于
insert
语句不返回值,因此
ExecuteScalar()
无法返回您想要的标识。您可以将
insert
select scope\u identity()
结合起来,就像
ExecuteScalar()
文档中的那样,以获得我认为您期望的功能。

您似乎假设
insert-INTO-myTable(Name,Number)值(@\u-Name,@\u-Number)
将返回插入行的ID;你为什么这么想?假设是不正确的,这就是为什么从ExecuteScalar返回空值的原因


如果命令的结果集为空,并且语句的结果集实际上为空,则返回null,除非包含子句。

您似乎假定
INSERT-INTO-myTable(Name,Number)值(@\u-Name,@\u-Number)
将返回插入行的ID;你为什么这么想?假设是不正确的,这就是为什么从ExecuteScalar返回空值的原因


如果命令的结果集为空,并且语句的结果集实际上为空,则返回null,除非您包含子句。

如果您使用的是SQLTransaction对象,我建议将代码包装在try{}catch中,在异常代码中您将需要事务。RollBack();如果该事务失败..首先..您使用的是SQLTransaction对象,我建议将代码包装在try{}catch中,在异常代码中您将需要一个事务。RollBack();如果该事务失败..首先..@IDENTITY不应使用,请改用scope_IDENTITY()。@paritosh,你说得对,@@IDENTITY可以检索插入不同作用域的id,我将修复我的答案。谢谢,当然,我忘记了所有关于添加Scope_Identity()的事情。谢谢@@不应使用标识,请改用scope_IDENTITY()。@paritosh,你说得对,@@IDENTITY可以检索插入其他作用域的标识,我将修复我的答案。谢谢,当然,我忘记了所有关于添加Scope_Identity()的事情。谢谢