-2

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

4

2 回答 2

2

SqlDataReader.GetSchemaTable方法将给出执行查询的数据表,从那里你可以得到所有的列

Returns a DataTable that describes the column metadata.

MSDN http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getschematable.aspx

于 2013-10-10T10:26:05.863 回答
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 中对其进行重新编码。

于 2013-10-10T11:49:45.970 回答