Запись всегда не существует в моем коде с использованием C # - PullRequest
0 голосов
/ 11 мая 2019

У меня есть часть кода, которую я хочу проверить, существует ли значение, прежде чем я добавлю его в свою базу данных. Результатом всегда является то, что моя запись не существует, а я нет, почему?

public bool IsClientExist(string valuetocheck)
{
    bool result = false;

    try
    {
        string strQuery = "SELECT * FROM [" + strFileNamenopath + "] WHERE client = '"  + valuetocheck + "'";
        OleDbCommand cmd = new OleDbCommand(strQuery, conn);
        OleDbDataReader reader = cmd.ExecuteReader();

        result = reader.Read();

        if (reader.Read())
        {
            result = true;
        }

        reader.Close();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.StackTrace.ToString() + " " + ex.Message);
    }

    return result;
}

РЕДАКТИРОВАТЬ: я получаю ошибку после изменения кода sqlparamers

 public bool IsClientExist(string valuetocheck)

    {
       .....

        SqlParameter param = new SqlParameter
        {
                ParameterName = "@client",
                Value = valuetocheck,
            };


            cmd.Parameters.Add(param);
            var data = cmd.ExecuteScalar();
             result = (int)data > 0;

            }
        catch (Exception ex)
        {
            MessageBox.Show(ex.StackTrace.ToString() + " " + ex.Message);
        }



        return result;

    }

ОШИБКА:

"The OleDbParameterCollection only accepts non-null OleDbParameter type objects, not SqlParameter objects."

EDIT2: проблема связана с одной базой данных (я пытаюсь создать новую, но та же проблема), у меня есть другие базы для проверки значения дубликата, и это просто отлично работает, приведенный ниже код работает со всеми базами данных, кроме этой.

public bool IsRecordExist(string valuetocheck)

    {
        bool result = false;
        try
        {
            string strQuery = "SELECT * FROM [" + strFileNamenopath + "] WHERE code = '" + valuetocheck + "'";
            OleDbCommand cmd = new OleDbCommand(strQuery, conn);
            OleDbDataReader reader = cmd.ExecuteReader();
            if (reader.Read())
            {
                result = true;
            }
            reader.Close();

        }
        catch (Exception ex)
        {
            MessageBox.Show("Duplicate value " + ex.Message);
        }

        return result;

    }

Ответы [ 2 ]

0 голосов
/ 12 мая 2019

Я нашел ответ!

проблема заключается в добавлении записи в базу данных, когда я добавляю «случайно» пробел к имени, поэтому вместо добавления данных, таких как AddData ("New Client"), код был такой AddData (" New Client"), и когда сравнение входных данных в базе данных будет false "New Client" != " New Client"

0 голосов
/ 11 мая 2019

Вы должны изменить свой запрос на скалярный.А также параметризируйте свой запрос, чтобы избежать SQL-инъекций атаки

string strQuery = "SELECT count(*) FROM [" + strFileNamenopath + "] WHERE client = @client";

Использование ExecuteScalar() затем

OleDbCommand cmd = new OleDbCommand(strQuery, conn);
SqlParameter param  = new SqlParameter 
 {
 ParameterName = "@client",
 Value         = valuetocheck,
 };
 cmd.Parameters.Add(param);
var data = cmd.ExecuteScalar();

Установите соответствующий флаг

result = data > 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...