Lix Felix Ответов: 2

1 вставить оператор с несколькими значениями VB net с параметрами


I need to input 1 GB data every 15 minutes
if looping my insert statement it will take around 20 minutes
its take to long

Мне нужно вставить несколько строк в 1 Инструкция
зацикливание значений, но не оператор insert


код
Sub bandingkan_data_tblpibconr()
        Dim Bs_access As New DataTable
        Bs_access = query.LoadAcces_tblpibconr
        Dim dt3 As New DataTable
        dt3 = Bs_access
        Cmd.Connection = connNpgsql.OpenConnection()



        Dim kueri As String

        kueri = "insert into tblpibconr values"
        For i = 0 To dt3.Rows.Count - 1


            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 + ","

    
        Next
        kueri = kueri.Remove(kueri.Length - 1, 1)

        Cmd.CommandText = kueri
        Cmd.ExecuteNonQuery()


        connNpgsql.CloseConexion()
    End Sub

<pre lang="vb">


это мой код и его работа
но теперь мне нужно добавить к нему параметры

Cmd.Parameters.Add("@car", NpgsqlTypes.NpgsqlDbType.Text).Value = dt3.Rows(i)("car").ToString
    Cmd.Parameters.Add("@reskd", NpgsqlTypes.NpgsqlDbType.Text).Value = dt3.Rows(i)("reskd").ToString
    Cmd.Parameters.Add("@contno", NpgsqlTypes.NpgsqlDbType.Text).Value = dt3.Rows(i)("contno").ToString
    Cmd.Parameters.Add("@contukur", NpgsqlTypes.NpgsqlDbType.Text).Value = dt3.Rows(i)("contukur").ToString.Trim()
    Cmd.Parameters.Add("@conttipe", NpgsqlTypes.NpgsqlDbType.Text).Value = dt3.Rows(i)("conttipe").ToString


как я могу изменить свой Куэри и ввести в него свой параметр

Что я уже пробовал:

Мне нужно ввести данные из таблицы данных в PostgreSQL
если вы ребята знаете как ввести его быстрее например использовать массовую вставку пожалуйста дайте мне сейчас

Sub bandingkan_data_tblpibconr()
    Dim Bs_access As New DataTable
    Bs_access = query.LoadAcces_tblpibconr
    Dim dt3 As New DataTable
    dt3 = Bs_access
    Cmd.Connection = connNpgsql.OpenConnection()

    Try
        Dim insProd As String = "insert into tblpibconr(car, reskd, contno, contukur,conttipe) values (@car, @reskd, @contno, @contukur,@conttipe)"
        Dim cmdSql As New NpgsqlCommand(insProd, connNpgsql.OpenConnection)
        connNpgsql.OpenConnection()
        Dim i As Integer
        For i = 0 To (dt3.Rows.Count - 1)
            Cmd.Parameters.Clear()
            ' ------------ WORKING CODE -------------------
            With Cmd

                .Parameters.Add("@car", NpgsqlTypes.NpgsqlDbType.Text).Value = dt3.Rows(i)("car").ToString
                .Parameters.Add("@reskd", NpgsqlTypes.NpgsqlDbType.Text).Value = dt3.Rows(i)("reskd").ToString
                .Parameters.Add("@contno", NpgsqlTypes.NpgsqlDbType.Text).Value = dt3.Rows(i)("contno").ToString
                .Parameters.Add("@contukur", NpgsqlTypes.NpgsqlDbType.Text).Value = dt3.Rows(i)("contukur").ToString.Trim()
                .Parameters.Add("@conttipe", NpgsqlTypes.NpgsqlDbType.Text).Value = dt3.Rows(i)("conttipe").ToString

            End With
            ' ------------ WORKING CODE -------------------
            Cmd.CommandText = insProd
            Cmd.ExecuteNonQuery()
        Next
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    Finally
        connNpgsql.CloseConexion()
    End Try
End Sub


Я пробовал этот код, но он все еще зацикливает оператор insert

2 Ответов

Рейтинг:
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

значит, мне нужно ограничить зацикливание?

Richard Deeming

Да.

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 сэр