2013-03-11 6 views
1

У нас есть этот код C#, который обновит таблицу базы данных SQL Server на основе флагов в структуре.C# код для массового обновления SQL-сервера

public struct stSRK 
{ 
    public string Sno; 
    public string SClaimID; 
    public bool SType; 
    public string SText; 
} 

данные в структуре могут идти ДО 5000-10000 записей в time.Currently мы используем следующие C# код для обновления базы данных, и это делает «п» числа обращений к базе данных на основе структуры. Помогло бы в альтернативе делать массовое обновление, используя одну и ту же структуру. См. Метод ниже

public int UpdateClaims(List<stSRK> _lt, string strClaimType) 
{ 
try 
{ 
    int iCount = 0; 
    for (int i = 0; i < _lt.Count; i++) 
     { 
      if (_lt[i].sType == true) 
      { 
       if (_lt[i].SText == 'A') 
       { 
       iCount += Convert.ToInt16(SQL.ExecuteSQL("UPDATE table SET ClaimType = '" + strClaimType + "' WHERE 
        (Sno = '" + _lt[i].Sno + "' AND ClaimID = '" + _lt[i].SClaimID + "')")); 
       } 
       else 
       { 
       iCount += Convert.ToInt16(SQL.ExecuteSQL("UPDATE table SET ClaimType = '" + strClaimType + "' WHERE 
        (Sno = '" + _lt[i].Sno + "' AND ClaimID = '" + _lt[i].SClaimID + "')")); 
       } 
      } 
      else 
      { 
       if (_lt[i].SText == 'B') 
       { 
       iCount += Convert.ToInt16(SQL.ExecuteSQL("UPDATE table SET ClaimType = '" + strClaimType + "' WHERE 
        (Sno = '" + _lt[i].Sno + "' AND ClaimID = '" + _lt[i].SClaimID + "')")); 
       } 
       else 
       { 
       iCount += Convert.ToInt16(SQL.ExecuteSQL("UPDATE table SET ClaimType = '" + strClaimType + "' WHERE 
        (Sno = '" + _lt[i].Sno + "' AND ClaimID = '" + _lt[i].SClaimID + "')")); 
       } 
      } 
     return iCount; 
     } 
catch (Exception e) 
{ 
    throw e.Message; 
} 

ответ

1

Ваш запрос кажется одинаковым для всех случаев ..

Не можете переписать код, чтобы построить только один SQL заявление?

Что-то вроде этого:

public int UpdateClaims(List<stSRK> _lt, string strClaimType) 
{ 
    try 
    { 
     string allSno = String.Join(",", _lt.Select(l=> l.Sno.ToString()).ToArray()); 
     string allClaimID = String.Join(",", _lt.Select(l=> l.SClaimID.ToString()).ToArray()); 

     // Warning: NOT Production code, SQLInjection hazard! 
     return Convert.ToInt16(SQL.ExecuteSQL("UPDATE table SET ClaimType = '" + strClaimType + @"' WHERE 
         (Sno IN(" + allSno + ") AND ClaimID IN(" + allClaimID + "))")); 
    catch (Exception e) 
    { 
     //This is not a good idea, as this way you loose all innerException 
     // information about the exception. And you might just want to remove 
     // the try-catch alltogether if you just rethrow the exception. 
     throw e.Message; 
    } 
} 
+0

Стоит отметить: этот подход не очень хорошо масштабируется для больших обновлений - в идеале должен быть гибридный подход, когда вы делаете партии из 1000 записей (или, что то же, что имеет смысл для типов записей/среды, с которыми вы имеете дело). Если вы попробуете вышеуказанное с 200 000 записей, SQL-сервер, скорее всего, будет ужасно шутить в синтаксическом анализе запросов. – Tao

+0

Кроме того, в предложенном вами предложении where может быть логический недостаток: если я хочу удалить запись, где 'Sno = 1 AND ClaimID = 2', и я хочу удалить другую запись, где' Sno = 2 AND ClaimID = 1' , Я также случайно удалю записи, где «Sno = 1 AND ClaimID = 1» или «Sno = 2 AND ClaimID = 2». – Tao

+0

Спасибо Тао, ты очень прав, и я должен был упомянуть об этом в своем ответе. Я подпрыгнул, вероятно, с неправильного предположения, что они всегда уникальны. Это зависит от OP, чтобы помещать это в контекст, поскольку я не знаю, что означает Sno. – Peter

0

Попробуйте использовать запросы linq для массового обновления. Это улучшит производительность приложения.

Вы можете получить помощь для массовых запросов Updation Linq здесь:

How to run a mass update/delete query in Linq?

http://msdn.microsoft.com/en-us/library/bb399339.aspx

Надеется, что это поможет.

+5

НЕТ! Linq медленнее (иногда чрезвычайно медленнее), чем ADO.Net для массовых операций. –

+0

@EricJ. это? Я думал, что linq быстрее. Я также использую Linq для вставки от 25000 до 30000 записей, удаления обновлений. я заметил, что он делает работу быстрее для 20 записей за секунду, чем ADO.NET – Freelancer

+0

@Freelancer Да, ** Массовые операции ** по SQL-данным могут быть намного, намного быстрее, чем эквивалентные Linq. Вставки/обновления Linq записываются по записи, где массовая операция может вставлять/обновлять тысячи записей за одну операцию. – Corey

1

Мой код:

DataTable tblDetails = new DataTable("tblPlanDetail"); 

     tblDetails.Columns.Add("row1").DataType = typeof(Int32); 
     tblDetails.Columns.Add("row2").DataType = typeof(DateTime); 
     tblDetails.Columns.Add("row3").DataType = typeof(String); ; 
     tblDetails.Columns.Add("row4").DataType = typeof(Int32); ; 


     for (int i = 0; i < table.Rows.Count; i++) 
     { 

      for (int j = 1; j <= DateTime.DaysInMonth(monthYear.Year, monthYear.Month); j++) 
      { 
       DataRow row = tblDetails.NewRow(); 

       DateTime DayOfMonth = new DateTime(monthYear.Year, monthYear.Month, j); 
       row["row1"] = idPlan; 
       row["row2"] = DayOfMonth; 
       row["row3"] = table.Rows[i][0]; 
       row["row4"] = Int32.Parse((string)table.Rows[i][j]); 

       tblDetails.Rows.Add(row); 
      } 
     } 

     try 
     { 

      SqlBulkCopy sqlbulk = new SqlBulkCopy(connection, SqlBulkCopyOptions.KeepIdentity, transaction); 
      sqlbulk.ColumnMappings.Add("row1", "row1"); 
      sqlbulk.ColumnMappings.Add("row2", "row2"); 
      sqlbulk.ColumnMappings.Add("row3", "row3"); 
      sqlbulk.ColumnMappings.Add("row4", "row4"); 

      sqlbulk.DestinationTableName = "tblPlanDescription"; 
      sqlbulk.BatchSize = 2; 
      sqlbulk.WriteToServer(tblDetails); 
      transaction.Commit(); 
     } 
     catch (Exception exp) 
     { 

      transaction.Rollback(); 
     } 
     finally 
     { 
      transaction.Dispose(); 
      connection.Close(); 
     } 

Это основная вставка. Вы можете вставить его в таблицу темп. Затем вы можете выполнить SP, который будет создавать индексы и необходимые обновить neccesary данных на стороне сервера

посмотреть на here

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