我有一个数据库,我想从中读取特定值。
当我阅读时
ID
总是显示为0。
public void ClustersStatus(Clusters cl)
{
using (SqlConnection con = new SqlConnection("Data Source=DESKTOP-JMGPJ6J;Initial Catalog=Infinity;Integrated Security=True"))
{
using (SqlCommand cmd = new SqlCommand("Select Approved from Master_Cluster where ClusterID = @id", con))
{
con.Open();
cmd.Parameters.AddWithValue("@id", cl.ClusterID);
cmd.Connection = con;
SqlDataReader rdr = cmd.ExecuteReader();
if (rdr.HasRows)
{
rdr.Read();
if (Convert.ToInt32(rdr["Approved"]) == 1)
{
}
else
{
}
}
}
// return cl;
}
}
如果没有有关您的具体问题的更多信息,很难回答您的问题,但我认为这一行的真正问题是:
rdr.Read();
SqlDataReader.Read
方法将您的数据读取器前进到下一个记录,这意味着您正在使用您的读取下一个行的
rdr["Approved"]
列
if (Convert.ToInt32(rdr["Approved"]) == 1)
代码看起来很奇怪,我认为这不是你想要的。您可以考虑删除它。
我还有一些建议;
AddWithValue
方法。 它有时可能会产生意想不到的结果。使用
Add
方法代替(最好是 Add(String, SqlDbType, Int32)
重载)
IDataRecord
接口。您不能直接使用
rdr
变量。
为了方便使用,我将阅读引擎写成了一个函数。我在这里写下这个想法,供您根据自己的需求进行调整:
private static int ReadSingleRow(IDataRecord record)
{
//below is an example of processing using `record`. You adapt it to your needs
int.TryParse(record[0].ToString(), out int temp);
MessageBox.Show (temp.ToString());
//...do the processing you need
return temp;
}
写完函数之后,main就变成了:
if (rdr.HasRows)
{
while (rdr.Read());
int x=ReadSingleRow((IDataRecord) rdr);
//or use, somehow, the above function
// other processing
}