自定义对象集合到SqlDataReader

时间:2015-11-25 12:00:09

标签: c# sql performance generics sqldatareader

我试图避免在我当前的项目中使用大型对象, 我希望上传数据集合以填充SQL Server表

我正在计划使用SqlBulkCopy(替代也可以是带有表值参数的Sproc,但这不是我当前问题的范围)

因为该方法接受DataTableSqlDataReader

我想知道我是否可以做类似的事情:

public struct tblCarOb
{
    public String Model;
    public Int32 Year;
}

因为我更喜欢类对象的结构,所以它可以是一个类。

List<tblCarOb> tcoLst = new List<tblCarOb>(){ new tblCarObj(){ Model = "A", Year= 2010 }};
using (sqlConnection ...)
{
    use Reader to read form tcoLst or tblCarOb[]

}

所以我可以避免使用更复杂的DataTable

问题是可以以某种方式完成吗?

更新

public struct tblCarOb
{
    public String Model;
    public Int32 Year;
}
  • 这个想法很容易将任何对象创建为上面的代码
  • 不使用EntityFrameWork
  • 在我的情况下,我不需要删除/创建SQL Server表
  • 就我而言我创建的C#表对象在SQL Server中有一个对应的表
  • 我不喜欢像DataTable
  • 那样使用反射
  • **添加另一个类来实现它可以,但不是一个100K行的整个DLL,因为这个想法是最小化占用空间。

目的是尽量减少开销和性能损失。

提前致谢

1 个答案:

答案 0 :(得分:1)

我建议你这个代码

        using (IDataReader reader = tcoLst.GetDataReader())
        using (SqlConnection conn = new SqlConnection(....))
        using (SqlBulkCopy bcp = new SqlBulkCopy(conn))
        {
            conn.Open();

            //-->>>>>>>define this value
            bcp.DestinationTableName = "YourTableName";

            string createTableSql = string.Empty;

            createTableSql += string.Format("IF EXISTS(SELECT * FROM sys.tables t WHERE t.name =  {0}) DROP TABLE {0};", bcp.DestinationTableName);
            createTableSql += string.Format("CREATE TABLE dbo.{0};",bcp.DestinationTableName);

            for (int column = 0; column < reader.FieldCount; column++)
            {
                if (column > 0)
                {
                    createTableSql += ",";
                }

                createTableSql += "[" + reader.GetName(column) + "]" + " VARCHAR(MAX) NULL";
            }

            createTableSql += ");";

            using (SqlCommand createTable = new SqlCommand(createTableSql, conn))
            {
                createTable.ExecuteNonQuery();
            }

            bcp.WriteToServer(reader);
        }