2012-02-10 3 views
2

У меня есть запрос L2S который выглядит следующим образом:преобразования LINQ к SQL для хранимой процедуры для массовой вставки

using (MyDC TheDC = new MyDC()) 
{ 
    foreach (MyObject TheObject in TheListOfMyObjects) 
    { 
     DBTable TheTable = new DBTable(); 

     TheTable.Prop1 = TheObject.Prop1; 
     TheTable.Prop2 = TheObject.Prop2; 
     // only 2 properties, an int and a string 

     TheDC.DBTables.InsertOnSubmit(TheTable); 
    } 
    TheDC.SubmitChanges(); 
} 

Как я могу изменить это в хранимую процедуру, которая делает объемную вставку списка? Я нашел это article, который говорит об использовании классов данных и классов sqlbulkcopy; это лучший способ сделать это?

Благодарим вас за ваши предложения и отзывы.

ответ

1

Может быть что-то вроде этого:

void Main() 
{ 
    //Your list of objects 
    List<MyObject> TheListOfMyObjects=new List<MyObject>(); 

    var dt=new DataTable(); 
    dt.Columns.Add("Prop1",typeof(int)); 
    dt.Columns.Add("Prop2",typeof(string)); 
    foreach (var TheObject in TheListOfMyObjects) 
    { 
     dt.Rows.Add(TheObject.Prop1,TheObject.Prop2); 
    } 
    InsertWithBulk(dt,"YourConnnectionString","MyObject"); 
} 
private void InsertWithBulk(DataTable dt,string connectionString,string tableName) 
{ 
    using (SqlConnection destinationConnection =new SqlConnection(connectionString)) 
    { 
     destinationConnection.Open(); 
     using (SqlBulkCopy bulkCopy = new SqlBulkCopy(destinationConnection)) 
     { 
      bulkCopy.DestinationTableName =tableName; 

      try 
      { 
       bulkCopy.WriteToServer(dt); 
      } 
      catch (Exception ex) 
      { 
       //Exception from the bulk copy 
      } 
     } 
    } 
} 
0

Выглядит хорошо для меня.

Честно говоря, я бы полностью отбросил L2S из-за его ужасной производительности, но у вас может быть приложение, которое слишком далеко, чтобы это сделать.

0

Лучший вариант - не использовать InsertOnSubmit в вашем цикле. Попробуйте следующее.

using (MyDC TheDC = new MyDC()) 
{ 
    List<DBTable> TheTables = new List<DBTable>(); 
    foreach (MyObject TheObject in TheListOfMyObjects) 
    { 
    DBTable TheTable= new DBTable(); 
    TheTable.Prop1 = TheObject.Prop1; 
    TheTable.Prop2 = TheObject.Prop2; 
    // only 2 properties, an int and a string 
    TheTables.Add(TheTable); 
    } 
    TheDC.DBTables.InsertAllOnSubmit(TheTables); 
    TheDC.SubmitChanges(); 
} 

Надеюсь, это поможет.

+0

Это не будет работать. Поскольку InsertAllOnSubmit принимает список сущностей таблицы. При выполнении InsertOnSubmit он не будет вставлять какую-либо вещь в базу данных. Это произойдет, когда вызывается метод SubmitChanges. Поэтому, пожалуйста, обновите свой ответ или удалите его. – Arion

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