Массовое обновление в SQL Server из C # - PullRequest
0 голосов
/ 11 сентября 2018

Мне нужно обновить несколько записей в таблице SQL Server из C #.Ниже приведены шаги, которым я должен следовать, и ниже приведен код.Код работает, но процесс занимает гораздо больше времени, чем ожидалось.Мне нужен быстрый способ обновить 10000 записей, я не уверен, что Bulk Copy будет работать для обновления.

Я видел другие ответы, в которых есть Bulk insert to temp, а затем update .. Но это обновление имеет один оператор, и здесь мне нужно обновить записи в БД на основе данных Excel, и для этого мне нужноЗацикливание каждой записи Excel. Так как я могу добиться более быстрого обновления.

1) Считайте данные Excel и скопируйте данные в таблицу данных

string strDirectory = string. Empty;
strDirectory = System.IO.Directory.GetCurrentDirectory() + "\\" + "Filename.xlsx";
string Connection String = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source = " + strDirectory + "; Extended Properties = \"Excel 12.0;HDR=YES;IMEX=1\"";
using (OleDbConnection conn = new OleDbConnection(Connection String))
{    
    conn.Open();

    DataTable schemaTable = conn.GetOleDbSchemaTableOleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });

    DataRow schemaRow = schemaTable. Rows[0];
    string sheet = schemaRow["TABLE_NAME"].ToString();
    string query = "SELECT * FROM [" + sheet + "]";
    OleDbDataAdapter daexcel = new OleDbDataAdapter(query, conn);
    daexcel.Fill(dt);
    conn.Close();
}

2) Выполните некоторые манипуляции с данными, имеющими данныедо обновления в таблицу.

string strsqlst = string. Empty;
using (SqlConnection sqlConn = new SqlConnection(Connectionstring))
{
    sqlConn.Open();
    SqlCommand cmd;

    StringBuilder sb = new StringBuilder();
    sb.AppendLine("DataTable content:");
    foreach (DataRow row in dt.Rows)
    {
        if (row.ItemArray[0].ToString() == "")
            break;

        strsqlst = "Update  table Set col1= " + row.ItemArray[4].ToString() + "  ,col2= " + row.ItemArray[5].ToString() + " where <Condition>'";

        cmd = new SqlCommand(strsqlst, sqlConn);

        cmd.CommandType = CommandType.Text;
        cmd.ExecuteNonQuery();         
    }
    sqlConn.Close();
}

1 Ответ

0 голосов
/ 11 сентября 2018

SqlCommand может представлять собой целый SQL пакет и не ограничивается одним оператором.Таким образом, вы можете создать один большой пакет с 10 000 операторов UPDATE или разделить его, например, на 20 пакетов по 500 в каждом.

Другими словами, вы можете создать одну команду с CommandText, например:

UPDATE [T] SET Col1='Value1', Col2='Value2' WHERE [Id] = 1;
...
UPDATE [T] SET Col1='Value999', Col2='Value1000' WHERE [Id] = 500;

При этом вам следует использовать параметры для всех значений данных (чтобы гарантировать, что SQL-инъекция невозможна),

Если вы хотите обработать какие-либо ошибки (обновления не выполняются из-за неверных данных), вам понадобится что-то более сложное.

...