2015-11-25 3 views
1

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

Я планирую 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

вопрос будет это могло быть сделано каким-то образом?

Update

public struct tblCarOb 
{ 
    public String Model; 
    public Int32 Year; 
} 
  • идея проста получения какой-либо объект, созданный как код выше
  • без использования EntityFrameWork
  • в моем случае мне не нужно сбросить/создать таблицу SQL Server
  • в моем случае Объект таблицы C#, который я создаю, имеет соответствующую таблицу в SQL Server
  • Я предпочитаю не использовать отражение, как я делаю с DataTable
  • ** добавление другого класса для реализации было бы неплохо, но не вся DLL со 100-килограммовыми линиями, так как идея состоит в том, чтобы свести к минимуму след.

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

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

+0

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

ответ

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); 
     } 
+2

'GetDataReader()'? список Расширение, о котором я не слышал? –

+1

Я нашел что-то в google: http://www.csvreader.com/posts/GenericListDataReader.cs нашел на http://www.csvreader.com/posts/generic_list_datareader.php –

+0

, но я думаю, что он использует объекты EntityFramework и не мой пользовательский объект стандартного класса или объект структуры –

Смежные вопросы