2016-06-28 25 views
0

C#Webアプリケーションを使用してAccessデータベースを更新しようとしていますが、現在レコードを更新せずエラーを返さないWHEREステートメントの問題に直面しています。C#OleDB更新ステートメントが更新されない

私はテキストフィールドを更新しようとしています。WHERE文の条件は整数です。

 OleDbCommand cmd = new OleDbCommand("UPDATE Data SET Title = @Title WHERE ID = @ID"); 
     cmd.CommandType = CommandType.Text; 
     cmd.Connection = conn; 
     cmd.Parameters.AddWithValue("@Title", TextBox1.Text); 
     cmd.Parameters.AddWithValue("@ID", param2); 

私もそれを

 OleDbCommand cmd = new OleDbCommand("UPDATE Data SET Title = ? WHERE ID = ?"); 
     cmd.CommandType = CommandType.Text; 
     cmd.Connection = conn; 
     cmd.Parameters.AddWithValue("?", TextBox1.Text); 
     cmd.Parameters.AddWithValue("?", param2); 

をこの方法をやってみましたが、それはまだ更新していません!
これを修正しようとしたところ、最初のパラメータを単一引用符で囲んだ文字列(以下を参照)に置き換えると、実際にはテーブルが更新されます。

OleDbCommand cmd = new OleDbCommand("UPDATE Data SET Title = 'test' WHERE ID = @ID"); 

なぜこのようなことが起こっているのでしょうか?

編集:これは完全なコード

using (OleDbConnection conn = new OleDbConnection(connectionString)) 
    { 
     OleDbCommand cmd = new OleDbCommand("UPDATE Data SET Title = @Title WHERE ID = @ID"); 
     cmd.CommandType = CommandType.Text; 
     cmd.Connection = conn; 
     cmd.Parameters.AddWithValue("@Title", TextBox1.Text); 
     cmd.Parameters.AddWithValue("@ID", param2); 
     conn.Open(); 
     try 
     { 
      cmd.ExecuteNonQuery(); 
     } 
     catch (Exception ex) 
     { 
      Response.Write(ex.Message); 

     } 

編集である2:
これは私のコードは、データ型を設定しようとした後、それはまだ動作していないです。それは「1」を返しますが、データベースが更新されていない、明確にするために
は、私のAccessデータベースのIDに「オートナンバー型」であると私はrecordsUpdatedの値をチェックするときのタイトルは「長いテキスト」

using (OleDbConnection conn = new OleDbConnection(connectionString)) 
    { 
     OleDbCommand cmd = new OleDbCommand("UPDATE Data SET Title = ? WHERE ID = ?"); 
     cmd.CommandType = CommandType.Text; 
     cmd.Connection = conn; 
     cmd.Parameters.AddWithValue("Title", TextBox1.Text).OleDbType = OleDbType.VarChar; 
     cmd.Parameters.AddWithValue("ID", param2).OleDbType = OleDbType.Integer; 
     conn.Open(); 
     try 
     { 
      var recordsUpdated = cmd.ExecuteNonQuery(); 
     } 
     catch (Exception ex) 
     { 
      Response.Write(ex.Message); 
     } 

です。

+0

ロールバックされているトランザクションの中にいますか? – yaakov

答えて

1

文を実行するExecuteNonqueryに電話する必要があります。

// your OleDbConnection should also be wrapped in a using statement to ensure it is closed 
using (OleDbConnection conn = new OleDbConnection(connectionString)) 
{ 
    conn.Open(); // open the connection 
    using(OleDbCommand cmd = new OleDbCommand("UPDATE Data SET Title = ? WHERE ID = ?")) // wrap in using block because OleDbCommand implements IDisposable 
    { 
     cmd.CommandType = CommandType.Text; 
     cmd.Connection = conn; 
     cmd.Parameters.AddWithValue("Title", TextBox1.Text).OleDbType = OleDbType.VarChar; // Title, also set the parameter type 
     cmd.Parameters.AddWithValue("ID", param2).OleDbType = OleDbType.Integer; // ID, I am guessing its an integer but you should replace it with the correct OleDbType 
     var recordsUpdated = cmd.ExecuteNonQuery(); // execute the query 

     // recordsUpdated contains the number of records that were affected 
    } 
} 
  • 注文OP追加パラメータは、SQL文のパラメータの順序と一致する必要があります。
  • 各パラメータにOleDbTypeを指定して、コマンドがそれを推測する必要がないようにしてください。タイトルがvarcharで、IDが整数であると推測しました。間違った前提であればこれを修正してください。
  • 「?」を「?」に置き換えることができます。パラメータ名を追加するとパラメータの読み込みが容易になり、?更新ステートメントのプレースホルダ。私がチェックするとMicrosoftは、この彼らのドキュメント
  • ExecuteNonQueryでの例の多くに影響を受けた行の数を返し、結果をキャプチャして、デバッグのためにそれを使用します(コード更新を参照してください)

を行いますrecordsUpdatedの値は "1"を返しますが、データベースは更新されていません。

1が返されている場合、1つのレコードが更新されています。ここに2つのトラブルシューティングのヒントがあります。

  • 確認するレコードと同じレコードが更新されていることを確認する必要があります。デバッグ中にparam2の値を取得し、Accessのselectステートメントでその値を手動で使用して、そのレコードのタイトル列を表示しますSELECT Title FROM Data WHERE ID = [id here]。また、デバッグでTextBox1.Textの値を取得し、手動で実行されたselectクエリから返される値に対してこの値をチェックします。
  • これはMs Accessで、ファイルはディスク上に存在するため、接続文字列に接続しているのと同じデータベースに対して手動でチェックしていることを確認してください。データベースのコピーが2つある場合、更新が実行されていないという誤った結論に簡単につながる可能性があります。
+0

これで問題が解決しない場合は、接続文字列を投稿してください。通常、データベースが更新されない場合、誤ったデータベースを参照しています。 – jdweng

+0

私は完全なコードでメインのポストを編集しました。 接続文字列は正しいデータベースを参照しています。なぜなら、私が投稿で述べたように、文字列パラメータを取り除くと、テーブルが更新されるからです。 – mejaw

+0

@mejaw - 私は答えを更新しました – Igor

関連する問題