Рейтинг:
19
Richard Deeming
Попробуйте что-нибудь вроде этого:
Using conn As NpgsqlConnection = connNpgsql.OpenConnection()
Using cmd As New NpgsqlCommand("", conn)
Dim sb As New StringBuilder("insert into tblpibconr(car, reskd, contno, contukur,conttipe) values ");
For i As Integer = 0 To dt3.Rows.Count - 1
If i <> 0 Then sb.Append(",")
sb.AppendFormat("(@car{0}, @reskd{0}, @contno{0}, @contukur{0}, @conttipe{0})", i)
Dim row As DataRow = dt3.Rows(i)
cmd.Parameters.Add("@car" & i, NpgsqlTypes.NpgsqlDbType.Text).Value = row("car")
cmd.Parameters.Add("@reskd" & i, NpgsqlTypes.NpgsqlDbType.Text).Value = row("reskd")
cmd.Parameters.Add("@contno" & i, NpgsqlTypes.NpgsqlDbType.Text).Value = row("contno")
cmd.Parameters.Add("@contukur" & i, NpgsqlTypes.NpgsqlDbType.Text).Value = row("contukur")
cmd.Parameters.Add("@conttipe" & i, NpgsqlTypes.NpgsqlDbType.Text).Value = row("conttipe")
Next
cmdSql.CommandText = sb.ToString()
cmdSql.ExecuteNonQuery()
End Using
End Using
Чтобы ограничить количество строк в пакете, когда вы получаете ошибку "слишком много параметров" :
Const RowsPerBatch As Integer = 1000
Using conn As NpgsqlConnection = connNpgsql.OpenConnection()
For batchStart As Integer = 0 to dt3.Rows.Count - 1 Step RowsPerBatch
Using cmd As New NpgsqlCommand("", conn)
Dim sb As New StringBuilder("insert into tblpibconr(car, reskd, contno, contukur,conttipe) values ");
For i As Integer = 0 To Math.Min(dt3.Rows.Count - batchStart - 1, RowsPerBatch - 1)
If i <> 0 Then sb.Append(",")
sb.AppendFormat("(@car{0}, @reskd{0}, @contno{0}, @contukur{0}, @conttipe{0})", i)
Dim row As DataRow = dt3.Rows(batchStart + i)
cmd.Parameters.Add("@car" & i, NpgsqlTypes.NpgsqlDbType.Text).Value = row("car")
cmd.Parameters.Add("@reskd" & i, NpgsqlTypes.NpgsqlDbType.Text).Value = row("reskd")
cmd.Parameters.Add("@contno" & i, NpgsqlTypes.NpgsqlDbType.Text).Value = row("contno")
cmd.Parameters.Add("@contukur" & i, NpgsqlTypes.NpgsqlDbType.Text).Value = row("contukur")
cmd.Parameters.Add("@conttipe" & i, NpgsqlTypes.NpgsqlDbType.Text).Value = row("conttipe")
Next
cmdSql.CommandText = sb.ToString()
cmdSql.ExecuteNonQuery()
End Using
Next
End Using
Lix Felix
этот код дает мне сообщение об ошибке, сэр "добавлять не член npgsqlConnectionStringBuilder"
Richard Deeming
Прочтите ответ еще раз.
Dim sb As New StringBuilder(...)
Это
StringBuilder
,
НЕ npgsqlConnectionStringBuilder
.
Возможно, вам придется добавить
Imports System.Text
в самом верху вашего досье.
Lix Felix
Здравствуйте, сэр, после того, как я проверяю и использую код, который вы мне даете, этот код дает мне ошибку, сэр, вставленные данные неверны, это просто цикл первых 1000 данных
Richard Deeming
Мой код:
Dim row As DataRow = dt3.Rows(batchStart + i)
Ваш код:
Dim row As DataRow = dt3.Rows(i)
Заметьте разницу.
Lix Felix
Используя conn в качестве нового NpgsqlConnection = connNpgsql.OpenConnection() (=) этот символ дает мне ошибку "конец оператора "
Richard Deeming
Снимите крышку New
из этой строки::
Using conn As NpgsqlConnection = connNpgsql.OpenConnection()
Lix Felix
"Оператор не может иметь более 65535 параметров" сэр, что я могу сделать с этой ошибкой ?
Lix Felix
его работа отлично подходит для предыдущей таблицы
Richard Deeming
Разделите исходные данные на более мелкие пакеты. Вы вставляете 5 параметров в строку, поэтому вы можете вставить максимум 13107 строк в пакет.
Lix Felix
значит, мне нужно ограничить зацикливание?
Lix Felix
сэр, у меня есть данные 54.000 строк, если Макс равен 2000, как я могу вставить все данные, сэр?
Richard Deeming
Смотрите мой обновленный ответ.
Lix Felix
Большое вам спасибо сэр он прекрасно работает
Lix Felix
сэр, у меня есть еще одна проблема, когда я попытался запустить 2 подводные лодки одновременно
Я получил эту ошибку "система.ObjectDisposedException: 'невозможно получить доступ к удаленному объекту.
Имя объекта: 'NpgsqlConnection'.'"
Richard Deeming
Похоже, вы повторно используете один и тот же объект подключения для нескольких вызовов базы данных. Не делай этого. Создайте новый объект подключения при каждом вызове OpenConnection
, и завернуть его в Using
блок, чтобы убедиться, что он правильно утилизирован, когда вы закончите с ним.
Lix Felix
Оке сэр, я добавляю это в свой код, и он прекрасно работает
Dim connPOSTGRES как новый ConnNpsql
Richard Deeming
Для этого вы вставляете 28 параметров в строку, так что вы можете вставить 2340 строк в пакет.
Рейтинг:
1
Patrice T
kueri = "insert into tblpibconr values"
...
kueri = kueri + "('" + dt3.Rows(i)("car").ToString + "','" + dt3.Rows(i)("reskd").ToString + "','" + dt3.Rows(i)("contno").ToString + "','" + dt3.Rows(i)("contukur").ToString.Trim() + "','" + dt3.Rows(i)("conttipe").ToString + "')"
kueri = kueri + ","
Не обязательно решение вашего вопроса, но у вас есть еще одна проблема.
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь к уязвимости под названием "SQL-инъекция", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа выйдет из строя. Если пользователь вводит имя, например "Брайан О'Коннер", может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция - Википедия[
^]
SQL-инъекция[
^]
Атаки SQL-инъекций на примере[
^]
PHP: SQL-инъекция - руководство пользователя[
^]
Шпаргалка по предотвращению инъекций SQL - OWASP[
^]
Как я могу объяснить SQL-инъекцию без технического жаргона? - Обмен Стеками Информационной Безопасности[
^]
Цитата:
Мне нужно вставить несколько строк в 1 Инструкция
Что плохого в том, чтобы делать 1 вставку на запись ?
[Обновление]
Цитата:
Мне нужно вводить 1 ГБ данных каждые 15 минут
если зациклить мой оператор insert это займет около 20 минут
Вы смотрели на объемную вставку ?
Массовая вставка данных в SQL Server[
^]
SQL Server вставляет несколько строк в таблицу с помощью одного оператора[
^]
Lix Felix
вот почему мне нужно использовать параметры сэр для преобразования типа данных
Мне нужно вводить 1 ГБ данных каждые 15 минут
если зациклить мой оператор insert это займет около 20 минут
это займет много времени
Patrice T
Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.
Чтобы каждый мог обратить внимание на эту информацию.
Lix Felix
Я не думаю что смогу использовать массовую вставку с PostgreSQL сэр