Передача параметров из текстовых полей в строку оператора sql - одинарные кавычки (') убивают меня - PullRequest
1 голос
/ 13 января 2020

После добавления текста в cpr_txtbx, name_txtbx и address_txtbx я конвертирую их в параметры, которые будут использоваться в строке моего оператора. Сервер MySQL, который я использую, хочет использовать синтаксис: «INSERT INTO people (type, cpr, name, address)» VALUES («cpr», «name», «address») »(да, одинарные кавычки) и я я вырываю свои волосы, пытаясь выяснить синтаксис здесь.

Моя кнопка сейчас выглядит так (я знаю, что это неправильно):

        private void add_btn_Click(object sender, RoutedEventArgs e)
    {
        string statement = "INSERT INTO people (type, cpr, name, address)" +
            "VALUES('citizen', ':cpr', ':name', ':address')";
        this.AUD(statement, 0);
        add_btn.IsEnabled = false;
        edit_btn.IsEnabled = true;
        delete_btn.IsEnabled = true;
    }

и AUD:

        private void AUD(string statement, int state)
    {
        string msg = "";
        MySqlCommand cmd = conn.CreateCommand();
        cmd.CommandText = statement;
        cmd.CommandType = CommandType.Text;

        switch (state)
        {
            case 0:
                msg = "Borger tilføjet.";
                cmd.Parameters.Add("cpr", MySqlDbType.Text, 10).Value = cpr_txtbx.Text;
                cmd.Parameters.Add("name", MySqlDbType.Text).Value = name_txtbx.Text;
                cmd.Parameters.Add("address", MySqlDbType.Text).Value = address_txtbx.Text;
                break;
            case 1:
                msg = "Borger modificeret.";
                cmd.Parameters.Add("address", MySqlDbType.Text).Value = address_txtbx.Text;
                break;
            case 2:
                msg = "Borger slettet.";
                cmd.Parameters.Add("cpr", MySqlDbType.Text, 10).Value = cpr_txtbx.Text;
                break;
        }
        try
        {
            int n = cmd.ExecuteNonQuery();
            if ( n > 0 )
            {
                MessageBox.Show(msg);
                this.updateDataGrid();
            }
        }
        catch(MySqlException ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }

, и вот учебник, которым я следую, находится здесь: https://www.youtube.com/watch?v=NiGsgctfiYM

Это ЕДИНСТВЕННАЯ вещь, которую я не могу заставить работать, поэтому любая помощь очень ценится :)

1 Ответ

5 голосов
/ 13 января 2020

Не помещайте заполнители параметров в SQL разделители строк.

Неправильно:

string statement = "INSERT INTO people (type, cpr, name, address)" +
        "VALUES('citizen', ':cpr', ':name', ':address')";

Справа:

string statement = "INSERT INTO people (type, cpr, name, address)" +
        "VALUES('citizen', :cpr, :name, :address)";

Ваш комментарий:

Я еще раз взглянул на видеоурок, который вы используете, и вижу, что он показывает синтаксис Oracle. Имейте в виду, что каждый бренд SQL имеет свой синтаксис, несмотря на использование стандартного языка SQL. Таким образом, вы должны использовать документацию и учебные пособия для бренда, который вы используете.

Я не C# разработчик, поэтому я сначала не заметил, что синтаксис для параметров запроса в MySQL отличается от Oracle.

https://dev.mysql.com/doc/connector-net/en/connector-net-programming-prepared-preparing.html показывает пример, в котором для параметров вместо : используется @. Поэтому я предполагаю, что вы можете исправить свой код, используя этот синтаксис:

string statement = "INSERT INTO people (type, cpr, name, address)" +
        "VALUES('citizen', @cpr, @name, @address)";

Затем добавьте значения:

cmd.Parameters.AddWithValue("@cpr", cpr_txtbx.Text);
cmd.Parameters.AddWithValue("@name", name_txtbx.Text);
cmd.Parameters.AddWithValue("@address", address_txtbx.Text);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...