2

良い一日、質問があります。データベースにサプライヤを追加するプログラムでこのコードを使用しようとすると、データ型の不一致エラーが発生します。私の知る限り、サプライヤーのステータスによってエラーが発生します。

radActive名前付きのラジオボタンの値をradInactiveデータベースに保存するにはどうすればよいですか?Booleanまたはを使用する必要がありStringますか?データベースとしてMicrosoftAccessを使用しており、のフィールドStatusはに設定されていYes/Noます。

これがコードです。

Public Sub SupplierInsertData()

    Dim conn As OleDb.OleDbConnection
    Dim cmd As OleDb.OleDbCommand

    Dim SupplierType As String
    Dim Status As Boolean

    'Check for supplier type
    If frmDatabaseSupplier.radLocal.Checked = True Then

        SupplierType = "Local"

    ElseIf frmDatabaseSupplier.radForeign.Checked = True Then

        SupplierType = "Foreign"

    End If

    'Check for supplier status
    If frmDatabaseSupplier.radActive.Checked = True Then

        Status = True

    ElseIf frmDatabaseSupplier.radInactive.Checked = True Then

        Status = False

    End If

    'For inserting of data in the database.
    Dim cmdString As String = "INSERT INTO Supplier(SupplierLastName, SupplierFirstName, SupplierMiddleInitial, " & _
                              "SupplierCompany, SupplierType, SupplierStreetAddress, SupplierCity, SupplierContactNumber, SupplierEmail, " & _
                              "Status)" & _
                              "VALUES('" & frmDatabaseSupplier.txtSupplierLastName.Text & "','" & frmDatabaseSupplier.txtSupplierFirstName.Text & "','" & frmDatabaseSupplier.txtSupplierMiddleInitial.Text & "','" _
                              & frmDatabaseSupplier.txtSupplierCompany.Text & "','" & SupplierType & "', '" & frmDatabaseSupplier.txtSupplierStreetAddress.Text & "','" & frmDatabaseSupplier.txtSupplierCity.Text & "','" _
                              & frmDatabaseSupplier.txtSupplierContactNumber.Text & "','" & frmDatabaseSupplier.txtSupplierEmail.Text & "','" & Status & "')"

    conn = New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\ProjectAnalysisSystem.accdb")

    cmd = New OleDb.OleDbCommand(cmdString, conn)

    conn.Open()
    cmd.ExecuteNonQuery()
    conn.Close()

End Sub

ありがとうございました!

4

2 に答える 2

2

コードの最後の部分を変更してみてください。
パラメータを使用して、テキストボックスまたは変数の値をデータベースエンジンに渡す必要があります。
また、OleDbConnectionなどの使い捨てオブジェクトをステートメントにカプセル化することを忘れないでusingください。

Dim cmdString As String = "INSERT INTO Supplier(SupplierLastName, SupplierFirstName, SupplierMiddleInitial, " & _ 
                          "SupplierCompany, SupplierType, SupplierStreetAddress, SupplierCity, SupplierContactNumber, SupplierEmail, " & _ 
                          "Status)" & _ 
                          "VALUES(@supplierName, @supplierFirst, @supplierMiddle, @supplierCo, @supplierType, @supplierStreet, @supplierCity, " & _
                          "@supplierContact, @supplierMail, @status)"
Using conn As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\ProjectAnalysisSystem.accdb")
    Dim cmd As OleDbCommand = New OleDb.OleDbCommand(cmdString, conn))
    cmd.Parameters.AddWithValue("@supplierName", frmDatabaseSupplier.txtSupplierLastName.Text)
    cmd.Parameters.AddWithValue("@supplierFirst", frmDatabaseSupplier.txtSupplierFirstName.Text)
    cmd.Parameters.AddWithValue("@supplierMiddle", frmDatabaseSupplier.txtSupplierMiddleInitial.Text)
    cmd.Parameters.AddWithValue("@supplierCo", frmDatabaseSupplier.txtSupplierCompany.Text )
    cmd.Parameters.AddWithValue("@supplierType", SupplierType)
    cmd.Parameters.AddWithValue("@supplierStreet", frmDatabaseSupplier.txtSupplierStreetAddress.Text)
    cmd.Parameters.AddWithValue("@supplierCity", frmDatabaseSupplier.txtSupplierCity.Text)
    cmd.Parameters.AddWithValue("@supplierContact", frmDatabaseSupplier.txtSupplierContactNumber.Text)
    cmd.Parameters.AddWithValue("@supplierMail", frmDatabaseSupplier.txtSupplierEmail.Text)
    cmd.Parameters.AddWithValue("@status", Status) '<- Here the status var is correctly identified as a boolean, not as a string
    conn.Open() 
    cmd.ExecuteNonQuery() 
End Using
于 2012-04-28T22:55:11.473 に答える
1

データ型がYes/NoでINSERT statementあるフィールドの文字列値を格納しようとしたため、データ型の不一致エラーが発生しました。Status

これは実際にはVB.Netの問題ではありません。VBAから同じことを試みた場合、Accessのdbエンジンからまったく同じエラーが発生します。これは、以下のVBAプロシージャからの出力です。

INSERT INTO Supplier (Status)
VALUES('True')
Error -2147217913 (Data type mismatch in criteria expression.)

手順 ...

Public Sub Ju_chan()
    Dim cmdString As String
    Dim Status As Boolean
    Dim strMsg As String

On Error GoTo ErrorHandler

    Status = True
    cmdString = "INSERT INTO Supplier (Status)" & vbCrLf & _
        "VALUES('" & Status & "')"
    Debug.Print cmdString
    CurrentProject.Connection.Execute cmdString

ExitHere:
    On Error GoTo 0
    Exit Sub

ErrorHandler:
    strMsg = "Error " & Err.Number & " (" & Err.Description _
        & ")"
    Debug.Print strMsg
    GoTo ExitHere
End Sub

これは、パラメータの使用を回避することを目的としたものではないことを理解してください。なぜそのエラーが発生するのかを明確にしたかっただけです。

于 2012-04-28T23:13:19.183 に答える