sql 命令不适用于 c# 中的 select 语句
sql commnad not working for a select statement in c#
我正在尝试使用 sql 命令执行以下代码以获取输出并将其存储在整数变量中。代码为空值插入返回 -1,这很好。
但是当数据库中有值时 table 并且给出正确的输入时,代码再次返回相同的 -1 值。
有人能给我指出正确的方向吗?
try {
con.Open();
SqlCommand cmd1 = new SqlCommand(@"(Select ERSConversionFactorID FROM " + schemaName + "[ERSConversionFactors] WHERE [ERSConversionFactor_CF] = @conversionvalue AND [ERSConversionFactor_Desc] = @convDescription)", con);
if (comboBox_ConfacValue.Text == "")
{
cmd1.Parameters.Add("@conversionvalue", SqlDbType.NVarChar, 160).Value = DBNull.Value;
}
else
{
cmd1.Parameters.Add("@conversionvalue", SqlDbType.NVarChar, 160).Value = comboBox_ConfacValue.Text;
}
if (combobox_conversionDescription.Text == "")
{
cmd1.Parameters.Add("@convDescription", SqlDbType.NVarChar, 160).Value = DBNull.Value;
}
else
{
cmd1.Parameters.Add("@convDescription", SqlDbType.NVarChar, 160).Value = combobox_conversionDescription.Text;
}
string sql = "Select ERSConversionFactorID FROM " + schemaName + "[ERSConversionFactors] WHERE [ERSConversionFactor_CF] = @conversionvalue AND [ERSConversionFactor_Desc] = @convDescription)";
int conversionvalue = cmd1.ExecuteNonQuery();
}
catch (Exception ex)
{
MessageBox.Show("Error : " + ex.Message);
}
finally
{
con.Close();
}
谢谢
ExecuteNonQuery
不适用于查询中的 return 值。它执行查询,但 return 仅显示受 INSERT、UPDATE 或 DELETE 语句影响的行数。
如果您查看 MSDN 上 ExecuteNonQuery 页面上的备注部分,您会发现 return 值为 -1 的原因。
使用 SELECT 命令,如果您只想通过 SELECT 语句检索第一行的第一列,则可以使用 ExecuteReader 或更好的 ExecuteScalar。
但是,由于您的查询有一个 WHERE 语句可能导致没有检索到任何行,因此您应该在 ExecuteScalar
的 return 值上添加一个空值检查
object result = cmd1.ExecuteScalar();
if(result != null)
{
int conversionvalue = Convert.ToInt32(result);
.....
}
尝试执行标量
int conversionvalue = cmd1.ExecuteScalar();
您需要对单个值使用 ExecuteReader 或 ExecuteScalar。在这种情况下,我会使用 ExecuteReader,因为似乎没有保证总是会返回一行。
int? conversionvalue = null; // this will stay null if there is nothing read back
using(var reader = cmd1.ExecuteReader()) { // place the use of the reader in a using block to ensure it is cleaned up
if(reader.Read()) // reader will return true if a record can be read. if you have multiple records you can turn the if into an while loop
conversionvalue = reader.GetInt32(0); // read the value at ordinal position 0 as an int32
}
我正在尝试使用 sql 命令执行以下代码以获取输出并将其存储在整数变量中。代码为空值插入返回 -1,这很好。
但是当数据库中有值时 table 并且给出正确的输入时,代码再次返回相同的 -1 值。
有人能给我指出正确的方向吗?
try {
con.Open();
SqlCommand cmd1 = new SqlCommand(@"(Select ERSConversionFactorID FROM " + schemaName + "[ERSConversionFactors] WHERE [ERSConversionFactor_CF] = @conversionvalue AND [ERSConversionFactor_Desc] = @convDescription)", con);
if (comboBox_ConfacValue.Text == "")
{
cmd1.Parameters.Add("@conversionvalue", SqlDbType.NVarChar, 160).Value = DBNull.Value;
}
else
{
cmd1.Parameters.Add("@conversionvalue", SqlDbType.NVarChar, 160).Value = comboBox_ConfacValue.Text;
}
if (combobox_conversionDescription.Text == "")
{
cmd1.Parameters.Add("@convDescription", SqlDbType.NVarChar, 160).Value = DBNull.Value;
}
else
{
cmd1.Parameters.Add("@convDescription", SqlDbType.NVarChar, 160).Value = combobox_conversionDescription.Text;
}
string sql = "Select ERSConversionFactorID FROM " + schemaName + "[ERSConversionFactors] WHERE [ERSConversionFactor_CF] = @conversionvalue AND [ERSConversionFactor_Desc] = @convDescription)";
int conversionvalue = cmd1.ExecuteNonQuery();
}
catch (Exception ex)
{
MessageBox.Show("Error : " + ex.Message);
}
finally
{
con.Close();
}
谢谢
ExecuteNonQuery
不适用于查询中的 return 值。它执行查询,但 return 仅显示受 INSERT、UPDATE 或 DELETE 语句影响的行数。
如果您查看 MSDN 上 ExecuteNonQuery 页面上的备注部分,您会发现 return 值为 -1 的原因。
使用 SELECT 命令,如果您只想通过 SELECT 语句检索第一行的第一列,则可以使用 ExecuteReader 或更好的 ExecuteScalar。
但是,由于您的查询有一个 WHERE 语句可能导致没有检索到任何行,因此您应该在 ExecuteScalar
object result = cmd1.ExecuteScalar();
if(result != null)
{
int conversionvalue = Convert.ToInt32(result);
.....
}
尝试执行标量
int conversionvalue = cmd1.ExecuteScalar();
您需要对单个值使用 ExecuteReader 或 ExecuteScalar。在这种情况下,我会使用 ExecuteReader,因为似乎没有保证总是会返回一行。
int? conversionvalue = null; // this will stay null if there is nothing read back
using(var reader = cmd1.ExecuteReader()) { // place the use of the reader in a using block to ensure it is cleaned up
if(reader.Read()) // reader will return true if a record can be read. if you have multiple records you can turn the if into an while loop
conversionvalue = reader.GetInt32(0); // read the value at ordinal position 0 as an int32
}