如何在 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
?仅致电ExecuteReader
。 ExecuteNonQuery
用于不返回结果集的查询。
【参考方案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 读取每一行和值?的主要内容,如果未能解决你的问题,请参考以下文章
使用相同的 SqlConnection 对 SqlCommand.BeginExecuteNonQuery 的多个并发调用