3

このサイトのほとんどのフォーラムを確認しましたが、解決策が得られませんでした。私の問題は、vb.netからMS Accessにデータを挿入することですが、それができません。エラーは表示されませんが、テーブルに値が挿入されません。私は非常に単純なコードを使用しています:

Imports System.Data.OleDb

Public Class Add_LEads

    Dim conn As New OleDbConnection
    Dim cmd As New OleDbCommand
    Dim da As New OleDbDataAdapter
    Private Sub Add_LEads_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        conn = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\IndGlobalDB.accdb;Persist Security Info=True;Jet OLEDB:Database Password=admin")
        lblDate.Text = Format(Date.Now, "yyyy/MM/dd")
        conn.Open()
        Dim sql As String
        Dim a As Integer
        sql = "select S_No from Leadss"
        cmd = New OleDbCommand(sql, conn)
        Dim dr As OleDbDataReader
        dr = cmd.ExecuteReader
        While dr.Read
            a = dr(0)
        End While
        lblNo.Text = a + 1
        conn.Close()
    End Sub
    Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSave.Click
        conn.Open()
        cmd.Connection = conn
        cmd.CommandText = "INSERT INTO Leadss(S_No,Contact_Person,Mobile_No,Email_Id,Description,First_Follow_Up,Remarks,L_Date,Alternate_no)VALUES('" & lblNo.Text & "','" & txtName.Text & "','" & txtMobile.Text & "','" & txtEmail.Text & "','" & txtWebDescr.Text & "','" & txtFollowUp.Text & "','" & txtRemarks.Text & "','" & lblDate.Text & "','" & txtAlternate.Text & "')"
        cmd.ExecuteNonQuery()
        conn.Close()
        MsgBox("Saved!!!", vbOK)
    End Sub
    Private Sub btnExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExit.Click
        Me.Close()
        Welcome.Show()
    End Sub

End Class
4

5 に答える 5

1

パラメータ化されたクエリを使用して SQL インジェクション攻撃を回避し、JET エンジンが無効な文字の文字列パラメータを解析できるようにする必要があります。

 Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) 
                                                                   Handles btnSave.Click 
    conn.Open() 
    cmd.Connection = conn 

    cmd.CommandText = "INSERT INTO Leadss(S_No,Contact_Person,Mobile_No,Email_Id," & _
                      "Description,First_Follow_Up,Remarks,L_Date,Alternate_no) VALUES " & _
                      "(?, ?, ?, ?, ?, ?, ?, ?, ?)"


    cmd.Parameters.Clear()
    cmd.Parameters.AddWithValue("@p1", lblNo.Text)
    cmd.Parameters.AddWithValue("@p2", txtName.Text)
    cmd.Parameters.AddWithValue("@p3", txtMobile.Text)
    cmd.Parameters.AddWithValue("@p4", txtEmail.Text)
    cmd.Parameters.AddWithValue("@p5", txtWebDescr.Text)
    cmd.Parameters.AddWithValue("@p6", txtFollowUp.Text)
    cmd.Parameters.AddWithValue("@p7", txtRemarks.Text)
    cmd.Parameters.AddWithValue("@p8", lblDate.Text)
    cmd.Parameters.AddWithValue("@p9", txtAlternate.Text)
    cmd.ExecuteNonQuery() 
    conn.Close() 
End Sub 

これは、フィールド タイプがテキスト タイプであり、数値、日時、またはブール値ではない場合にのみ機能します。その場合、Convert.ToXXXXX メソッドを使用して入力テキストを適切なタイプに変換する必要があります。
(以下の例では、入力に有効な数値と日付が含まれていることを前提としています)

....
cmd.Parameters.AddWithValue("@p3", Convert.ToInt32(txtMobile.Text))
.....
cmd.Parameters.AddWithValue("@p8", Convert.ToDateTime(lblDate.Text))
cmd.Parameters.AddWithValue("@p9", Convert.ToInt32(txtAlternate.Text))

もう 1 つの間違ったアプローチは、OleDbConnection、OleDbCommand などの再利用のためにグローバル変数を保持することです。これにより、使用されていないときにランタイムがこれらのオブジェクトを破棄するのを防ぎます。代わりに、このアプローチに従う必要があります

 Using conn = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data " +
                  "Source=|DataDirectory|\IndGlobalDB.accdb;" +
                   "Persist Security Info=True;Jet OLEDB:Database Password=admin")   
    Using cmd = New OleDbCommand()
        conn.Open() 
        cmd.Connection = conn 
        cmd.CommandText = "INSERT INTO ................"
        cmd.Parameters.AddWithValue("@p1", lblNo.Text)
        ..........
    End Using
End Using
于 2012-10-18T12:28:57.533 に答える
0

ステートメントでバッククォート ( `) を使用しますFROM。である必要がありますFROM(`Field1`,`Field2`,...etc) Values('value1', 'value2')

于 2013-07-28T05:13:35.340 に答える
0

データベース名、テーブル名、保存ボタンのクリックイベントのフィールド名に従って、このコーディングを記述します...

 Using conn = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source='C:\Users\user\Documents\Visual Studio 2008\Projects\demo for db in access\demo for db in access\DatabaseforDemo.accdb'")
        Using cmd = New OleDbCommand()
            conn.Open()
            cmd.Connection = conn
            cmd.CommandText = "INSERT INTO demo1(Name) VALUES('" & TextBox1.Text & "')"
            'cmd.Parameters.AddWithValue("@p1", lblNo.Text)
            cmd.ExecuteNonQuery()
            MsgBox("saved..")
            conn.Close()
        End Using
    End Using

頑張ってください...それがあなたを助けることを願っています...!

于 2015-02-27T11:26:04.177 に答える
0

SqlParameter と try/catch ブロックを使用する簡単な例を次に示します。

Dim connection As SqlConnection = As New SqlConnection("YourDbConnection")
Dim command As SqlCommand = connection.CreateCommand()

Try
    connection.Open()
    command.CommandText = "INSERT INTO Leadss(S_No) VALUES (@S_No)"
    command.Parameters.Add("@S_No", SqlDbType.Text)
    command.Parameters["@FirstName"].Value = lblNo.Text
    command.ExecuteNonQuery()
Catch Ex As SqlException
    'Process the exception
Finally
    connection.Close()
End Try
于 2012-10-18T12:40:21.553 に答える
0

あなたの質問であなたは言った:

エラーは表示されませんが、テーブルに値が挿入されません

コミットを使用してみてください。

SQLのCOMMITステートメントは、リレーショナル データベース管理システム (RDBMS) 内のトランザクションを終了し、すべての変更を他のユーザーに表示します。一般的な形式は、BEGIN WORK ステートメント、1 つ以上の SQL ステートメント、および COMMIT ステートメントを発行することです。または、BEGIN WORK が発行されてから実行されたすべての作業を元に戻す ROLLBACK ステートメントを発行することもできます。COMMIT ステートメントは、使用中の既存のセーブポイントも解放します。トランザクションに関して言えば、コミットの反対は、トランザクションの一時的な変更を破棄すること、つまりロールバックです。

ここで引用:コミット(データ管理)

Try
    'Open Connection...

        'Insert Statement....

        'Notification / Msgbox to confirm successful transaction

    Catch ex As Exception
        'RollBack Transaction...
        'Error Management...

    Finally
        'Commit...
        'Close DB Connection....
    End Try

Microsoft ドキュメント: OleDbTransaction.Commit メソッド ()

ただし、覚えておいてください: 複数の SQL ステートメントを挿入/更新する場合にのみ、トランザクションを使用する必要があります。

これは、 MS Access 2010 を使用してトランザクション管理をフォームに追加するの例です。

于 2015-12-15T02:17:31.920 に答える