Как вставить значение в базу данных сервера SQL из таблицы данных vb.net - PullRequest
1 голос
/ 15 апреля 2019

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

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

    Dim ds As DataSet = New DataSetMasBrgSpring
    Dim dt As DataTable
    dt = ds.Tables("DataTable1")
    If DataGridView1.Rows.Count > 0 Then
        dt.Rows.Clear()
        For i = 0 To DataGridView1.Rows.Count - 1
            dt.Rows.Add(DataGridView1.Rows(i).Cells(0).Value, etc..            

        Dim sql1 As String
        Dim dataAdapter As New Data.SqlClient.SqlDataAdapter
        Dim command As New Data.SqlClient.SqlCommand
        command = "insert into MasbrgSpring (KODEC, WIRE, DIMENSION, STD, NOMLOT, STAT) VALUES (@kodec, @wire,@dimension,@std,@nomlot,@stat)"
        command.Parameters.Add("@kodec", SqlDbType.VarChar)
        etc...

        For i As Integer = 0 To DataGridView1.Rows.Count - 1
            command.Parameters(0).Value = DataGridView1.Rows(i).Cells(0).Value
            command.Parameters(1).Value = DataGridView1.Rows(i).Cells(1).Value
        etc...

            str.Open()
            COMMANDSQL(sql1)
            str.Close()

        Next
    End If
End Sub

это подкоманды ql:

    Public Sub COMMANDSQL(ByVal S As String)
    sqlcom = New SqlCommand(S, str)
    sqlcom.CommandType = CommandType.Text
    sqlcom.ExecuteNonQuery()
End Sub

Это ошибка, которую я получаю:

value of type string cannot be converted to 'system.data.sqlclient.sqlcommand'

Ответы [ 2 ]

1 голос
/ 15 апреля 2019

В вашем коде много проблем. Конечно, непосредственная причина, вызывающая ошибку компиляции, заключается в том, что вы используете command вместо command.CommandText для назначения запроса команде, но есть и другие.

    If DataGridView1.Rows.Count > 0 Then
        Dim command As New Data.SqlClient.SqlCommand
        command.Text = "insert into MasbrgSpring 
                (KODEC, WIRE, DIMENSION, STD, NOMLOT, STAT) 
                 VALUES (@kodec, @wire,@dimension,@std,@nomlot,@stat)"
        command.Parameters.Add("@kodec", SqlDbType.VarChar)
        .... add all the other parameters ....

        ' Don't forget to set the connection to the command
        command.Connection = str
        str.Open()

        ' Now loop over the rows and for each one execute the insert command
        For i As Integer = 0 To DataGridView1.Rows.Count - 1
            command.Parameters(0).Value = DataGridView1.Rows(i).Cells(0).Value
            command.Parameters(1).Value = DataGridView1.Rows(i).Cells(1).Value
            .....    
            command.ExecuteNonQuery()
        Next
        str.Close()
    End If
End Sub

Здесь я удалил все, что касается SqlDataAdapter, DataTable и DataSet. Они вообще не нужны, когда вы выполняете непосредственно SqlCommand.
Наконец, SqlCommand, подготовленный в цикле, является тем, который должен быть выполнен, если вы создадите новую SqlCommand внутри этого метода SQLCOMMAND, то вам нужно будет предоставить ей ту же информацию, которую вы уже дали команде, используемой в цикле.

Таким образом, нет необходимости также в методе SQLCOMMAND, но вы можете напрямую вызвать ExecuteNonQuery для подготовленного SqlCommand.

Последний совет. Очень плохое программирование - иметь глобальный объект SqlConnection. Он сохраняет ресурсы заблокированными на клиенте и на сервере, и если по какой-либо причине вы получаете исключение, соединение остается открытым с побочными эффектами, которые не сразу проявляются при возникновении проблем в других блоках кода данных. ADO.NET обладает функциональностью Пул соединений , намного более продвинутой, чем та, которую вы пытаетесь воссоздать, сохраняя глобальный объект соединения. Вместо этого используйте оператор Using вокруг ваших команд Sql

Using sqlCon = New SqlConnection(......)
    If DataGridView1.Rows.Count > 0 Then
        Dim command As New Data.SqlClient.SqlCommand
        command.Connection = sqlCon
           ..... the previous code....
    End If
End Using

Оператор using поможет вам закрыть и удалить соединение, в то время как пул соединений удаляет служебную информацию, необходимую для повторного подключения к той же базе данных с той же строкой соединения.

0 голосов
/ 15 апреля 2019

Это, вероятно, эта строка:

command = "insert into MasbrgSpring (KODEC, WIRE, DIMENSION, STD, NOMLOT, STAT) VALUES (@kodec, @wire,@dimension,@std,@nomlot,@stat)"

Я думаю, вы имеете в виду:

command.CommandText = "insert into MasbrgSpring (KODEC, WIRE, DIMENSION, STD, NOMLOT, STAT) VALUES (@kodec, @wire,@dimension,@std,@nomlot,@stat)"
...