Вставить несколько строк в таблицу SQL


Я написал следующий код на C# для вставки строк (который пользователь вводит в веб-приложение) в базу данных SQL. Как этот код выглядит? Есть лучший, более эффективный способ выполнения этой задачи?

public void UpdateDeviceStatus(string[] deviceId, byte[] status, string userId, string[] remarks, DateTime dateTurnin)
{                
        if (deviceId.Length != status.Length || status.Length != remarks.Length)
            throw new ArgumentOutOfRangeException("Invalid arguments passed to UpdateDeviceStatus: deviceId, status, and remarks must contain the same number of entries.");
        if (deviceId.Length == 0)
            throw new ArgumentOutOfRangeException("UpdateDeviceStatus expects to update status for at least one deviceId, but an empty array was passed in.");

        // Build the SQL statement
        StringBuilder sbSql = new StringBuilder();
        sbSql.Append(@"INSERT INTO AT_Event_History(deviceId,parentCode,statusCode,remarks,userId,whenEntered) VALUES");
        for (int i = 0; i < deviceId.Length; i++)
        {
            string values = string.Format("({0},0,{1},{2},{3},{4}),",
                new string[] { "@deviceId" + i.ToString(), "@statusCode" + i.ToString(), "@remarks" + i.ToString(), "@userId", "@whenEntered" });
            sbSql.Append(values);
        }
        string sql = sbSql.ToString();
        sql = sql.TrimEnd(','); // remove the trailing comma ','

        Database db = EnterpriseLibraryContainer.Current.GetInstance<Database>("AssetTrackConnection");

        DbCommand command = db.GetSqlStringCommand(sql);
        command.CommandType = CommandType.Text;
        command.CommandText = sql;

        // Add in parameters
        db.AddInParameter(command, "@userId", DbType.AnsiString, userId);
        db.AddInParameter(command, "@whenEntered", DbType.Date, dateTurnin);
        for (int j = 0; j < deviceId.Length; j++)
        {
            db.AddInParameter(command, "@deviceId" + j.ToString(), DbType.Guid, new Guid(deviceId[j]));
            db.AddInParameter(command, "@statusCode" + j.ToString(), DbType.Byte, status[j]);
            db.AddInParameter(command, "@remarks" + j.ToString(), DbType.AnsiString, remarks[j]);
        }

        // Execute the statement.
        db.ExecuteNonQuery(command);    
}

Как видите, я лупов для добавления параметров БД для хранения значения для каждой строки. Я думаю, что там может быть лучшего способа сделать это.



30658
11
задан 28 июня 2011 в 04:06 Источник Поделиться
Комментарии
2 ответа

Вы создаете динамический Insert с значений параметризованы. Это работает, и нет ничего неправильно с этим методом. Это даже может быть лучший способ для ваших обстоятельств. Это хорошо работает, когда ваш столик "маленький". У меня довольно большая база данных, которая растет монотонно. Мы продолжаем добавлять ряды и никогда не снимать любой. Когда таблица разрастется до определенного момента, который является определенным для вашего дизайна стола, вставляет очень медленно. На данный момент, Вы хотите, чтобы рассмотреть, используя SqlBulkCopy класс. Вы добавляете значения в DataTable и затем сделать массовой вставки. Это намного быстрее, потому что он использует определенный метод SQL-сервер загрузки данных быстрее. В SqlBulkCopy ссылке есть пример кода.

7
ответ дан 28 июня 2011 в 11:06 Источник Поделиться

Кроме того, начиная с версии SQL 2008 поддержка хранимых процедур, возвращающих табличное значение параметров, которые позволяют вам пройти несколько колонок, многорядные записей в качестве аргумента хранимой тез.Докл.

Это может быть полезно в ситуациях, когда (в силу своей ограниченности) массовое копирование невозможно. В частности, потому, что это "за одним столом".

3
ответ дан 16 декабря 2011 в 10:12 Источник Поделиться