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

时间:2017-05-02 17:45:10

标签: c# asp.net sql-server

我是使用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]

非常感谢任何帮助,谢谢!

3 个答案:

答案 0 :(得分:2)

当查询不返回结果集(如INSERT或UPDATE)时,将使用

ExecuteNonQuery

移除对ExecuteNonQuery的来电,然后使用ExecuteReader

答案 1 :(得分:1)

如果您有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"]);

答案 2 :(得分:0)

使用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;
    }
}