有超过50列的表,我使用以下代码循环访问dataReader以存在列。
If HasColumn(reader, "EmpCode") Then obj.OwningOfficeID = CType(reader("EmpCode"), Int32)
Protected Function HasColumn(ByRef reader As SqlDataReader, ByVal columnName As String) As Boolean
For i As Integer = 0 To reader.FieldCount - 1
If reader.GetName(i).Equals(columnName) Then
Return Not IsDBNull(reader(columnName))
End If
Next
Return False
End Function
我想知道在每次绑定对象属性时是否有更好的方法来检查DataReader中的列而不是循环遍历DataReader?
答案 0 :(得分:2)
SqlDataReader.GetSchemaTable
方法将给出已执行查询的DataTable,从那里可以获得所有列
Returns a DataTable that describes the column metadata.
MSDN http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getschematable.aspx
答案 1 :(得分:2)
目前我正在为此目的使用此扩展方法
public static bool TryGetOrdinal(this IDataRecord dr, string column, out int ordinal)
{
try
{
ordinal = dr.GetOrdinal(column);
}
catch(Exception ex)
{
ordinal = -1; //Just setting a value that GetOrdinal doesn't return
return false;
}
return true;
}
所以你按照以下方式使用它
int ordinal = 0;
if(dr.TryGetOrdinal("column",out ordinal))
string val = dr.GetValue(ordinal).ToString();
我的VB不太好。抱歉,无法将它转换为VB。但我认为你得到了基本的想法,可以在VB中重新编码。