Запрос на замену имени столбца на @variable - PullRequest
2 голосов
/ 15 марта 2019

Я пытаюсь разработать приложение на C # WPF и пытаюсь установить имя столбца в запросе как @variable.Я объясняю, у меня есть comboBox с некоторыми опциями.Эти параметры являются именами моей колонки.Когда я выбираю один из этих вариантов, я должен написать в текстовом поле слово.И когда я нажимаю на кнопку проверки, функция, которая выполняет отображение таблицы, нуждается в двух параметрах: значение поля со списком и текстовое поле.И хотел бы знать, могу ли я сделать запрос как

SELECT * FROM customer WHERE @boxContent = @text

Я думаю, что это проблема.

Вот мой код для xml.cs:

private void Button_Click_1(object sender, RoutedEventArgs e)
{
        //InitializeComponent();
        text = testBox.Text;
        afficheListe.ListeModif(text,boxContent);
    }

    private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (ID.IsSelected)
        {
            boxContent = "id_client";
        }
        else if (Nom.IsSelected)
        {
            boxContent = "nom";
        }
        else if (Prenom.IsSelected)
        {
            boxContent = "prenom";
        }
        else if (Sexe.IsSelected)
        {
            boxContent = "sexe";
        }
        else if (DateNaissance.IsSelected)
        {
            boxContent = "date_Naiss";
        }
        else if (Mail.IsSelected)
        {
            boxContent = "mail";
        }
        else if (Adresse.IsSelected)
        {
            boxContent = "adresse";
        }
        else if (Pays.IsSelected)
        {
            boxContent = "pays";
        }
}

Вот мой код для функции запроса:

public void ListeModif(string text, string boxContent)
{
        bdd.connection.Open();

        MySqlCommand cmd = bdd.connection.CreateCommand();
        cmd.Parameters.AddWithValue("@text", text);
        cmd.Parameters.AddWithValue("@boxContent", boxContent);

        cmd.CommandText = " SELECT * FROM client WHERE @boxContent = @text";

        MessageBox.Show(cmd.ToString());

        cmd.ExecuteNonQuery();

        MySqlDataReader reader = cmd.ExecuteReader();

        clients.Clear();

        while (reader.Read())
        {
            clients.Add(new Client()
            {
                Id = Convert.ToInt32(reader["id_Client"]),
                Nom = Convert.ToString(reader["nom"]),
                Prenom = Convert.ToString(reader["prenom"]),
                Sexe = Convert.ToString(reader["sexe"]),
                Date_Naissance = Convert.ToDateTime(reader["date_Naiss"]),
                Mail = Convert.ToString(reader["mail"]),
                Adresse = Convert.ToString(reader["adresse"]),
                Pays = Convert.ToString(reader["pays"])
            });
        }

        reader.Close();

        bdd.connection.Close();
}

Когда я использую отладчик, значение переменной cmd равно:

MySql.Data.MySqlClient.MySqlCommand}

Надеюсь, я объяснилмоя проблема хорошо.

Ответы [ 2 ]

1 голос
/ 15 марта 2019

Нет, это не так. Вы не можете динамически заменять имя столбца таким образом. Скорее вы можете сделать, как показано ниже и заменить значение boxContent переменная

cmd.CommandText = $"SELECT * FROM client where {boxContent} = @text ";

Если вы используете версию C # ниже 6, тогда используйте string.Format()

cmd.CommandText = string.Format("SELECT * FROM client where {0} = @text ", boxContent);
1 голос
/ 15 марта 2019

И хотел бы знать, могу ли я сделать запрос, например

"SELECT * FROM customer где @boxContent = @text"

Нет, вы не можете.В SQL (как правило, не только в SQL Server) вы можете заменить константа значения параметрами.Вы не можете заменить другие типы значений:

  • Идентификаторы (имена таблиц, имена столбцов и т. Д.)
  • Операторы
  • Имена функций
  • SQLключевые слова

Другими словами, замена параметра - это , а не замена строки.Вы можете сделать это в приложении, когда создаете строку запроса.Но вы не можете передать значение в качестве параметра.Примечание: Будьте осторожны, делая это в приложении, потому что код подвергается атакам SQL-инъекций.

Иногда я выполняю замену идентификатора, выполняя что-то вроде:

SET @SQL = 'SELECT * FROM customer where @boxContent = @text';

SET @SQL = REPLACE(@SQL, '@boxContent', @boxContent);

(Это T-SQL синтаксис.) То есть значение заменяется до выполнения запроса.

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

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