Ошибка при проверке наличия идентификатора в файле базы данных - PullRequest
1 голос
/ 06 декабря 2011

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

Все это делается в TextChanged функции textobx.

Проблема в том, что я получаю ошибкуи так как запрос выглядит хорошо, я не уверен, почему я вижу это: 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;
}

Ответы [ 4 ]

3 голосов
/ 06 декабря 2011

Я думаю, что ваш выбор отсутствует некоторые столбцы, которые вы хотите извлечь ??

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

Разве это не должно быть что-то вроде:

string sql = string.Format
    ("SELECT * FROM PersonalData WHERE [DataID] = {0}", dataID);
2 голосов
/ 06 декабря 2011

Вам не хватает того, что выбрать

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

Изменить на что-то вроде

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

И: вы открыты для SQL-инъекций так, как вы строите свой запрос.

2 голосов
/ 06 декабря 2011

Вам необходимо указать что-то в предложении SELECT.Я думаю:

SELECT DataID FROM PersonalData WHERE ...
1 голос
/ 06 декабря 2011

Проблема с этой строкой кода:

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

Дополнительная информация:

Если этот метод используется в Интернете, скажем, извлечение идентификатора из строки запроса, то вы оставляете себя открытым для атаки SQL-инъекцией .Небольшая модификация вашего кода решит проблему:

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

using (OleDbCommand command = new OleDbCommand(sql, connection))
        {
            command.Parameters.AddWithValue("@DataID", dataID);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...