将数据从VB net插入Postgresql

问题描述

我正在尝试将vb中的数据输入Postgresql 源是Access女士上的另一个数据库

使用此代码进行连接

Public Function LoadAcces_tblpibconr() As DataTable 'ganti ini sesuai nama table
    Dim Table As DataTable = New DataTable()
    Command.Connection = conn.OpenConnection()
    Command.CommandText = "select * from tblpibconr"
    Command.CommandType = CommandType.Text
    ReadRows = Command.ExecuteReader()
    Table.Load(ReadRows)
    ReadRows.Close()
    conn.CloseConexion()
    Return Table
End Function


'=====================================TABLE POSTGREsql========================='
Public Function LoadNpgsql_tblpibconr() As DataTable
    Dim Table As DataTable = New DataTable()
    Cmd.Connection = connNpgsql.OpenConnection()
    Cmd.CommandText = "select * from tblpibconr"
    Cmd.CommandType = CommandType.Text
    ReadRows1 = Cmd.ExecuteReader()
    Table.Load(ReadRows1)
    ReadRows1.Close()
    connNpgsql.CloseConexion()
    Return Table
End Function

我正在使用此功能过滤数据 我将首先比较数据,并在不匹配的情况下获取数据,并将其存储到postgresql

Public Function CekData_tblpibconr(ByVal car As String,ByVal reskd As String,ByVal contno As String) As Boolean
    Dim Table As DataTable = New DataTable()

    Cmd.Connection = connNpgsql.OpenConnection()
    If Cmd.Parameters.Count > 0 Then
        Cmd.Parameters.Clear()
    End If
    Cmd.Parameters.AddWithValue("@car",car)
    Cmd.Parameters.AddWithValue("@reskd",reskd)
    Cmd.Parameters.AddWithValue("@contno",contno)
    Cmd.CommandText = <sql>select * from tblpibconr where car=@car and reskd=@reskd and contno=@contno</sql>.Value
    Cmd.CommandType = CommandType.Text

    ReadRows1 = Cmd.ExecuteReader() 'ERROR system.invalidOperationException: 'Parameter '@car' must have its value set'

    Table.Load(ReadRows1)
    ReadRows1.Close()
    If Table.Rows.Count > 0 Then
        Return False
    Else
        Return True
    End If
    Cmd.Parameters.Clear()
    connNpgsql.CloseConexion()
End Function



Sub bandingkan_data_tblpibconr()
    For i = 0 To DGV1.Rows.Count - 1
        Dim validasi = query.CekData_tblpibconr(DGV1.Rows(i).Cells(0).Value,DGV1.Rows(i).Cells(1).Value,DGV1.Rows(i).Cells(2).Value) 'cek data dari access ke postgresql
        If validasi = True Then 'jika data di access tidaj ada
            'inser data
            Dim a As String
            If Isdbnull(DGV1.Rows(i).Cells(4).Value.ToString()) Then
                a = "0"
            Else
                a = DGV1.Rows(i).Cells(4).Value.ToString()
            End If
            DGV1.Rows(i).DefaultCellStyle.BackColor = Color.MistyRose
            Dim Insertdata = query.insertNpgsql_tblpibconr(DGV1.Rows(i).Cells(0).Value.ToString(),DGV1.Rows(i).Cells(1).Value.ToString(),DGV1.Rows(i).Cells(2).Value.ToString() _,DGV1.Rows(i).Cells(3).Value.ToString(),a)
            If Insertdata = True Then
                ' MsgBox("Masuk")
            Else
                MsgBox("Data Gagal DIMASUKAN")
            End If
        End If


    Next i
    LoadNpgsql_tblpibconr()
    MsgBox("Selesai")
End Sub
Public Function insertNpgsql_tblpibconr(ByVal car As String,ByVal contno As String,ByVal contukur As String,ByVal conttipe As String) As Boolean

    Cmd.Connection = connNpgsql.OpenConnection()
    If Cmd.Parameters.Count = 0 Then
        Cmd.Parameters.Clear()

    End If
    Try
        Cmd.CommandText = "insert into tblpibconr(car,reskd,contno,contukur,conttipe) values(@car,@reskd,@contno,@contukur,@conttipe)"
        Cmd.CommandType = CommandType.Text
        Cmd.Parameters.AddWithValue("@car",car)
        Cmd.Parameters.AddWithValue("@reskd",reskd)
        Cmd.Parameters.AddWithValue("@contno",contno)
        Cmd.Parameters.AddWithValue("@contukur",contukur)
        Cmd.Parameters.AddWithValue("@conttipe",conttipe)
        Cmd.ExecuteNonQuery()
        str = "insert into tblpibconr(car,@conttipe)"
        Return True
    Catch ex As Exception
        MsgBox(ex.Message)
        Return False
    End Try

    connNpgsql.CloseConexion()
End Function

这是我得到的错误

system.invalidOperationException:参数'@car'必须具有其 值集”

ITS请参考功能ReadRows1 = Cmd.ExecuteReader()上的cekdata_tblpibconr和子Dim validasi = query.CekData_tblpibconr(DGV1.Rows(i).Cells(0).Value,DGV1.Rows(i).Cells(2).Value)上的bandingkan_data_tblpibconr

但是在将数据成功插入我的Postgresql后出现此错误

解决方法

在运行发生错误的功能之前,我已经检查了我们是否真的有car值。

此方法演示了通过将数据库对象保持本地状态的含义。连接和命令在Using块中本地创建。即使出现错误,它们也会被关闭并丢弃。

您可以将连接字符串直接传递给连接的构造函数。同样,将命令文本和连接传递给命令的构造函数。默认的CommandTypeCommandType.Text,因此没有必要显式设置该属性。

在执行命令之前的最后一刻,打开连接。

Public Function CekData_tblpibconr(ByVal car As String,ByVal reskd As String,ByVal contno As String) As Boolean
    If String.IsNullOrEmpty(car) Then
        MessageBox.Show("Car has no value")
        Return True '??
    End If
    Dim Table As DataTable = New DataTable()
    Using cn As New NpgsqlConnection(ConStr),cmd As New NpgsqlCommand("select * from tblpibconr where car=@car and reskd=@reskd and contno=@contno;",cn)
        cmd.Parameters.Add("@car",NpgsqlDbType.Varchar).Value = car
        cmd.Parameters.Add("@reskd",NpgsqlDbType.Varchar).Value = reskd
        cmd.Parameters.Add("@contno",NpgsqlDbType.Varchar).Value = contno
        cn.Open()
        Table.Load(cmd.ExecuteReader)
    End Using
    If Table.Rows.Count > 0 Then
        Return False
    Else
        Return True
    End If
End Function