Советы по вставке в SQLCE

Я вставляю около 1943 записей с помощью этой функции в SQLCE. Это моя функция вставки. Параметры получены из StringReader (строка поступает из веб-службы). Эта функция выполняется 1943 раза и занимает около 20 секунд. Я удалил индексы таблицы, что я могу сделать, чтобы улучшить это? Я создаю только 1 раз mycomm и sqlceresultset.

Public Function Insert_Function(ByVal f_Line() As String, ByRef myComm As SqlCeCommand, ByRef rs As SqlCeResultSet) As String
    Try
        Dim rec As SqlCeUpdatableRecord = rs.CreateRecord()
        rec.SetInt32(0, IIf(f_Line(1) = "", DBNull.Value, f_Line(1)))
        rec.SetInt32(1, IIf(f_Line(2) = "", DBNull.Value, f_Line(2)))
        rec.SetInt32(2, IIf(f_Line(3) = "", DBNull.Value, f_Line(3)))
        rec.SetInt32(3, IIf(f_Line(4) = "", DBNull.Value, f_Line(4)))
        rec.SetValue(4, IIf(f_Line5(5) = "", DBNull.Value, f_Line(5)))
        rs.Insert(rec)
        rec = Nothing
    Catch ex As Exception
        strerr_col = ex.Message
    End Try
    Return strerr_col
End Function
13.10.2009 14:00:16
1 ОТВЕТ

Я думаю, что вы получаете исключение (я), когда вы пытаетесь установить DBNull.Value, вызывая SetInt32. Мне удалось вставить десять тысяч записей за одну секунду, используя этот код:

            using (var cn = new SqlCeConnection(ConnectionString))
        {
            using (var cmd = new SqlCeCommand())
            {
                cn.Open();
                cmd.Connection = cn;
                cmd.CommandText = "TableName";
                cmd.CommandType = CommandType.TableDirect;

                using (var rs = cmd.ExecuteResultSet(ResultSetOptions.None))
                {
                    var record = rs.CreateRecord();

                    using (var reader = new StringReader(input))
                    {
                        string line;
                        while ((line = reader.ReadLine()) != null)
                        {
                            var index = 0;
                            var values = line.Split(new[] { ',' });

                            record.SetValue(index, values[index++] == string.Empty ? (object)DBNull.Value : values[index - 1]);
                            record.SetValue(index, values[index++] == string.Empty ? (object)DBNull.Value : values[index - 1]);
                            record.SetValue(index, values[index++] == string.Empty ? (object)DBNull.Value : values[index - 1]);
                            record.SetValue(index, values[index++] == string.Empty ? (object)DBNull.Value : values[index - 1]);
                            record.SetValue(index, values[index++] == string.Empty ? (object)DBNull.Value : values[index - 1]);
                            rs.Insert(record);
                        }
                    }
                }
            }
        }
2
14.10.2009 12:00:26
Как вы можете использовать rs.CreateRecord, хотя вы установили ResultSetOptions.None.Я думаю, вы должны установить ResultSetOptions.Updateable, если вы хотите что-то вставить? Я изменил свой код как urs, но получил ошибку из-за resultsetoption.
Alexander 15.10.2009 11:51:19
Правда. Извините, я сделал несколько других тестов, поэтому я забыл включить его в Обновляемый.
Petar Petrov 16.10.2009 08:53:17
я попробовал ваше решение. Правильно использовать string.Empty вместо "". Я изменил setint32 или setstring на setvalue, но это не сильно повысило производительность (около половины секунды). Интересно, как вы вставили десять тысяч записей в одну? Во-вторых, я не думаю, что это является причиной разницы в C #. Действительно интересно.
Alexander 17.10.2009 12:50:02