2

私のプログラムには、runSQLというタイトルの関数があります。これは次のとおりです。

Dim Connection As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=TrainingLog.accdb")
    Dim DT As New DataTable
    Dim DataAdapter As OleDb.OleDbDataAdapter

    Connection.Open()
    DataAdapter = New OleDb.OleDbDataAdapter(query, Connection)
    DT.Clear()
    DataAdapter.Fill(DT)
    Connection.Close()
    Return DT

そして、このコードから取得した更新文字列を使用して、データベース内のレコードを更新しようとしています:

    Dim sqlString As String

    sqlString = "UPDATE UserRecords set FirstName = '" & txtName.Text
    sqlString = sqlString & "', LastName = '" & txtSurname.Text

    If ChkSmoker.Checked = True Then
        sqlString = sqlString & "', Smoker = true"
    ElseIf ChkSmoker.Checked = False Then
        sqlString = sqlString & "', Smoker = false"
    End If

    sqlString = sqlString & ", Weight = " & txtWeight.Text

    If RdoMale.Checked = True Then
        sqlString = sqlString & ", Gender = 'm'"
    ElseIf RdoFemale.Checked = True Then
        sqlString = sqlString & ", Gender = 'f'"
    End If

    sqlString = sqlString & " WHERE UserName = '" & LstUsers.SelectedItem.ToString & "'"

    runSQL(sqlString)

ただし、保存ボタンをクリックすると、runSQL 関数の 7 行目 (空の行を含まないため、DataAdapter.Fill(DT) 行) で「1 つ以上の必須パラメーターに値が指定されていません」というエラーが表示されます。

これがなぜなのか、それを修正する方法を誰かが知っているのだろうかと思いました。

私が考えたことの 1 つは、更新されているテーブルには、UPDATE ステートメントで言及されているフィールド以外のフィールドがあるということです。たとえば、「TeamMember」というタイトルの Yes/no フィールドがありますが、これについては update ステートメントでは言及していません。更新機能を使用する場合、変更されていないものも含め、すべてのフィールドに値を指定する必要がありますか?

読んでくれてありがとう。

4

1 に答える 1

0

自分で SQL クエリを作成しないでください。パラメーター化されたクエリを作成するか、ストアド プロシージャを使用する方が、はるかに簡単で安全です (SQL インジェクションを回避するため)。次に、クエリまたはストアド プロシージャの名前とパラメーター値を渡して実行します。

さらに、この方法では、特定の値の正しい形式を気にする必要がありません。たとえば、日付をどのようにフォーマットしますか? そして、ブール値をどのようにフォーマットしますか? ほとんどの場合、クエリの問題は、列に設定しようとしているfalseor値です。これは、TSQL ではビット値であり、 orのみになる可能性があるためです。trueSmoker01

これをチェックして、パラメーターの使用例を確認してください: ADO.NET コード例(VB で表示するには、[VB] タブをクリックしてください)。@クエリで接頭辞付きの名前を指定するパラメーターを定義し、クエリで各パラメーターの値を渡すだけで、面倒なことをしなくても正しい形式でサーバーに渡されることがわかります。それ。

サンプルの 1 つから取得:

Dim queryString As String = _
        "SELECT ProductID, UnitPrice, ProductName from dbo.Products " _
        & "WHERE UnitPrice > @pricePoint " _
        & "ORDER BY UnitPrice DESC;"
Dim command As New SqlCommand(queryString, connection)
command.Parameters.AddWithValue("@pricePoint", paramValue)

'' command.ExecuteXXX 

単純に実行する必要があるか、結果としてスカラー値または完全なデータセットを取得する必要があるかに応じて、さまざまな方法でコマンドを実行できることに注意してください。

于 2015-02-23T09:32:59.457 に答える