我试图从名为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”而不是所有行,但似乎无法正确密封查询并继续接收“无数据存在”错误,任何想法我在哪里犯错?
答案 0 :(得分:1)
1)在将值分配给READSPecID
之前尝试打开DBcnctionDBcnction.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)
重构以解决您的两个问题:
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(),
};
}
}
答案 2 :(得分:1)
需要首先测试是否有任何行。我怀疑查询返回零行。
if(ReadSpecID_.HasRows) { ReadSpecID_.Read(); }