C# - Windows Формы - SQLite - PullRequest
       76

C# - Windows Формы - SQLite

0 голосов
/ 03 августа 2020

это мой код. Я хочу проверить, активирована ли учетная запись. В моей базе данных активировано облако. Если есть NULL, это не активировано. Если 1, он активирован. Но если я добавляю значение в переменную «имя пользователя», появляется ошибка «SQLite error (1): no such column: Lucas in« SELECT benutzername, aktivierung FROM anmeldung WHERE benutzername = Lucas AND aktivierung IS NULL ».

string username = txtbox_benutzername.Text;
        lookActivate(username);
        if (variable.aktivierung == 1)
        {
            MessageBox.Show("variable.aktivierung");
            variable.aktivierung = 0;
        }
public static void lookActivate(string username)
    {
        try
        { 
            string cs = @"URI=file:C:/Users/lucas/source/repos/Anmelddung/Anmelddung/database.db";

            var con = new SQLiteConnection(cs);
            con.Open();
            const string quote = "\"";
            string stm = "SELECT benutzername, aktivierung FROM anmeldung WHERE benutzername=" + username + " AND aktivierung IS NOT NULL";
            Console.WriteLine(stm);
            var cmd = new SQLiteCommand(stm, con);
            SQLiteDataReader rdr = cmd.ExecuteReader();


            while (rdr.Read())
            {
                username = rdr.GetString(0);
                variable.aktivierung = rdr.GetInt32(1);
                Console.WriteLine(username, variable.aktivierung);
                MessageBox.Show($"{rdr.GetString(0)} {rdr.GetInt32(1)}");
            }
        }
        catch
        {
            MessageBox.Show("Ihr Konto wurde wohl noch nicht von einem Administrator freigegeben");
        }
    }
    static class variable
    {
        public static int aktivierung;
    }

1 Ответ

3 голосов
/ 03 августа 2020

Ваш код не работает, потому что вам не хватает одинарных кавычек вокруг строки, которую вы объединяете в запрос sql, поэтому SQLite принимает его как имя столбца, а не буквальную строку.

Вы должны просто использовать параметризованный запрос. Это обрабатывает экранирование для вас под капотом, предотвращает внедрение SQL и делает ваш код более простым и эффективным:

var con = new SQLiteConnection(cs);
con.Open();
string stm = "SELECT benutzername, aktivierung FROM anmeldung WHERE benutzername= ? AND aktivierung IS NOT NULL";
Console.WriteLine(stm);
var cmd = new SQLiteCommand(stm, con);
cmd.Parameters.Add(username, SqlDbType.VarChar);
SQLiteDataReader rdr = cmd.ExecuteReader();

Возможно, вам потребуется адаптировать тип sql вашего параметра в соответствии с фактическим тип данных столбца вашей базы данных.

...