【问题标题】:custom Object collection to SqlDataReader自定义对象集合到 SqlDataReader
【发布时间】:2015-11-25 12:00:08
【问题描述】:

我正在努力避免在我当前的项目中使用大型对象, 而我希望上传数据集合以填充 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,因为其想法是最小化占用空间。

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

提前致谢

【问题讨论】:

标签: c# sql performance generics sqldatareader


【解决方案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);
        }

【讨论】:

  • GetDataReader() ?列出我没有听说过的扩展程序?
  • 但我认为它使用的是 EntityFramework 对象,而不是我的自定义标准类对象或结构对象
  • 我无法在任何普通对象上实现您当前的代码 List 无法识别 GetDataReader() 你怎么让你的代码工作?
  • @AghilasYakoub 你能解释一下你的答案吗
猜你喜欢
  • 1970-01-01
  • 2014-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-02
  • 2020-05-17
相关资源
最近更新 更多