SqlDataReader执行错误

时间:2012-04-28 13:15:46

标签: c# .net sql sql-server

我试图从名为Specializationtbl的表中检索Specialization ID,使用C#MSVS 2008并且该表包括除了其他一些行之外的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”而不是所有行,但似乎无法正确密封查询并继续接收“无数据存在”错误,任何想法我在哪里犯错?

3 个答案:

答案 0 :(得分: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的内容(或使用paremetrised查询或存储过程)以确保您不会成为SQL注入的受害者:http://en.wikipedia.org/wiki/SQL_injection

答案 1 :(得分:1)

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

  1. 构建SQL语句时出现SQL注入问题。
  2. 如果您只需要一个值,请使用ExecuteScalar。
  3. 实施using块。
  4.  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(),
           };
       }
    }
    

答案 2 :(得分:1)

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

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