3

我正在尝试使用 C# MSVS 2008 从名为 Specializationtbl 的表中检索专业化 ID,并且该表在其他一些行旁边包括 SpecializationName 和 SpecializationID,我的问题与一些错误“No Data to present”有关,命令如下:

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”而不是所有行,但似乎无法正确密封查询并不断收到“无数据存在”错误,知道我在哪里犯了错误吗?

4

3 回答 3

1

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

if (ReadSpecID_.HasRows) { ReadSpecID_.Read(); }

于 2012-04-28T23:20:13.577 回答
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

于 2012-04-28T13:20:55.503 回答
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(),
       };
   }
}
于 2012-04-28T13:25:02.553 回答