2011-07-13 22 views
0

私はlogin.mdbという名前のアクセスデータベースを持っています。これは多くのテーブルを持っています。 "try"というテーブルを更新したいのですが、テーブルには2つのフィールドと名前があります。あるname.myコードを対応のrollnumを更新する: system.nullreferenceexception::オブジェクトrefernceオブジェクトのインスタンスに設定されていないがアクセスデータベースがvb.netから更新されていない

Public Class Form11 
    Inherits System.Windows.Forms.Form 

    Dim MyConnection1 As System.Data.OleDb.OleDbConnection 
    Dim myCommand1 As New System.Data.OleDb.OleDbCommand 
    Dim sql As String 

    ''# .... 

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
     Try 

      MyConnection1.ConnectionString = "PROVIDER=Microsoft.JET.OLEDB.4.0;Data Source = C:\Documents and Settings\1001\Desktop\Subhedar Sir\WindowsApplication1\bin\login.mdb" 

      MyConnection1.Open() 
      myCommand1.Connection = MyConnection1 

      myCommand1.CommandText = "UPDATE try SET rollnumber = '" & TextBox1.Text & "' WHERE nam = '" & TextBox2.Text & "';" 
      myCommand1.CommandType = CommandType.Text 
      myCommand1.Connection = MyConnection1 
      myCommand1.ExecuteNonQuery() 
      MsgBox("done") 

      MyConnection1.Close() 
     Catch ex As Exception 
      MsgBox(ex.ToString) 
     End Try 
    End Sub 
End Class 

MAMはwrong.iがエラーを取得しています行く場所を教えてください。

答えて

2

どのラインでエラーが表示されますか?

MyConnection1は(それを引き起こす可能性があります)

インスタンス化には見えません。 SQLの終わりには正しいですか?

また、コマンドパラメータの概念についても学びましょう。このようなSQLを作成することは間違っているだけです。

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
    Try 
     Using MyConnection1 As New System.Data.OleDb.OleDbConnection("PROVIDER=Microsoft.JET.OLEDB.4.0;Data Source = C:\Documents and ings\1001\Desktop\Subhedar Sir\WindowsApplication1\bin\login.mdb"), _ 
      myCommand1 As New System.Data.OleDb.OleDbCommand("UPDATE try SET rollnumber = @rollnumber WHERE nam = @nam", MyConnection1) 

      myCommand1.Parameters.AddWithValue("@rollnumber", TextBox1.Text) 
      myCommand1.Parameters.AddWithValue("@nam", TextBox2.Text) 

      MyConnection1.Open() 
      myCommand1.ExecuteNonQuery() 
      MsgBox("done") 

     End Using 

    Catch ex As Exception 
     MsgBox(ex.ToString) 
    End Try 
End Sub 

これは:)よりそれのようにする必要があり、ここで

+0

OleDBは名前付きパラメータをサポートしていますか? –

+0

@Joel Sarcasm?そうでない場合は、名前付きパラメータを使用できますが、oledbはそれを '?'として扱います。 – LarsTech

+0

@Lars - いいえ、私は頻繁にOleDbを使用しません。そして、前回私はそれがサポートされていないと思っていました。説明をありがとう。 –

2

いくつかの問題:

  • "み" は、いくつかのデータベースで予約語です。アクセスは問題ありませんが、これが動いても問題が発生します。早く準備するのが最善です。
  • クエリパラメータがありません(SQLインジェクションハックに脆弱です)。現在のコードでテキストボックスの1つに';DROP Table [Try];--と入力してください。
  • クラス全体のための共通のDB接続は、競合の問題が発生し、ボトルネック
  • が潜在的に接続を開いたままになり、最終的にも、あなたのデータベースが使用できない
  • にさせる可能性がある、finallyブロックで接続を閉じなかったことができ接続文字列でのDBへの絶対パスが展開
  • で失敗します
  • は、接続オブジェクトのインスタンスを作成したことはありません(それがあなたの例外からのエラーです)

あなたのコードが見えるはずですこのような、より:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
    Using cn As New OleDbConnection("PROVIDER=Microsoft.JET.OLEDB.4.0;Data Source = login.mdb"), _ 
      cmd As New OleDbCommand("UPDATE [try] SET rollnumber= ? WHERE nam= ? ;", cn) 

     ''# Note: I normally don't use AddWithValue(), but I don't know your data types 
     cmd.Parameters.AddWithValue("?", TextBox1.Text) 
     cmd.Parameters.AddWithValue("?", TextBox2.Text) 

     Try 
      cn.Open() 
      cmd.ExecuteNonQuery() 
      MsgBox("done") 
     Catch ex As Exception 
      MsgBox(ex.ToString) 
     End Try 
    End Using 
End Sub 

このコードは1つだけでなく、あなたの現在の例外を発生させ、上記の問題のすべてを占めています。

+0

私はすべての(ほぼ)これらの問題を解決したので、私のコード/答えに何が間違っていましたか?たぶん私はあなたの中でそれをやっていなかったかもしれませんが、情報はほぼ同じですね。 OPはとにかく答えたことはありません。 –

+0

@Ales usingステートメントを壊してしまった行継続文字がありませんでした。私は私の作曲を始めて、しばらく逃げなければならなかったので、最初はあなたに気付かなかった。投稿時に私はあなたの名前付きパラメータについて知らなかったし、元のコードの問題も列挙していたので私は私の周りを守った。 –

+0

'_'はVB.NETの新しいバージョンでは問題になりません(多くの場合、これがその1つです)。しかし、OK :) –

関連する問題