2017-06-28 7 views
0

アクセスデータベースファイルの2つのテーブルから削除するコードを追加しようとしています。時にはそれらのうちの1つが動作し、もう1つは別の方法で試してみると、それと反対のことをします。だから最終的には2つの作品のうちの1つだけです。C#からアクセスデータベースから削除する方法

私のコードは、誰かが私が間違っていたことを見つけられることを願っています。

try 
{ 
    Conn.Open(); 
    OleDbCommand command = new OleDbCommand(); 
    command.Connection = Conn; 
    command.CommandText = "DELETE FROM TBLNAME WHERE name [email protected]"; 
    command.Parameters.AddWithValue("@name", lvlist.SelectedItems[0].Text); 
    command.ExecuteNonQuery(); 

    command.CommandText = "DELETE from TBLNAME WHERE cb_listName [email protected]"; 
    command.Parameters.AddWithValue("@listname", lvlist.SelectedItems[0].Text); 
    command.ExecuteNonQuery(); 
    Conn.Close(); 
} 
catch (Exception ex) 
{ 
    MessageBox.Show("Error " + ex); 
} 
+1

次のコマンドを実行する前にパラメータをクリアする必要はありませんか? "command.Parameters.Clear();"を使用する –

+0

2番目の新鮮な 'OleDbCommand'インスタンスを作成するのに最適です。 – knittl

+0

これは良い習慣であるかどうかわかりませんが、各文に同じ値を使用しているようですので、2番目のdelete文でパラメータを@nameに変更し、2番目のParameter.AddwithValueを削除して各コマンドテキストは2つの異なるコマンドテキストに対して同じパラメータと値を使用します –

答えて

3

実行するコマンドごとに異なるコマンドインスタンスを使用する必要があります。あなたがそれをしない場合、あなたはパラメータをクリアする必要があります。これは、OleDbクエリのパラメータが定位置であり、名前が付けられていないためです。これは、2番目のクエリで2番目のパラメータを追加すると、最初のパラメータがリストの最初のパラメータであるために使用されることを意味します。

using(var connection = new OleDbConnection("connection string here")) 
{ 
    connection.Open(); 
    using(var command = new OleDbCommand("DELETE FROM TBLNAME WHERE name = @name", connection)) 
    { 
     cmd.Parameters.Add(new OleDbParameter("@name", OleDbType.VarChar, 50)).Value = lvlist.SelectedItems[0].Text; 
     command.ExecuteNonQuery(); 
    } 

    using(var command = new OleDbCommand("DELETE from TBLNAME WHERE cb_listName = @listname", connection)) 
    { 
     cmd.Parameters.Add(new OleDbParameter("@listname", OleDbType.VarChar, 50)).Value = lvlist.SelectedItems[0].Text; 
     command.ExecuteNonQuery(); 
    } 
} 

また、あなたがする必要があります

  1. 使用usingブロックは、接続が使用後に閉じていることを確認します。クラススコープの、またはさらに悪いグローバル接続インスタンスを作成しようとしないでください。
  2. パラメータにはdb型を指定し、AddwithValueは使用しないでください。
  3. 可能であれば、db型の長さも指定します。上記の場合、これはvarchar型の場合に可能です。 ノートでは、私は例外で有用な何もしないcatchブロックを追加していない、これらの列最後に

、一般的なベストプラクティスにちょうどノートのスキーマの長さで推測を土気。少なくとも、型、メッセージ、およびスタックトレースをログに記録し、プロパティInnerExceptionにある各内部例外に対してこれを繰り返します。この有用な情報は、例外が発生した理由を正確に把握するのに役立ちます。

+0

ありがとうございます。私は今それを試して助けるために。私はフォームの上部にあらかじめ定義された接続文字列を持っているので、毎回それを定義する必要がありますか?それとも大丈夫ですか? –

+0

利用可能でオープンな接続が必要であり、状態がクローズされているというエラーが表示されます。 –

+0

@Don - 私が提供したコードを見ると、1行目が接続を作成し、2行目がそれを開きます。この接続インスタンスは、各 'OleDbCommand'インスタンスのコンストラクタに渡されます。 – Igor

1

2つの異なるOleDbCommandオブジェクトを使用します。

関連する問題