2

私はこのコードを試しました:

string sql = " DELETE FROM HotelCustomers WHERE [Room Number] =" +  textBox1.Text;
OleDbConnection My_Connection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source= c:\\Users\\Documents\\HotelCustomersOld.mdb");

My_Connection.Open();

OleDbCommand My_Command = new OleDbCommand(sql, My_Connection);
My_Command.ExecuteNonQuery();

エラー: 行 My_Command.ExecuteNonQuery(); で、条件式のデータ型が一致しません。

4

5 に答える 5

3

パラメータ化されたクエリを使用して、あらゆる種類のエラーを回避します

   string sql = " DELETE FROM HotelCustomers WHERE [Room Number] =?";
   using(OleDbConnection My_Connection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source= c:\\Users\\Documents\\HotelCustomersOld.mdb"))
   {
        My_Connection.Open();
        OleDbCommand My_Command = new OleDbCommand(sql, My_Connection);
        My_Command.Parameters.Add("@p1",  textBox1.Text);
        My_Command.ExecuteNonQuery();
   }

あなたの場合、部屋番号フィールドはテキスト型であるため、値を一重引用符で囲む必要がありますが、これは本当に間違っています。ユーザーがテキスト ボックス内に書いた悪意のあるテキストにコードを公開します。ここに非常に単純で面白い例があります

于 2013-04-19T18:38:38.680 に答える
1

あなたの【部屋番号】列はどのタイプですか?文字列の場合は、逆コンマまたは引用符を使用して値を記述する必要があります (どちらが Access で使用されているかはわかりません)。

string sql = " DELETE FROM HotelCustomers WHERE [Room Number] = '" +  textBox1.Text + "'";

SQL インジェクションを回避するには、文字列操作の代わりにパラメーターを使用する必要があります。

于 2013-04-19T18:40:06.533 に答える
0
public static void DeleteLine(string kv)
{
    OleDbConnection myConnection = GetConnection();
    string myQuery = "DELETE FROM Cloth WHERE [ClothName] = '" + kv + "'";
    OleDbCommand myCommand = new OleDbCommand(myQuery, myConnection);

    try
    {
        myConnection.Open();
        myCommand.ExecuteNonQuery();
    }
    catch (Exception ex)
    {
        Console.WriteLine("Exception in DBHandler", ex);
    }
    finally
    {
        myConnection.Close();
    }
}
于 2015-04-07T09:16:42.893 に答える