读取ID值始终为0

问题描述 投票:0回答:2

我有一个数据库,我想从中读取特定值。

当我阅读时

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;
    }
}
c# sql-server asp.net-mvc
2个回答
1
投票

如果没有有关您的具体问题的更多信息,很难回答您的问题,但我认为这一行的真正问题是:

rdr.Read();

SqlDataReader.Read
方法将您的数据读取器前进到下一个记录,这意味着您正在使用您的
读取
下一个行的rdr["Approved"]

if (Convert.ToInt32(rdr["Approved"]) == 1)

代码看起来很奇怪,我认为这不是你想要的。您可以考虑删除它。

我还有一些建议;

  • 不要将连接字符串直接放入代码中。这些设置可以不时更改。放入一些配置文件或从一些设置文件中读取它。
  • 在使用连接对象之前打开它。没什么大不了的,但这是一个很好的做法。
  • 不要
  • 使用AddWithValue方法。
    它有时
    可能会产生意想不到的结果。使用 Add 方法代替(最好是
    Add(String, SqlDbType, Int32)
    重载
    
        
假设您的查询为您提供了您想要的内容,为了能够使用通过

0
投票
读取的数据,您需要使用

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 }


© www.soinside.com 2019 - 2024. All rights reserved.