2017-03-20 12 views
1

複数の行をAccessデータベースに挿入しようとしています。テーブルの名前はsalesで、カラムはsandwichおよびpriceです。挿入しようとしているデータは、複数のコントロールTextBoxに含まれています。複数の行をアクセスデータベースに挿入するにはどうすればよいですか?

は、これまでのところ、私はこのコードを試してみた:

Dim sql As String = "INSERT INTO [sales] ([sandwich]) VALUES ([@sandwich])" 
Try 
    Using conn As New OleDbConnection(constring) 
     Using cmd As New OleDbCommand(sql, conn) 
      conn.Open() 
      For Each Order As TextBox In grpbill.Controls 
       If Order.Text.Length > 0 Then 
        cmd.Parameters.AddWithValue("@sandwich", Order.Text) 
        cmd.ExecuteNonQuery() 
       End If 
      Next Order 
     End Using 
     conn.Close() 
    End Using 
Catch ex As Exception 
    MsgBox(ex.Message) 
End Try 

それが正常に動作しています。プログラムは完全なTextBoxコントロールのみをチェックし、正しい数の行を挿入しますが、データベースをチェックすると値はすべて同じで、最後のTextBoxの値を繰り返し挿入します。

これを修正する方法はありますか?

+0

私はそれがgrpboxに複数のてtextBoxで右全く働いている疑い - あなたは何度もAddWithValueすることはできません - 3つの項目がある場合、それはとの3つのパラメータを追加しようとしますコースが失敗すると同じ名前。 – Plutonix

+0

まず、 'grpbill.Controls'を' grpbill.Controls.OfType(Of TextBox)() 'に変更します。そうすれば、あなたは 'TextBox'を扱うことしかできません。また、 'For'の前にパラメータを追加し、各ループの値を更新することを検討してください。 – Bugs

+0

@Plutonix私の質問の最後に述べたように、プログラムは同じ価値を何度も繰り返しています。何も間違っていないかどうかは問いません。S –

答えて

1

のループの外側に追加して、For Eachのループを作成し、各ループの値を更新する必要があります。 .AddWithValueを省き、.Addを使用してください。 .AddWithValueは、クエリパラメータのデータベースタイプを推測する必要があります。これはTextBox制御コレクションをあなただけのループを確保し、含まれませんよう

またgrpbill.Controlsの代わりにgrpbill.Controls.OfType(Of TextBox)()を使用することを検討すべきであるLabelまたはGroupBoxまたはPanelなど

注私は、次のLINQ文を持っています:

From t In grpbill.OfType(Of TextBox)() 
Where t.TextLength > 0 
Order By t.TabIndex 

これで、Ifステートメントを削除できるようになりました。また、正しい順序でデータベースに追加されるように、各TextBoxTabIndexを設定してください。

コードを少し短くするためにUsingも削除しました。代わりにカンマを使用できます。これは単に個人的な好みです。

最後に、Usingがすべてあなたのために処理するので、conn.Close()は必要ありません。

コード:

Dim sql As String = "INSERT INTO [sales] ([sandwich]) VALUES ([@sandwich])" 
Try 
    Using conn As New OleDbConnection(constring), 
      cmd As New OleDbCommand(sql, conn) 
     conn.Open() 
     cmd.Parameters.Add("@sandwich", OleDbType.VarChar) 
     For Each Order As TextBox In From t In grpbill.OfType(Of TextBox)() 
            Where t.TextLength > 0 
            Order By t.TabIndex 
       cmd.Parameters("@sandwich").Value = Order.Text 
       cmd.ExecuteNonQuery() 
     Next 
    End Using 
Catch ex As Exception 
    MsgBox(ex.Message) 
End Try 
0

私はあなたが宣言した値を設定しているとは思いません。

Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    Dim Name As String = txtName.Text 
    Dim Email As String = tbxEmail.Text 
    Dim Comment As String = tbxComment.Text 

    Using dbConn = New OleDbConnection(".......") 
     dbConn.Open() 
     Dim strSql = "INSERT INTO [user] (username, email, comments) VALUES (?,?,?)" 
     Using objcmd = New OleDbCommand(strSql, dbConn) 
      objcmd.Parameters.AddWithValue("@username", Name) 
      objcmd.Parameters.AddWithValue("@email", Email) 
      objcmd.Parameters.AddWithValue("@comments", Comment) 
      objcmd.ExecuteNonQuery() 
     End Using 
    End Using 
    Response.Write("Submitted Successfully") 
End Sub 

Insert text from a text box into and Access 2010 DataBase using VB.Net

関連する問題