如何在SqlDataReader中使用Generic

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在SqlDataReader中使用Generic相关的知识,希望对你有一定的参考价值。

我试图想出一种方法,只是将SQL Server中的表加载到一个类中,而不必告诉它任何东西。基本上,只需创建类并让它知道要加载什么,基于此。这是我到目前为止所拥有的。

我的问题是,是否有一些方法可以避免硬编码类型,调用reader.readString,reader。 readInt32等。基于FieldType?

 private Int32? readInt32(SqlDataReader reader, string columnName)
    {
        Int32? result = null;


        if (!reader.IsDBNull(reader.GetOrdinal(columnName)))
        {
            result = reader.GetInt32(reader.GetOrdinal(columnName));
        };

        return result;
    }

  public List<T> readTable(string table, string wherecls, string connStr)
    {
        List<T> result = new List<T>();
        using (SqlConnection connection = new SqlConnection(connStr))
        {
            using (SqlCommand command = connection.CreateCommand())
            {
                command.CommandText = "select * from " + table;
                if (wherecls.Length > 0) command.CommandText += " where " + wherecls;
                connection.Open();
                using (var reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        Object i = Activator.CreateInstance(typeof(T));

                        System.Reflection.FieldInfo[] fieldInfoList = typeof(T).GetFields();
                        foreach (System.Reflection.FieldInfo f in fieldInfoList)
                        {
                            if (f.FieldType == typeof(string)) f.SetValue(i, readString(reader, f.Name));
                            if (f.FieldType == typeof(Int32)) f.SetValue(i, readInt32(reader, f.Name));
                            if (f.FieldType == typeof(Int16)) f.SetValue(i, readInt16(reader, f.Name));
                            if (f.FieldType == typeof(byte)) f.SetValue(i, readByte(reader, f.Name));
                            if (f.FieldType == typeof(short)) f.SetValue(i, readShort(reader, f.Name));
                        }
                        result.Add((T)i);
                    }
                }
            }
        }
        return result;
    }

谢谢Dan Chase

答案

你所描述的是很多工作......而且正是像“小精灵”这样的工具已经做了。所以我的建议在这里:使用小巧玲珑:

// Dapper adds a Query<T>(this DbConnection, ...) extension method
var data = connection.Query<T>(sql, args).AsList();

然而,我会说string wherecls让我的脊椎颤抖 - 这听起来像是一个SQL注入的噩梦。但是......这取决于你。

以上是关于如何在SqlDataReader中使用Generic的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中使用 SqlDataReader 获取行数

如何在SqlDataReader中使用Generic

如何使用 SqlDataReader 获取位值并将其转换为布尔值?

如果值为空,如何将值返回给 sqldatareader?

如何使 SqlDataReader.ReadAsync() 异步运行?

如何使 SqlDataReader.ReadAsync() 异步运行?