我想知道一个查询返回了多少列,以便创建一个该大小的数组来读取结果。
使用SqlDataReader
我想做的事情:
object[] array = new object[rdr.FieldCount];
rdr.GetSqlValues(array);
但我不确定是否应该使用FieldCount
or VisibleFieldCount
。(我什至不确定隐藏字段是什么。但我暂时不讨论。)
我想知道一个查询返回了多少列,以便创建一个该大小的数组来读取结果。
使用SqlDataReader
我想做的事情:
object[] array = new object[rdr.FieldCount];
rdr.GetSqlValues(array);
但我不确定是否应该使用FieldCount
or VisibleFieldCount
。(我什至不确定隐藏字段是什么。但我暂时不讨论。)
这是来自 GetSqlValues() 的反编译代码
public virtual int GetSqlValues(object[] values)
{
SqlStatistics statistics = null;
int num3;
try
{
statistics = SqlStatistics.StartTimer(this.Statistics);
this.CheckDataIsReady();
if (values == null)
{
throw ADP.ArgumentNull("values");
}
this.SetTimeout(this._defaultTimeoutMilliseconds);
int num2 = (values.Length < this._metaData.visibleColumns) ? values.Length : this._metaData.visibleColumns;
for (int i = 0; i < num2; i++)
{
values[this._metaData.indexMap[i]] = this.GetSqlValueInternal(i);
}
num3 = num2;
}
finally
{
SqlStatistics.StopTimer(statistics);
}
return num3;
}
如您所见,该数组已根据 visibleColumns 内部值进行检查。这与 VisibleFieldCount 返回的值相同。
正如您所看到的,代码检查传递的数组的长度并复制一些可以放入传递的数组的列。因为(来自 VisibleFieldCount 上的文档)如果您传递 FieldCount 元素的数组,隐藏字段将附加在内部数组的末尾,您将只检索可见字段。