如何通过列名使用SqlDataReader.GetValue获取数据

50
我使用SqlDataReader.GetValue方法从数据库中读取值:
Log.WriteLine("Value of CompanyName column:" + thisReader.GetValue(1)); 

作为参数,GetValue获取列的索引。我应如何指定列名而不是索引?

3个回答

91
Log.WriteLine("Value of CompanyName column:" + thisReader["CompanyName"]); 

6
我使用以下解决方法 - Log.WriteLine("CompanyName列的值:" + thisReader.GetValue(thisReader.GetOrdinal("CompanyName")));方括号 [] 代表什么? - algot
@algot 这是一个索引属性,请参见 http://msdn.microsoft.com/zh-CN/library/aa288464.aspx 或 http://msdn.microsoft.com/zh-CN/library/2549tw02.aspx。 - Mauricio Scheffer
1
我不理解语法“thisReader["CompanyName"]”。这根本不合逻辑。逻辑应该是“thisReader.fields("CompanyName").value”。但我又有什么资格评判呢… - tmighty
5
这是一种常见的用于索引集合的符号表示法,不仅在C#中使用。索引通常是整数,但也可以是其他类型,比如字符串。 - Rob
2
自己注意,内部执行 return GetValue(GetOrdinal(name)); 参考 https://referencesource.microsoft.com/#system.data/system/data/sqlclient/SqlDataReader.cs - Mark Schultheiss
@algot 谢谢,当使用像 GetInt32 这样的转换方法时,这种方法非常有用。 - Brian Lacy

55

你也可以这样做。

//find the index of the CompanyName column
int columnIndex = thisReader.GetOrdinal("CompanyName"); 
//Get the value of the column. Will throw if the value is null.
string companyName = thisReader.GetString(columnIndex);

我在思考在哪种情况下,这种方式比直接从读取器中读取数据更有益处,例如thisReader["CompanyName"]。你能否给出任何具体的案例呢? 顺便说一句,非常感谢。 - curiousBoy
2
@curiousBoy 以这种方式做将更容易检查列是否存在,并确保所选值处于正确的数据格式,例如 GetString、GetInt32 等,它不仅仅返回一个对象,而是需要强制转换。这就是为什么我会使用这种方法的原因。 - David Molyneux
@DavidMolyneux 感谢您的评论,根据您的解释,它基本上是对字符串执行“null检查”,并在值为空时抛出错误。这也让我想到这只是针对字符串类型的。除此之外,例如:"int productQuantiy = thisReader["ProductQuantity"] " 如果ProductQuantity没有有效的int值,它会抛出一个错误,不是吗?再次感谢。 - curiousBoy
1
@curiousBoy 'int productQuantity = thisReader["ProductQuantity"]' 不会起作用,编译器不允许你将一个对象分配给一个整数,你必须先解析/转换对象。 - David Molyneux
@DavidMolyneux 请假设我已经使用了 "int productQuantiy = Convert.ToInt32(thisReader["ProductQuantity"] )"。如果ProductQuantity没有有效的可转换值,那么这将抛出一个错误,对吗?我只是想看看如何通过使用它而不是直接从读取器中读取值来获得更多好处?(对于字符串,正如您所提到的,它会抛出一个错误,但对于整数呢?)谢谢 - curiousBoy
2
出于性能考虑,微软现在建议您在读取循环之外调用GetOrdinal,并仅在循环内调用GetString(int)。 - Guy Schalnat

-4

thisReader.GetString(int columnIndex)

这个读取器.GetString(列索引)


请添加一些解释,说明这个答案实际上是如何解决问题的。 - ekad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接