DataReader 最佳实践

问题描述 投票:0回答:3

类似于这个问题,但答案从来没有真正解决我想知道的问题。从 DataReader 获取值是否有任何标准?即,是这个

dataReader.GetString(dataReader.GetOrdinal("ColumnName"));

认为更好/更差/与此相同?

(string) dataReader["ColumnName"];
datareader
3个回答
11
投票

这是我的做法:

Int32 ordinal = dataReader.GetOrdinal("ColumnName");

if (!dataReader.IsDBNull(ordinal))
    yourString = dataReader.GetString(ordinal);

检查

DBNull
非常重要,就像我上面所示的那样,因为如果
DataReader
中的字段为空,当您尝试检索它时,它会抛出异常。


9
投票

我创建了一些扩展方法,让我将

IDataReader
视为可枚举,并通过返回可空整数等来处理
DbNull
。这让我可以检查 null 并使用 C#
??
运算符应用默认值.

/// <summary>
/// Returns an IEnumerable view of the data reader.
/// WARNING: Does not support readers with multiple result sets.
/// The reader will be closed after the first result set is read.
/// </summary>
public static IEnumerable<IDataRecord> AsEnumerable(this IDataReader reader)
{
    if (reader == null)
        throw new ArgumentNullException("reader");

    using (reader)
    {
        while (reader.Read())
        {
            yield return reader;
        }
    }
}

public static int? GetNullableInt32(this IDataRecord dr, string fieldName)
{
    return GetNullableInt32(dr, dr.GetOrdinal(fieldName));
}

public static int? GetNullableInt32(this IDataRecord dr, int ordinal)
{
    return dr.IsDBNull(ordinal) ? null : (int?)dr.GetInt32(ordinal);
}

...等等关于

GetDataType()
的其他
IDataReader
方法。


0
投票

这是一个扩展类;对我来说效果很好。它处理 int 和 boolean 的空值:

   public static class Utility
        {
            public static string ValidatorDataReaderString(this SqlDataReader pSqlDataReader, string pCampo)
            {
                var wValorReader = pSqlDataReader[pCampo];
                if (wValorReader != null)
                {
                    string wValorRetorno = Convert.ToString(pSqlDataReader[pCampo]);
                    return _ = wValorRetorno == string.Empty ? null : wValorRetorno;
                }
                else
                {
                    return null;
                }
            }
    
            public static int ValidatorDataReaderInt(this SqlDataReader pSqlDataReader, string pCampo)
            {
                var wValorReader = pSqlDataReader[pCampo];
                if (wValorReader != null)
                {
                    bool wValorParse = int.TryParse(Convert.ToString(pSqlDataReader[pCampo]), out int oValorRetorno);
                    return wValorParse ? oValorRetorno : 0;
                }
                else
                {
                    return 0;
                }
            }
    
            public static bool ValidatorDataReaderBool(this SqlDataReader pSqlDataReader, string pCampo)
            {
                if (pSqlDataReader[pCampo] != null)
                {
                    var wValor = Convert.ToString(pSqlDataReader[pCampo]);
    
                    if (wValor == "1" || wValor == "True")
                    {
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
                else
                {
                    return false;
                }
            }
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.