如何在 C# 中使用 SqlCommand 读取每一行和值?

Posted

技术标签:

【中文标题】如何在 C# 中使用 SqlCommand 读取每一行和值?【英文标题】:How to read each row and value with SqlCommand in C#? 【发布时间】: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 用于不返回结果集的查询。 【参考方案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 造成一些奇怪的副作用。 这解决了问题,非常简单,非常感谢!

以上是关于如何在 C# 中使用 SqlCommand 读取每一行和值?的主要内容,如果未能解决你的问题,请参考以下文章

使用 C# 执行 SQLCommand 时出错

怎样使用C#对数据库的每一行进行读取?

在 SqlCommand 中传递数组参数

使用相同的 SqlConnection 对 SqlCommand.BeginExecuteNonQuery 的多个并发调用

使用参数化的 SqlCommand 是不是使我的程序免受 SQL 注入的影响?

从 SqlCommand 对象发送啥 SQL