коллекция настраиваемых объектов для SqlDataReader

Я пытаюсь избегать использования больших объектов в моем текущем проекте, в то время как я хочу загружать коллекции данных для заполнения таблицы SQL Server.

Я планирую использовать SqlBulkCopy (альтернативой может быть Sproc с параметром значения таблицы, но это не является предметом моего текущего вопроса)

поскольку метод принимает либо DataTable, либо SqlDataReader

Мне было интересно, могу ли я сделать что-то вроде:

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
  • ** добавление еще одного класса для реализации было бы нормально, но не целую DLL со 100К строками, так как идея состоит в том, чтобы минимизировать занимаемое пространство.

цель заключалась в том, чтобы минимизировать накладные расходы и снижение производительности.

заранее спасибо


person Jbob Johan    schedule 25.11.2015    source источник
comment
Да, это может быть сделано. Возможно, это дубликат stackoverflow.com/q/2258310/1048425, но недостаточно, чтобы закрыть вопрос. Другой пример класса-оболочки, который предоставляет IEnumarable как IDataReader, можно найти здесь code.msdn.microsoft.com / ObjectDataReader-8476dd72,   -  person GarethD    schedule 25.11.2015


Ответы (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);
        }
person Aghilas Yakoub    schedule 25.11.2015
comment
GetDataReader()? list Extension, о котором я не слышал? - person Jbob Johan; 25.11.2015
comment
Я нашел кое-что в Google: csvreader.com/posts/GenericListDataReader.cs, найденный на csvreader.com/posts/generic_list_datareader.php - person Jbob Johan; 25.11.2015
comment
но я думаю, что он использует EntityFramework Objects, а не мой собственный объект стандартного класса или объект структуры - person Jbob Johan; 25.11.2015
comment
Мне не удалось реализовать ваш текущий код на любом простом объекте. Список ‹T› не распознает GetDataReader() как получилось, что ваш код работает? - person Jbob Johan; 25.11.2015
comment
@AghilasYakoub не могли бы вы объяснить свой ответ - person Avia Afer; 25.11.2015