Вставка нескольких записей с моего веб-сайта не удалась

Я запрашиваю веб-сайт для данных за 5 лет из 150 точек данных, что составляет около 40000 записей каждая (всего 6 миллионов записей), и вставляю результат в мою базу данных. Это часть веб-приложения. Я использую VS 2010 и SQL Server 2008 Express. У меня есть два вопроса, не связанных друг с другом относительно этого:

1) Когда я использую отладчик VS 2010, запускаю приложение и пытаюсь выполнить эту задачу с помощью ADO.NET, для 40000 записей требуется примерно 15 минут. Есть ли способ ускорить это? Я использую обычный процесс вставки следующим образом.

SqlConnection myConnection = new SqlConnection("user id=sa; password=++++++; server=.\\SQLEXPRESS;database=+++++++++;");
myConnection.Open();
{
    string CommandText = "Insert into myTable(TimeOfDay,Price,InstrumentID)"+" "
                        +"values('"+tod+"',"+price+","+insID+")";
    SqlCommand myCommand = new SqlCommand(CommandText,myConnection);
    myCommand.ExecuteNonQuery();
}

2) Мой второй вопрос: когда я запускаю приложение, используя IIS вместо подключенного отладчика VS 2010, процесс вставки останавливается после просто вставки 100 записей? Это ограничение связано с настройкой в ​​IIS 6.0? Или в SQL сервере?

Пожалуйста, помогите.

1 ответ

Решение

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

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

// A parameterized command text
string CommandText = "Insert into myTable(TimeOfDay,Price,InstrumentID) values(@tod, @price, @id)";
using(SqlConnection myConnection = new SqlConnection(......))
{
     myConnection.Open();
     using(SqlCommand myCommand = new SqlCommand(CommandText,myConnection))
     {
         // Build the parameters before entering the loop. They are always the same
         // just the value changes, but setting the size, precision and scale allows
         // the SQL Optimizer to reuse this command
         Parameter tod = myCommand.Parameters.Add("@tod", SqlDbType.NVarChar);
         tod.Size = 50;  // TimeOfDay is a string? Set its size...

         // Price is a numeric with Precision and Scale? Set this properties
         Parameter price = myCommand.Parameters.Add("@price", SqlDbType.Decimal);
         price.Precision = 10;
         price.Scale = 2;

         Parameter id = myCommand.Parameters.Add("@price", SqlDbType.Int);

         for( ........ loop statement on your data .....) 
         {
            ... extract the parameters values ...
            myCommand.Parameters["@tod"] = tod;
            myCommand.Parameters["@price"] = price;
            myCommand.Parameters["@id"] = insID;
            myCommand.ExecuteNonQuery();
         }
    }
}

Очень полезное чтение, как код доступа к данным влияет на производительность базы данных

Другие вопросы по тегам