如何检查C#中数据库表中是否存在ID?

时间:2011-11-30 17:46:03

标签: c# sql ms-access

我正在尝试按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();
}

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

您可以使用VBA的DCount功能:

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

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

答案 2 :(得分:3)

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

修改

根据您的评论中的说明,以下查询应该可以正常运行:

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

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

<强> P.S。 您执行查询的方式是自己打开SQL注入攻击。基本上,有人可以给你以下DataID:0 OR 1 = 1并猜测会发生什么 - 所有PersonalData记录都将被删除!

更好的方法是使用准备好的陈述。或者至少,在将用户输入连接到查询文本之前,请务必确保清理并验证用户输入。

相关问题