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);
}
}
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;
}
var region = ... // some filter
var vals = connection.Query<string>(
"select Name from Table where Region=@region", // query
new { region } // parameters
).AsList();
12 回答
将
"ColumnName"
所在的数据库中返回的列的名称设置为 . 如果是字符串,则可以使用.ToString()
. 如果是另一种类型,则需要使用System.Convert
进行转换 .我通常以这种方式通过数据读取器读取数据 . 刚刚添加了一个小例子 .
想为那些可以使用它的人分享我的帮助方法:
用法:
helper方法转换为您喜欢的任何值,如果它无法转换或数据库值为NULL,则结果为null .
实际上,我自己想通了我能做到这一点:
我知道这有点旧,但如果你正在将SqlDataReader的内容读入类中,那么这将非常方便 . 读者和类的列名应该相同
我想反对在这里使用
SqlDataReader
; ADO.NET有许多边缘情况和复杂性,根据我的经验,大多数手动编写的ADO.NET代码至少在一种方式中被破坏(通常是微妙的和上下文的) .存在避免这种情况的工具 . 例如,在这种情况下,您想要读取一列字符串 . Dapper使这完全无痛:
这里的Dapper正在处理所有参数化,执行和行处理 - 以及ADO.NET的许多其他蹩脚细节 . 可以使用
<SomeType>
替换<string>
以将整行实现为对象 .简单来说,如果您的查询返回column_name并且它包含一个字符串:
我有一个帮助函数,如:
然后我用它来提取字符串:
对于单个结果:
对于多个结果:
要么
这些是
object
s,因此您需要投射它们或.ToString()
.它会工作