Недопустимый синтаксис рядом с ',' - ошибка SQL C # - PullRequest
0 голосов
/ 20 августа 2010

Я получаю следующую ошибку: (C # WinForms)

"Недопустимый синтаксис рядом с", ""

У меня следующий код:

    // Initialize and instantiate a new reader object.
    SqlDataReader slrr = null;
    // Send command.
    System.Data.SqlClient.SqlCommand command = new System.Data.SqlClient.SqlCommand("SELECT ActivationCode FROM CAccounts WHERE ActivationCode=" +
    _activationcode, connection);

    slrr = command.ExecuteReader();

    // read result(s) of command.
    while (slrr.Read())
    {
        if (slrr["ActivationCode"].ToString() == _activationcode.Text)
        {
            stat.Text = "It appears that these details have already been registered.";
            Properties.Settings.Default.GU = false;
            Properties.Settings.Default.Save();
        }
        else
        {
            System.Data.SqlClient.SqlCommand comm = new System.Data.SqlClient.SqlCommand(
                "INSERT INTO CAccounts (FirstName, LastName, Country, Gender, EmailAddress, ActivationCode, ClientID, IsActivated) VALUES ('" +
                _firstname.Text + "', '" + _lastname.Text + "', '" + _country.Text + "', '" + gender + "', '" +
                _email.Text + "', '" + _activationcode.Text + "', '" + _clientid.Text + "', '" + "yeh'", connection);

            comm.ExecuteNonQuery();

            stat.Text = "Product Activation succeeded.";
            Properties.Settings.Default.GU = true;
            Properties.Settings.Default.FirstName = _firstname.Text;
            Properties.Settings.Default.LastName = _lastname.Text;
            Properties.Settings.Default.Country = _country.Text;
            Properties.Settings.Default.Gender = gender;
            Properties.Settings.Default.DateOfBirth = _dateofbirth.Text;
            Properties.Settings.Default.EmailAddress = _email.Text;
            Properties.Settings.Default.ActivationID = _activationcode.Text;
            Properties.Settings.Default.ClientID = _clientid.Text;
            Properties.Settings.Default.IsActivated = true;
            Properties.Settings.Default.Save();
        }
    }
}
catch (Exception exception)
{
    // Catch the exception and throw an error.
    stat.Text = exception.Message;
}

Я понятия не имею, что я сделал неправильно.Может кто-нибудь помочь мне?

Ответы [ 3 ]

3 голосов
/ 20 августа 2010

Подумайте о строке кода, в которой вы строите команду INSERT. Как вы думаете, что произойдет, если какое-либо из полей будет содержать апостроф?

Вы догадались, утверждение становится недействительным.

Вы можете решить эту проблему, используя SqlCommand.Parameters . Смотрите пример на этой странице.

Конечно, то же самое относится и к команде SELECT в верхней части фрагмента кода.

0 голосов
/ 20 августа 2010

Если IsActivated является каким-либо логическим значением, допустимо ли 'yeh'? Я хотел бы начать с построения команды SQL в строковую переменную и распечатать ее. Что-то идет не так во всей конкатенации. Вывод строки SQL перед передачей в объект команды должен сделать ошибку очевидной.

Я не эксперт по C #, но разве нет лучшего способа взять список строк, заключить их в кавычки и объединить результат, используя "," в качестве разделителя? Что-то вроде следующего фрагмента Python делает построение строк SQL намного менее подверженным ошибкам:

>>> s = str.join(', ', ("'{0}'".format(x) for x in ['bob', 'alex', 'guido']) )
>>> print s
'bob', 'alex', 'guido'

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

0 голосов
/ 20 августа 2010

Вместо:

"', '" + "yeh'", connection);

Это должно быть:

"', '" + "yeh')", connection);

Вы забыли закрыть скобку VALUES, поэтому.

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