преобразование linq в sql в хранимую процедуру массовой вставки - PullRequest
2 голосов
/ 11 февраля 2012

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

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();
}

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

Спасибо за ваши предложения и отзывы.

Ответы [ 3 ]

1 голос
/ 12 февраля 2012

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

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 голосов
/ 11 февраля 2012

Лучший вариант - не использовать 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 голосов
/ 11 февраля 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...