2017-02-20 9 views
0

削除データは、SQLクエリを使用して - C#

enter image description here

以下のように私は私だけで2つの条件のもと、いくつかの行を削除するアクセスデータベーステーブル(DATA)で3つの列を持っている\ WHERE SQLクエリの句。 NAME = "A"、Date = "1/1/2017"の場合は行を削除します

DELETE from DATA Where Name='A' and Date='1/1/2017' これは「型の不一致エラー」を示します。ここ

は、C#のコードである:パラメータの正確種類を指定するパラメータコレクションをある

using (OleDbConnection thisConnection = new OleDbConnection(connectionname)) 
{ 
    string deletequery = " DELETE FROM DATA WHERE [Name] = 'A' And [Date] = '1/1/2017'; 

    OleDbCommand myAccessCommandDelete = new OleDbCommand(deletequery, thisConnection); 
    thisConnection.Open(); 
    myAccessCommandDelete.ExecuteNonQuery(); 
    thisConnection.Close(); 
} 
+0

これはC#の問題ではありません!それはあなたの日付の形式のようなものではありません。 C#タグを削除してください – BugFinder

+0

私はC#コードを追加しました。私は最初にAccessでそれを試していたし、C#で同じクエリを使用していたでしょう。 @BugFinder – user7157732

+0

@Steve:投稿しました – user7157732

答えて

3

クエリで使用されるデータベースエンジンに値を渡すための最良の方法

using (OleDbConnection thisConnection = new OleDbConnection(connectionname)) 
{ 
    string deletequery = @"DELETE FROM DATA WHERE [Name] = @name And 
         [Date] = @date"; 
    OleDbCommand myAccessCommandDelete = new OleDbCommand(deletequery, thisConnection); 
    thisConnection.Open(); 
    myAccessCommandDelete.Parameters.Add("@name", OleDbType.VarWChar).Value = "A"; 
    myAccessCommandDelete.Parameters.Add("@date", OleDbType.Date).Value = new DateTime(2017,1,1); 
    myAccessCommandDelete.ExecuteNonQuery(); 
    // not needed -> thisConnection.Close(); 
} 

この方法では、値の解釈(文字列から日付への変換)にスペースを残すことはありませんが、値が何であるかをdbエンジンに正確に伝えます。もちろん正しいタイプを指定した場合は、型の不一致エラーは発生しません

+0

興味深いaaah!列名として「日付」を使用していたために問題が発生していると思われました。日付はキーワードです。ありがとう! @Steve – user7157732

+0

パラメータを使用すると、列の値として渡す必要があるすべてのもの(WHERE、INSERT、UPDATE、DELETE)に行く方法です。また、不足しているバッチ更新に対するMS-Accessの '感謝'機能、それは[SQLインジェクション混乱]を回避する正しい方法です(http://stackoverflow.com/questions/332365/how-does-the-sql-injection-from-the-bobby-tables-xkcd-comic-work ) – Steve

関連する問題