【问题标题】:How to read each row and value with SqlCommand in C#?如何在 C# 中使用 SqlCommand 读取每一行和值?
【发布时间】:2017-09-30 08:18:11
【问题描述】:

我是使用 C# 的新手,现在正在搞乱 SQL Server 连接。我的连接正常,我可以运行查询,只是无法查看返回的任何数据。我已经看到您需要运行command.ExecuteReader() 才能取回数据,但除了第一列和第一行之外,我无法获取任何其他数据。

这是我的代码:

<%@ WebHandler Language="C#" Class="biquery_query" %>
using System;
using System.Web;
using System.Data;
using System.Data.SqlClient;

public class biquery_query : IHttpHandler {

    public void ProcessRequest (HttpContext context) {
        var query = context.Request.QueryString["query"];
        query = "SELECT * FROM [hidden].[dbo].[hidden]";

        SqlConnection sqlConnection = new SqlConnection(@"Data Source=hidden;Initial Catalog=hidden;User ID=hidden;Password=hidden;");

        // Create Query Command
        SqlCommand command = new SqlCommand();
        command.CommandType = CommandType.Text;
        command.CommandText = query;
        command.Connection = sqlConnection;

        // Open connection and execute query
        sqlConnection.Open();
        command.ExecuteNonQuery();

        using(SqlDataReader rdr = command.ExecuteReader())
        {
            while(rdr.Read())
            {
                string app_id= rdr["app_id"].ToString();
                string app_os= rdr["app_os"].ToString();
                string date= rdr["date"].ToString();
                context.Response.Write(app_id);
            } 
        }

        sqlConnection.Close();
    }

    public bool IsReusable {
        get {
            return false;
        }
    }
}

我的数据库表有 5 列 (app_id, app_os, date, unix, users)。

有没有办法可以选择rdr["app_id"][0] 来获取第一个app_id 或rdr["users"][30]

任何帮助将不胜感激,谢谢!

【问题讨论】:

  • 每次调用rdr.Read() 都会返回一行。每行按列名索引,即rdr["app_id"]
  • @MrZander 为什么它只返回一行呢?我的数据库中有多个。
  • @JoeScotto 在您的代码之外运行 Select 查询,返回多少行?
  • 一个while循环就好了。我只想从我的数据库中获取数据,然后将其放入字典或其他东西中以进一步处理它。不过,现在的主要优先事项是获取它,以便 while 循环不仅输出一行,还应该遍历所有行……我想。
  • 你为什么打电话给ExecuteNonQuery?仅致电ExecuteReaderExecuteNonQuery 用于不返回结果集的查询。

标签: c# asp.net sql-server


【解决方案1】:

使用 SqlDataReader,一切都必须逐行完成 - 顺序访问。 SqlDataReader 的优点是您可以处理一个非常大的记录集,而无需一次将所有数据都保存在内存中。缺点是不能按要求去做。

您的另一种选择是通过 SqlDataAdapter 将整个记录集放入 DataTable 或 DataSet 对象中。这里是sample code from MS

private static DataSet SelectRows(DataSet dataset,
    string connectionString,string queryString) 
{
    using (SqlConnection connection = 
        new SqlConnection(connectionString))
    {
        SqlDataAdapter adapter = new SqlDataAdapter();
        adapter.SelectCommand = new SqlCommand(
            queryString, connection);
        adapter.Fill(dataset);
        return dataset;
    }
}

【讨论】:

    【解决方案2】:

    当您拥有DataReader 时,您可以使用您的column name 读取您的数据。我刚刚读到string,你可以随意convert。请检查:

    public class test
    {
        public string app_id { get; set; }
        public string app_os { get; set; }
        public string date { get; set; }
        public string users { get; set; }
    }
    
    List<test> list = new List<test>();
    using (SqlDataReader rdr = command.ExecuteReader())
    {
        while (rdr.Read())
        {
            test ob = new test();
            ob.app_id = rdr["app_id"].ToString();
            ob.app_os = rdr["app_os"].ToString();
            ob.date = rdr["date"].ToString();
            ob.users = rdr["users"].ToString();
            list.Add(ob);
        }
    }
    

    请检查上面的代码,我创建了一个class 名称test 并将完整数据从DataReader 读取到list。现在您可以使用您的数据进行进一步处理。

    您可以在从Database 读取数据时验证您的数据,请查看以下内容:

    //ob.app_id = rdr["app_id"].ToString();
    // if app_id is string
    ob.app_id = (rdr["app_id"] == DBNull.Value) ? string.Empty : Convert.ToString(rdr["app_id"]);
    // if app_id is int
    ob.app_id = (rdr["app_id"] == DBNull.Value) ? 0 : Convert.ToInt64(rdr["app_id"]);
    

    【讨论】:

    • 只返回我的数据库中的第一个结果。
    • 基本上Op似乎避免了while循环并通过索引获取记录
    • 看看我更新的问题,我包括了整个班级。
    • 请在您的SQL 中使用TOP 1,例如:query = "SELECT TOP 1 * FROM [hidden].[dbo].[hidden]";。它将只返回来自Database 的一条记录。
    • @csharpbd 我不希望它只返回一行,我拥有的 SQL 是正确的并且给了我我想要的。我只想遍历所有结果并输出它们以供进一步处理。
    【解决方案3】:

    ExecuteNonQuery 用于查询不返回结果集(如 INSERT 或 UPDATE)时。

    删除对ExecuteNonQuery 的调用,只使用ExecuteReader

    【讨论】:

    • @katamarayudu 但他事先正在运行ExecuteNonQuery,这可能会对 SqlCommand 造成一些奇怪的副作用。
    • 这解决了问题,非常简单,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    • 1970-01-01
    • 2018-03-07
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多