检查数据库文件中是不是存在 ID 时出错

Posted

技术标签:

【中文标题】检查数据库文件中是不是存在 ID 时出错【英文标题】:Error while checking if ID exists in database file检查数据库文件中是否存在 ID 时出错 【发布时间】:2011-12-06 14:28:45 【问题描述】:

我正在尝试检查某个 ID 是否已存在于数据库中。如果没有,我希望用户将 id 更改为其他内容。

这一切都在 textobx 的TextChanged 函数中完成。

问题是我遇到了一个错误,由于查询看起来不错,我不确定为什么会看到这个:The SELECT statement includes a reserved word or an argument name that is misspelled or missing, or the punctuation is incorrect.

检查方法:

private bool DoesIDExist(int dataID, string filePath)

    HashPhrase hash = new HashPhrase();
    DataTable temp = new DataTable();

    string hashShortPass = hash.ShortHash(pass);
    bool result = false;

    // Creating a connection string. Using placeholders make code
    // easier to understand.
    string connectionString =
        @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=0;
          Persist Security Info=False; Jet OLEDB:Database Password=1;";

    string sql = string.Format
        ("SELECT FROM PersonalData WHERE [DataID] = 0", dataID);

    using (OleDbConnection connection = new OleDbConnection())
    
        // Creating command object.
        // Using a string formatting let me to insert data into
        // place holders I have used earlier.
        connection.ConnectionString =
            string.Format(connectionString, filePath, hashShortPass);

        using (OleDbCommand command = new OleDbCommand(sql, connection))
        
            // Creating command object.
            // Using a string formatting let me to insert data into
            // place holders I have used earlier.
            connection.ConnectionString =
                string.Format(connectionString, filePath, hashShortPass);

            try
            
                // Open database connection.
                connection.Open();

                using (OleDbDataReader read = command.ExecuteReader())
                
                    // Checking if there is any data in the file.
                    if (read.HasRows)
                    
                        // Reading information from the file.
                        while (read.Read())
                        
                            if (read.GetInt32(0) == dataID)
                                return true;
                        
                    
                
            
            catch (Exception ex)
            
                MessageBox.Show("Error: " + ex.Message);
            
        
    

    return result;

【问题讨论】:

【参考方案1】:

我认为您的选择缺少一些您想要提取的列??

string sql = string.Format
    ("SELECT FROM PersonalData WHERE [DataID] = 0", dataID);

不应该是这样的:

string sql = string.Format
    ("SELECT * FROM PersonalData WHERE [DataID] = 0", dataID);

【讨论】:

大声笑。天才的人总是会错过一些小事:P【参考方案2】:

您缺少要选择的内容

string sql = string.Format
    ("SELECT FROM PersonalData WHERE [DataID] = 0", dataID);

改成类似

string sql = string.Format
    ("SELECT * FROM PersonalData WHERE [DataID] = 0", dataID);

而且:您可以像构建查询一样使用 SQL 注入。

【讨论】:

是的。我只是想让它发挥作用。现在我将使用参数。但是,由于我正在检查字段中是否存在空字段、非数字字符或不存在的 ID,因此我相信我是安全的。程序有点简单:)【参考方案3】:

您需要在SELECT 子句中指定一些内容。我猜:

SELECT DataID FROM PersonalData WHERE ...

【讨论】:

【参考方案4】:

问题在于这行代码:

string sql = string.Format
        ("SELECT FROM PersonalData WHERE [DataID] = 0", dataID);

您需要指定要选择的内容。示例:SELECT *SELECT [MyColumn]SELECT TOP 1 * 等。根据您的要求,您正在寻找类似的东西:

string sql = string.Format
 ("SELECT COUNT(*) AS UserCount FROM PersonalData WHERE [DataID] = 0", dataID);

其他信息:

如果在网络上使用此方法,例如从查询字符串中提取一个 ID,那么您将面临 SQL 注入攻击。稍微修改您的代码将解决问题:

string sql = "SELECT FROM PersonalData WHERE [DataID] = @DataID";

using (OleDbCommand command = new OleDbCommand(sql, connection))
        
            command.Parameters.AddWithValue("@DataID", dataID);
        

【讨论】:

@HelpNeeder,太好了!不幸的是,很多人不是。出于存档目的,我尝试在回答中冗长。此外,经过深思熟虑的答案通常会获得更多支持:)

以上是关于检查数据库文件中是不是存在 ID 时出错的主要内容,如果未能解决你的问题,请参考以下文章

检查文件在php中是不是存在正则表达式[重复]

在Java Swing中保存文件时检查文件是不是存在

Google Drive API - 通过文件 ID 检查文件是不是存在

如何检查文件是不是存在于 Firebase 存储中?

Sql出错:日期的语法错误 查询数据的时候发现错误,请检查您的查询代码是不是正确。

检查按钮是不是存在