【问题标题】:How can i Read data using SqlDataReader [duplicate]我如何使用 SqlDataReader 读取数据 [重复]
【发布时间】:2013-08-02 06:14:17
【问题描述】:

我有一个 SQL Server 2008 数据库,我正在后端处理它。我正在研究 asp.net/C#

using (SqlCommand StrQuer = new SqlCommand("SELECT *  FROM [shopcart].[dbo].[user] WHERE username=@userid AND password=@password", myconn))
{
   StrQuer.Parameters.AddWithValue("@userid", str_usr);
   StrQuer.Parameters.AddWithValue("@password", str_psd);

   SqlDataReader dr = StrQuer.ExecuteReader();

   if (dr.HasRows)
   {
      // MessageBox.Show("loginSuccess");    
   }
}

我知道读者有价值观。我的 SQL 命令是从表中只选择 1 行。我想在阅读器中逐一阅读该行中的项目。我该怎么做?

谢谢

【问题讨论】:

  • 只需使用 dr["columnname"]
  • 这类问题我认为不应该在这里回答,非常基本的东西,第一次搜索就能得到答案

标签: c# asp.net sql-server


【解决方案1】:

您可以使用FieldCount 属性:

if (dr.Read())
{
    for (int i = 0; i < dr.FieldCount; i++)
    {
        var value = dr[i];
        // do something
    }
}
【解决方案2】:

您可以在 while 循环中使用 dr.Read()。像这样:

while(dr.read())
{
    // MessageBox.Show("loginSuccess");    
}

【讨论】:

    【解决方案3】:
    if (dr.HasRows)
    {
        dr["NameOfColumn"].ToString();    
    }
    

    您显然在上面分配了变量并转换为适当的类型。

    在这里也看看我的问题,以获得另一个解决方案Casting Ado.net DataReader to IDataRecord giving strange result

    【讨论】:

      【解决方案4】:

      您可以在 while 循环中使用 dr.Read()。

      while(dr.Read())
      {
          string firstCell = dr[0].ToString();
          string secondCell = dr[1].ToString();
      
          // and so on...
      }
      
      // It will be better if you close DataReader
      dr.Close();
      
      【解决方案5】:

      这是 sqldatareader 的完整示例。

       SqlConnection myConnection = new SqlConnection();  
              myConnection.ConnectionString = WebConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString;  
              SqlCommand myCommand = new SqlCommand();  
              myCommand.CommandType = CommandType.Text;  
              myCommand.CommandText = "SELECT CategoryID, CategoryName FROM Categories";  
              myCommand.Connection = myConnection;  
              SqlDataReader myReader;  
      
              try  
              {  
                  myConnection.Open();  
                  myReader = myCommand.ExecuteReader();  
                  while (myReader.Read())  
                  {  
                      ListItem li = new ListItem();  
                      li.Value = myReader["CategoryID"].ToString();  
                      li.Text = myReader["CategoryName"].ToString();  
                      ListBox1.Items.Add(li);  
                  }  
                  myReader.Close();  
              }  
              catch (Exception err)  
              {  
                  Response.Write("Error: ");  
                  Response.Write(err.ToString());  
              }  
              finally  
              {  
                  myConnection.Close();  
              }  
      

      【讨论】:

      • 这是一个糟糕的例子。这里有不少于 3 个 IDisposable 资源,而你 Dispose 一个也没有。请阅读using 声明的精美手册。
      【解决方案6】:

      把从数据库返回的列名放在“ColumnName”所在的位置。如果是字符串,可以使用 .ToString()。如果是其他类型,则需要使用 System.Convert 进行转换。

      SqlDataReader rdr = cmd.ExecuteReader();
      while (rdr.Read())
      {
      string column = rdr["ColumnName"].ToString();
      int columnValue = Convert.ToInt32(rdr["ColumnName"]);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-01
        相关资源
        最近更新 更多