【问题标题】:How to check if ID exists in database table in C#?如何在C#中检查数据库表中是否存在ID?
【发布时间】:2012-01-09 22:57:31
【问题描述】:

我正在尝试按 ID 删除条目。我想通知用户他们尝试删除的 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();
}

【问题讨论】:

标签: c# sql ms-access


【解决方案1】:

你的问题不够清楚,所以我猜你想做的是执行 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

如果请求的 ID 不存在,则返回 NULL

编辑

根据您的 cmets 中的说明,以下查询应该可以正常工作:

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

此查询将生成单列单行结果集(即标量值)。该值将是 1 或 0(假设只有一个条目可能具有相同的 id)。如果计数为 0,则该条目不存在。

附注 你执行查询的方式会让你自己受到 SQL 注入攻击。基本上,有人可以给您以下 DataID:0 OR 1 = 1,然后猜猜会发生什么 - 所有 PersonalData 记录都将被删除!

更好的方法是使用准备好的语句。或者至少,绝对确保在将用户输入连接到查询文本之前对其进行清理和验证。

【讨论】:

  • 不,先生,我正在尝试检查 ID 是否存在,然后再删除通知用户他们必须指定不同的 ID。
  • 这是一个 MS Access 问题,因此 OP 甚至可能没有编写 SQL 语句来进行删除。
  • @Yuck:实际上我是在使用 SQL 语句来删除我的条目。
  • 我应该验证什么?我只检查输入的数字和空字段。 PS。我对安全知之甚少。你的观点对我来说很有趣!
【解决方案2】:

在 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;
...

【讨论】:

  • 这是一段不错的代码。但我还没有尝试过。你认为它适用于 MS Access SQL 吗?
  • @HelpNeeder 不,代码示例是 VBA。我没有意识到你正在使用 C#。同样的原则也适用于 C#; ExecuteNonQuery 方法的返回值告诉你受影响的记录数,所以测试它是否为零。
  • 好的,我会尝试这样做。今晚或明天我会反馈。谢谢。
【解决方案3】:

你可以使用VBA的DCount函数:

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

如果这是0,那么您知道该记录不存在并且可以通知用户。

【讨论】:

    猜你喜欢
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 2011-05-18
    • 1970-01-01
    • 2017-11-07
    • 1970-01-01
    相关资源
    最近更新 更多