输出子句 returns value 但在 c# 中执行标量 returns null
output clause returns value but executescalar returns null in c#
我需要获取更新行的第一列值。但是当我 运行 查询 Update ClaimDetails set sStatus='False' OUTPUT inserted.slno as Slno where inVoiceNo='******' and sStatus='True'
在 Management Studio 中它 returns 正确的值。但是当我尝试使用 Executescalar()
获取值时,它 returns null
我的代码:
bool isupdated = false;
int modified=0;
try
{
string updateqry = "Update ClaimDetails set sStatus=@sStatus OUTPUT inserted.slno as Slno where inVoiceNo=@inVoiceNo and sStatus='True'";
SqlCommand cmd = new SqlCommand(updateqry, con);
cmd.Parameters.AddWithValue("@sStatus", sStatus);
cmd.Parameters.AddWithValue("@inVoiceNo", inVoiceNo);
connect();
if (cmd.ExecuteNonQuery() > 0)
{
isupdated = true;
//modified = (int)cmd.ExecuteScalar();
object a = cmd.ExecuteScalar();
if (a != null)
modified = Convert.ToInt32(a);
}
}
catch (Exception ex) { MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); }
finally { disconnect(); }
return modified;
当我使用 modified = (int)cmd.ExecuteScalar();
时出现异常错误,所以我使用 object
唯一一次 ExecuteScalar
returns null
是 没有返回行 。如果返回一行并且值 是 null
,则返回 DbNull.Value
。
所以:没有匹配的行。检查 @inVoiceNo
是什么,以及它是否存在于您 运行 反对的 table 中。混淆的常见原因:
- 数据库区分大小写
- unicode 与 ascii/code-page 值
- char 与 varchar,nchar 与 nvarchar
- 运行对错数据
代码执行相同的 UPDATE
命令两次,一次使用 ExecuteNonQuery(丢弃标量结果和 returns 受影响的行数),另一次使用 ExecuteScalar。由于 WHERE
子句中的硬编码 'True',当提供的 sStatus
值为 'False' 时,第二次调用同一命令将永远不会更新行。在这种情况下,标量结果将始终为 null
。
我认为您可以重构如下代码以获得所需的结果。
object a = cmd.ExecuteScalar();
if (a != null)
{
isupdated = true;
modified = Convert.ToInt32(a);
}
万一有人想要更新时的实际记录数而不仅仅是处理空值,
在存储过程中,我们的数据库开发人员设置 return @@ROWCOUNT [打字错误] 而不是 SELECT @@ROWCOUNT
我需要获取更新行的第一列值。但是当我 运行 查询 Update ClaimDetails set sStatus='False' OUTPUT inserted.slno as Slno where inVoiceNo='******' and sStatus='True'
在 Management Studio 中它 returns 正确的值。但是当我尝试使用 Executescalar()
获取值时,它 returns null
我的代码:
bool isupdated = false;
int modified=0;
try
{
string updateqry = "Update ClaimDetails set sStatus=@sStatus OUTPUT inserted.slno as Slno where inVoiceNo=@inVoiceNo and sStatus='True'";
SqlCommand cmd = new SqlCommand(updateqry, con);
cmd.Parameters.AddWithValue("@sStatus", sStatus);
cmd.Parameters.AddWithValue("@inVoiceNo", inVoiceNo);
connect();
if (cmd.ExecuteNonQuery() > 0)
{
isupdated = true;
//modified = (int)cmd.ExecuteScalar();
object a = cmd.ExecuteScalar();
if (a != null)
modified = Convert.ToInt32(a);
}
}
catch (Exception ex) { MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); }
finally { disconnect(); }
return modified;
当我使用 modified = (int)cmd.ExecuteScalar();
时出现异常错误,所以我使用 object
唯一一次 ExecuteScalar
returns null
是 没有返回行 。如果返回一行并且值 是 null
,则返回 DbNull.Value
。
所以:没有匹配的行。检查 @inVoiceNo
是什么,以及它是否存在于您 运行 反对的 table 中。混淆的常见原因:
- 数据库区分大小写
- unicode 与 ascii/code-page 值
- char 与 varchar,nchar 与 nvarchar
- 运行对错数据
代码执行相同的 UPDATE
命令两次,一次使用 ExecuteNonQuery(丢弃标量结果和 returns 受影响的行数),另一次使用 ExecuteScalar。由于 WHERE
子句中的硬编码 'True',当提供的 sStatus
值为 'False' 时,第二次调用同一命令将永远不会更新行。在这种情况下,标量结果将始终为 null
。
我认为您可以重构如下代码以获得所需的结果。
object a = cmd.ExecuteScalar();
if (a != null)
{
isupdated = true;
modified = Convert.ToInt32(a);
}
万一有人想要更新时的实际记录数而不仅仅是处理空值, 在存储过程中,我们的数据库开发人员设置 return @@ROWCOUNT [打字错误] 而不是 SELECT @@ROWCOUNT