Удалить данные из Access с помощью SQL Query — C#

\У меня есть три столбца в таблице базы данных доступа (DATA), как показано ниже.

введите здесь описание изображения

Я просто хочу удалить несколько строк на основе двух условий в предложении WHERE в SQL-запросе; например, удалить строку, когда ИМЯ = "A" и Дата = "1/1/2017"

Я использовал DELETE from DATA Where Name='A' and Date='1/1/2017' Это дает «ошибку несоответствия типов»!

Вот код на С#:

 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();
}

person user7157732    schedule 20.02.2017    source источник
comment
это не проблема С#! ему не нравится ваш формат даты. пожалуйста, удалите тег С#   -  person BugFinder    schedule 20.02.2017
comment
Я добавил код С#. Сначала я пробовал это в Access и использовал бы тот же запрос в С#. @BugFinder   -  person user7157732    schedule 20.02.2017
comment
@Steve: Опубликовал это   -  person user7157732    schedule 20.02.2017
comment
Это неправильный способ передачи значений, если поле (DATA) является полем типа DateTime. Является ли Data полем DateTime в доступе?   -  person Steve    schedule 20.02.2017
comment
да, это определяется как datetime @Steve   -  person user7157732    schedule 20.02.2017
comment
Угадайте, но вы передаете дату как строку, а не дату. Давно с тех пор, как я использовал доступ, но я думаю, что даты завернуты в символы #, поэтому попробуйте изменить [Date] = '1/1/2017' на [Date] = #1/1/2017# Если база данных DateTime не Дата, тогда вам также нужно будет учитывать время.   -  person Matt    schedule 20.02.2017


Ответы (1)


Лучший способ передать значения механизму базы данных, который будет использоваться в запросе, — через коллекцию параметров, точно указав тип параметра.

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();
}

Таким образом, вы не оставляете места для интерпретации (преобразования строки в дату) ваших значений, но вы точно сообщаете своему движку БД, какое у вас значение. И, конечно же, если вы укажете правильный тип, у вас не может быть ошибки несоответствия типов.

person Steve    schedule 20.02.2017
comment
ааа интересно! Я подозревал, что проблема была в том, что я использовал Date в качестве имени столбца; Дата является ключевым словом. Спасибо! @Стив - person user7157732; 20.02.2017
comment
Использование параметров — это способ использовать все, что вам нужно передать в качестве значения для ваших столбцов (WHERE, INSERT, UPDATE, DELETE). это правильный способ избежать Sql Injection беспорядок - person Steve; 20.02.2017