检查DataReader中是否存在列的有效方法

时间:2013-10-10 10:19:19

标签: asp.net sql vb.net

有超过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?

2 个答案:

答案 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中重新编码。