0

フォームを送信するときにデータベースに1行のデータを追加するのに問題があります。2行のデータをmdbデータベースに挿入します。提案のサンプルやヘルプはうまくいきません。ありがとうございます。

Protected Sub Button3_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button3.Click
    Dim conCoaxis As OleDbConnection
    Dim strInsert As String
    Dim cmdInsert As OleDbCommand


    conCoaxis = New OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0;Data Source=C:\site\App_Data\sabersolutions.mdb")
    strInsert = "INSERT INTO register (Name, Email, Newsletter) Values (?, ?, ?)"
    cmdInsert = New OleDbCommand(strInsert, conCoaxis)


    cmdInsert.Parameters.Add("@Name", OleDbType.VarWChar, 255).Value = txtName.Text
    cmdInsert.Parameters.Add("@Email", OleDbType.VarWChar, 255).Value = txtEmail.Text
    cmdInsert.Parameters.Add("@Newsletter", OleDbType.Boolean, 1).Value = ckNews.Checked

    Try
        conCoaxis.Open()
        cmdInsert.ExecuteNonQuery()
        conCoaxis.Close()
        Response.Write("Updated Successfully!<p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p>")
    Catch
        conCoaxis.Close()
    End Try
4

1 に答える 1

1

あなたのコードは問題ないようです。Button3_Clickサブルーチンがハンドラーとして複数回割り当てられているように見えます。たとえば、aspxページには次のようなものがあります

<asp:Button runat="server" ID="Button3" Text="Submit" OnClick="Button3_Click" />

OnClick 属性を参照してください。これにより、クリック イベントが呼び出されますButton3_Click 。次に、別の場所 (おそらくPage_Load.vb コード ビハインド) にも次のものがあります。

AddHandler Button3.Click, AddressOf Me.Button3_Click

したがって、1 回のクリック イベントで同じ関数が 2 回呼び出されることになります。AddHandler手動でクリック ハンドラーを接続する必要のないコードを取り除きます。

それが問題ではない場合、もちろんボタンを 2 回クリックしている可能性があります。これは HTML フォームのよく知られた問題です。多くのソリューションを Google で検索できます。私の推奨する解決策は、最初に「SELECT」を実行してレコードが既に存在するかどうかを確認するか、挿入コマンドを「IF NOT EXISTS」でラップすることです (これは MS Access で機能すると思いますが、MS Sql Server では有効であることを知っています)。

strInsert = "IF NOT EXISTS (SELECT 1 FROM register WHERE Name = @Name AND Email = @Email AND Newsletter = @Newsletter) BEGIN INSERT INTO register (Name, Email, Newsletter) Values ( @Name, @Email, @Newsletter) END"

別のオプションは次のとおりです。

strInsert = "INSERT INTO register (Name, Email, Newsletter) SELECT TOP 1 @Name, @Email, @Newsletter FROM register WHERE NOT EXISTS (SELECT 1 FROM register WHERE Name = @Name AND Email = @Email AND Newsletter = @Newsletter)"

この後者のステートメントは、'register' に少なくとも 1 つのレコードが含まれている場合にのみ機能します。MS Access Jet データベースでは、ステートメントにテーブル名が必要です。詳細については、こちらを参照してください。真剣に、Access をドロップして SQL Server のような適切なデータベースを使用すると、最初のステートメントを直接使用するか、ストアド プロシージャを介してはるかに専門的なソリューションを使用できます。

于 2013-01-18T08:55:28.853 に答える