从 SqlDataReader 读取数据

我有一个 SQLServer2008数据库,我正在它的后端工作。我正在开发 asp.net/C #

SqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
//how do I read strings here????
}

我知道读者是有价值的。我的 SQL 命令是从表中只选择1列。该列仅包含字符串。我想一个接一个地读取读取器中的字符串(行)。我该怎么做?

571083 次浏览
string col1Value = rdr["ColumnOneName"].ToString();

或者

string col1Value = rdr[0].ToString();

这些是 object,所以您需要要么铸造它们或 .ToString()

输入从 "ColumnName"所在的数据库返回的列的名称。如果是字符串,则可以使用 .ToString()。如果是另一种类型,则需要使用 System.Convert对其进行转换。

SqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
{
string column = rdr["ColumnName"].ToString();
int columnValue = Convert.ToInt32(rdr["ColumnName"]);
}
using(SqlDataReader rdr = cmd.ExecuteReader())
{
while (rdr.Read())
{
var myString = rdr.GetString(0); //The 0 stands for "the 0'th column", so the first column of the result.
// Do somthing with this rows string, for example to put them in to a list
listDeclaredElsewhere.Add(myString);
}
}

用最简单的术语来说,如果查询返回 column _ name 并且包含一个字符串:

while (rdr.Read())
{
string yourString = rdr.getString("column_name")
}

事实上,我自己发现我可以这么做:

while (rdr.read())
{
string str = rdr.GetValue().ToString().Trim();
}
while(rdr.Read())
{
string col=rdr["colName"].ToString();
}

会成功的

我有一个助手函数,比如:

  public static string GetString(object o)
{
if (o == DBNull.Value)
return "";


return o.ToString();
}

然后我用它来提取字符串:

 tbUserName.Text = GetString(reader["UserName"]);

只有一个结果:

if (reader.Read())
{
Response.Write(reader[0].ToString());
Response.Write(reader[1].ToString());
}

对于多个结果:

while (reader.Read())
{
Response.Write(reader[0].ToString());
Response.Write(reader[1].ToString());
}

我想把我的帮助方法分享给那些可以使用它的人:

public static class Sql
{
public static T Read<T>(DbDataReader DataReader, string FieldName)
{
int FieldIndex;
try { FieldIndex = DataReader.GetOrdinal(FieldName); }
catch { return default(T); }


if (DataReader.IsDBNull(FieldIndex))
{
return default(T);
}
else
{
object readData = DataReader.GetValue(FieldIndex);
if (readData is T)
{
return (T)readData;
}
else
{
try
{
return (T)Convert.ChangeType(readData, typeof(T));
}
catch (InvalidCastException)
{
return default(T);
}
}
}
}
}

用法:

cmd.CommandText = @"SELECT DISTINCT [SoftwareCode00], [MachineID]
FROM [CM_S01].[dbo].[INSTALLED_SOFTWARE_DATA]";
using (SqlDataReader data = cmd.ExecuteReader())
{
while (data.Read())
{
usedBy.Add(
Sql.Read<String>(data, "SoftwareCode00"),
Sql.Read<Int32>(data, "MachineID"));
}
}

如果 helper 方法无法强制转换或数据库值为 NULL,则结果将为空。

我知道这有点老,但是如果您将 SqlDataReader 的内容读入一个类,那么这将非常方便。阅读器和类的列名应该相同

public static List<T> Fill<T>(this SqlDataReader reader) where T : new()
{
List<T> res = new List<T>();
while (reader.Read())
{
T t = new T();
for (int inc = 0; inc < reader.FieldCount; inc++)
{
Type type = t.GetType();
string name = reader.GetName(inc);
PropertyInfo prop = type.GetProperty(name);
if (prop != null)
{
if (name == prop.Name)
{
var value = reader.GetValue(inc);
if (value != DBNull.Value)
{
prop.SetValue(t, Convert.ChangeType(value, prop.PropertyType), null);
}
//prop.SetValue(t, value, null);


}
}
}
res.Add(t);
}
reader.Close();


return res;
}

我认为 反对在这里使用 SqlDataReader; ADO.NET 有 很多的边缘情况和复杂性,在我的经验中,大多数手工编写的 ADO.NET 代码在 至少中是单向破坏的(通常是微妙的和上下文相关的)。

工具的存在就是为了避免这种情况。例如,在本例中,您希望读取一列字符串。衣冠楚楚让这一切变得毫无痛苦:

var region = ... // some filter
var vals = connection.Query<string>(
"select Name from Table where Region=@region", // query
new { region } // parameters
).AsList();

Dapper 在这里处理所有的参量化、执行和行处理——还有很多其他的关于 ADO.NET 的琐碎的细节。<string>可以替换为 <SomeType>,以便将整个行具体化为对象。

我通常是这样通过数据读取器读取数据的。

string connectionString = "Data Source=DESKTOP-2EV7CF4;Initial Catalog=TestDB;User ID=sa;Password=tintin11#";
string queryString = "Select * from EMP";


using (SqlConnection connection = new SqlConnection(connectionString))
using (SqlCommand command = new SqlCommand(queryString, connection))
{
connection.Open();


using (SqlDataReader reader = command.ExecuteReader())
{
if (reader.HasRows)
{
while (reader.Read())
{
Console.WriteLine(String.Format("{0}, {1}", reader[0], reader[1]));
}
}
reader.Close();
}
}

你必须在这里 read database column。你可以看看下面的代码片段

                string connectionString = ConfigurationManager.ConnectionStrings["NameOfYourSqlConnectionString"].ConnectionString;
using (var _connection = new SqlConnection(connectionString))
{
_connection.Open();


using (SqlCommand command = new SqlCommand("SELECT SomeColumnName FROM TableName", _connection))
{


SqlDataReader sqlDataReader = command.ExecuteReader();
if (sqlDataReader.HasRows)
{
while (sqlDataReader.Read())
{
string YourFirstDataBaseTableColumn = sqlDataReader["SomeColumn"].ToString(); // Remember Type Casting is required here it has to be according to database column data type
string YourSecondDataBaseTableColumn = sqlDataReader["SomeColumn"].ToString();
string YourThridDataBaseTableColumn = sqlDataReader["SomeColumn"].ToString();


}
}
sqlDataReader.Close();
}
_connection.Close();