我正在尝试使用sql命令执行以下代码以获取输出并将其存储在整数变量中。对于空值插入,代码返回-1,这很好。
但是当数据库表中有值并且给出适当的输入时,代码再次返回相同的-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();
}
由于
答案 0 :(得分:4)
.post_blog {
border: 1px solid #F1EBEB;
padding-left: 20px;
margin-bottom: 20px;
height: 300px;
width: 40%;
float: left;
margin-left: 40px;
}
.blog_left_side {
float:left;
margin-right: 20px;
}
.wpis_title {
margin-top: 20px;
font-weight: 600;
font-size: 22px;
}
.wpis_title a {
text-decoration:none;
}
article.blog_post {
background-color: #fff;
border: 1px solid #eeeeee;
-webkit-box-shadow: inset 15px 15px 20px 5px rgba(0, 0, 0, .03);
box-shadow: inset 15px 15px 20px 5px rgba(0, 0, 0, .03);
padding:20px;
height:900px;
}
.news_read_more {
text-align: right;
margin-right: 10px;
}
不用于从查询中返回值。它执行查询但它只返回受INSERT,UPDATE或DELETE语句影响的行数。
如果您查看MSDN上ExecuteNonQuery页面上的“备注”部分,您将找到返回值为-1的原因。
如果只想要SELECT语句检索到的第一行的第一列,使用SELECT命令可以使用ExecuteReader或更好的ExecuteScalar。 但是,因为您的查询具有可能导致没有检索到行的WHERE语句,所以您应该在ExecuteScalar的返回值上添加对null的检查
ExecuteNonQuery
答案 1 :(得分:3)
尝试ExecuteScalar
int conversionvalue = cmd1.ExecuteScalar();
答案 2 :(得分:1)
您需要对单个值使用ExecuteReader或ExecuteScalar。在这种情况下,我会使用一个ExecuteReader,因为似乎没有gaurentee总是会返回一行。
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
}