Как проверить, существует ли идентификатор в таблице базы данных в C #? - PullRequest
2 голосов
/ 30 ноября 2011

Я пытаюсь удалить записи по идентификатору. Я хочу уведомить пользователя, что ID, который он пытается удалить, не существует. Это не создает никаких проблем, но я хочу прояснить все.

Как это сделать? Нужно ли для этого использовать строку SQL?

Я использую MS Access 2007, и вот как я удаляю элемент:

string SQL = "DELETE FROM PersonalData WHERE DataID = " + txtEntryID.Text;

private void DeleteData(string SQL)
{
    // Creating an object allowing me connecting to the database.
    // Using parameters in command will avoid attempts of SQL injection.
    OleDbConnection objOleDbConnection = new OleDbConnection();
    // Creating command object.
    objOleDbConnection.ConnectionString =
        "Provider=Microsoft.ACE.OLEDB.12.0;" +
        "Data Source=" + filePath + ";" +
        "Persist Security Info=False;" +
        "Jet OLEDB:Database Password=" + pass + ";";
    OleDbCommand objOleDbCommand = new OleDbCommand();

    objOleDbCommand.CommandText = SQL;

    // Assigning a connection string to the command.
    objOleDbCommand.Connection = objOleDbConnection;

    try
    {
        // Open database connection.
        objOleDbConnection.Open();
        objOleDbCommand.ExecuteNonQuery();
    }
    catch (Exception ex)
    {
        // Displaying any errors that 
        // might have occured.
        MessageBox.Show("Error: " + ex.Message);
    }
    finally
    {
        // Close the database connection.
        objOleDbConnection.Close();
    }

    // Refreshing state of main window.
    mainWindow.DisplayFileContent(filePath);

    MessageBox.Show("Data was successfully deleted.");

    // Clearing text box field.
    txtEntryID.Clear();
}

Ответы [ 3 ]

3 голосов
/ 30 ноября 2011

Вы можете использовать функцию DCount VBA:

DCount("*", "SomeTable", "ID = 1")

Если это 0, то вы знаете, что запись не существует и можете сообщить пользователю.

3 голосов
/ 30 ноября 2011

Ваш вопрос недостаточно ясен, поэтому я предполагаю, что вы хотели бы выполнить запрос DELETE и затем вернуть, были ли удалены записи или нет. Если это то, что вы хотите сделать, вы можете сделать это так:

DECLARE @deletedID AS INT
SELECT @deletedID = id FROM your_table WHERE id = <the id supplied by user>

DELETE FROM your_table
   WHERE your_table.id = <the id supplied by user>

RETURN @deletedID

Если запрошенный идентификатор не существует, возвращается NULL

EDIT

Исходя из пояснений в ваших комментариях, следующий запрос должен работать просто отлично:

SELECT COUNT(DataId) as Cnt 
  FROM PersonalData WHERE DataId = <user_specified_id>

Этот запрос создаст один столбец, набор результатов из одной строки (то есть скалярное значение). Значение будет 1 или 0 (при условии, что только одна запись может иметь одинаковый идентификатор). Если счетчик равен 0, запись не существует.

P.S. То, как вы выполняете запрос, вы открываете для себя с помощью инъекций SQL. По сути, кто-то может дать вам следующий DataID: 0 OR 1 = 1 и угадать, что произойдет - все записи PersonalData будут удалены!

Гораздо лучшим подходом было бы использование подготовленных заявлений. Или, по крайней мере, убедитесь, что вы дезинфицируете и проверяете вводимые пользователем данные, прежде чем объединять их в текст запроса.

3 голосов
/ 30 ноября 2011

В коде VBA вы можете использовать функцию DCount().

Вы также можете просто удалить записи с помощью оператора SQL и сообщить пользователю об этом;с точки зрения пользователя нет никакой разницы:

Dim id As Long

id = GetAnIdFromTheUser()

With CurrentDb
    Do
        .Execute "DELETE FROM [TableName] WHERE ID = " & id
        If .RecordsAffected > 0 Then
            Goto Done
        End If
        MsgBox "That ID doesn't exist; please try another."
        id = GetAnIdFromTheUser()
    Loop
Done:
    .Close
End With

РЕДАКТИРОВАТЬ:

В ADO.NET вы можете использовать тот же подход, изучив возвращаемое значение ExecuteNonQuery.Например, вы можете объявить вашу функцию как bool TryDeleteData(string SQL) и сделать что-то вроде

...
if (objOleDbCommand.ExecuteNonQuery() == 0)
    return false;
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...