SqlDataReader执行错误

3
我试图使用C# MSVS 2008从名为Specializationtbl的表中检索专业ID,该表包括SpecializationName和SpecializationID以及其他一些行,并且我的问题与"无数据可呈现"的某些错误相关。命令如下所示:
SqlCommand READSpecID = new SqlCommand("SELECT * FROM Specializationtbl WHERE SpecializationName='" + comboBox1.Text + "'" , DBcnction);
DBcnction.Open();

SqlDataReader ReadSpecID_ = READSpecID.ExecuteReader();
ReadSpecID_.Read();
int SpecID_ = Convert.ToInt16(ReadSpecID_["SpecID"].ToString());

DBcnction.Close();

我也尝试选择"SpecID"而不是所有行,但似乎无法正确地查询并不断收到“没有数据”错误,你有什么想法我错在哪里了吗?

3个回答

1

1) 在给READSPecID赋值之前尝试打开DBcnction

DBcnction.Open();
SqlCommand READSpecID = new SqlCommand("SELECT * FROM Specializationtbl WHERE     SpecializationName='" + comboBox1.Text + "'" , DBcnction);

2) 在SSMS中运行该命令:

 SELECT * FROM Specializationtbl WHERE SpecializationName ='yourvalue'

并查看是否返回任何结果

3) 检查comboBox1.Text中是否有值

4) 验证comboBox1.Text的内容(或使用参数化查询或存储过程),以确保您不会成为SQL注入的受害者:http://en.wikipedia.org/wiki/SQL_injection


1

重构以解决您的两个问题:

  1. 在构建SQL语句时避免SQL注入问题。
  2. 如果只需要一个值,请使用ExecuteScalar。
  3. 实现“using”块。
 string retVal;        
 using (var conn = new SqlConnection(SomeConnectionString))
 using (var cmd = conn.CreateCommand())
 {
   cmd.CommandText = "SELECT SpecID FROM Specializationtbl WHERE SpecializationName= @Name";
   cmd.Parameters.AddWithValue("@Name", comboBox1.Text);
   conn.Open();
   retVal = cmd.ExecuteScalar().ToString();
}
int specID = int.Parse(retVal);

如果你真的需要从语句中获取多个值:

 using (var conn = new SqlConnection(SomeConnectionString))
 using (var cmd = conn.CreateCommand())
 {
   cmd.CommandText = "SELECT SpecID, Value2 FROM Specializationtbl WHERE SpecializationName= @Name";
   cmd.Parameters.AddWithValue("@Name", comboBox1.Text);
   conn.Open();
   var dr = cmd.ExecuteReader();
   while (dr.Read())
   {
      Customer c = new Customer { 
             ID = dr["SpecID"].ToString(),
             Value = dr["Value2"].ToString(),
       };
   }
}

1

需要先测试是否有任何行。我怀疑查询返回零行。

如果(ReadSpecID_.HasRows) { ReadSpecID_.Read(); }


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接