Проект C # ASP с использованием MySQL 5.5 — синтаксис запроса параметров

#c# #mysql #syntax

#c# #mysql #синтаксис

Вопрос:

Некоторые из моих запросов работают с другим синтаксисом для параметризованных запросов, и, похоже, я не могу разобраться с синтаксисом для параметризованных запросов для C #, MySQL 5.5.

Например, какой синтаксис для:

 SELECT * FROM tablename WHERE (column1 = @param1) AND (column2 = @param2)
  

Является ли @parametername правильным способом их объявления? После мне просто нужно было бы:

 sqlquery.Parameters.AddWithValue("@param1", 'apples');
sqlquery.Parameters.AddWithValue("@param2", 'oranges');
  

При использовании запроса, который использует подзапросы и псевдонимы в предложении select, требуется другой синтаксис параметров в предложении where?

Спасибо.


Редактировать:

Хорошо, это запрос, с которым у меня возникли проблемы:

 SELECT postcode, suburb, streetname, categorycode, DATE_FORMAT(dateRecorded, '%d/%m/%Y') AS 'Date Recorded', DATE_FORMAT(dateLastModified, '%d/%m/%Y') AS 'Date Last Modified', status FROM incidentdetails WHERE (postcode = @postcode) AND (suburb = @suburb) AND (categorycode = @categorycode) AND (status = @status)
  

Я добавляю параметры:

     sqlFillRelated.Parameters.AddWithValue("@postcode", int.Parse(PostcodeTxtBox.Text.ToString()));
    sqlFillRelated.Parameters.AddWithValue("@suburb", SuburbTxtBox.Text.ToString());
    sqlFillRelated.Parameters.AddWithValue("@categorycode", IncidentTypeDropList.Text.ToString());
    sqlFillRelated.Parameters.AddWithValue("@status", "Open");
  

Если я удалю предложение WHERE, запрос вернет таблицу, как ожидалось, но только кажется, что эти параметры не обрабатываются, потому что он всегда возвращает пустой набор. Я могу точно скопировать запрос и запустить его без проблем через server Explorer, добавив параметры вручную.

     string sqlFILL = "SELECT postcode, suburb, streetname, categorycode, DATE_FORMAT(dateRecorded, '%d/%m/%Y') AS 'Date Recorded', DATE_FORMAT(dateLastModified, '%d/%m/%Y') AS 'Date Last Modified', status FROM incidentdetails WHERE (postcode = @postcode) AND (suburb = @suburb) AND (categorycode = @categorycode) AND (status = @status)";
    string sql = "SELECT COUNT(*) FROM incidentdetails WHERE (postcode = @postcode) AND (suburb = @suburb) AND (categorycode = @categorycode) AND (status = @status)";
    MySqlConnection mycon = new MySqlConnection(sqlconnection);
    mycon.Open();
    MySqlCommand selectRelatedCmd = new MySqlCommand(sql, mycon);
    MySqlCommand sqlFillRelated = new MySqlCommand(sqlFILL, mycon);
    int matches = 0;
    selectRelatedCmd.Parameters.AddWithValue("@postcode", int.Parse(PostcodeTxtBox.Text.ToString()));
    selectRelatedCmd.Parameters.AddWithValue("@suburb", SuburbTxtBox.Text.ToString());
    selectRelatedCmd.Parameters.AddWithValue("@categorycode",IncidentTypeDropList.Text.ToString());
    selectRelatedCmd.Parameters.AddWithValue("@status", "Open");
    sqlFillRelated.Parameters.AddWithValue("@postcode", int.Parse(PostcodeTxtBox.Text.ToString()));
    sqlFillRelated.Parameters.AddWithValue("@suburb", SuburbTxtBox.Text.ToString());
    sqlFillRelated.Parameters.AddWithValue("@categorycode", IncidentTypeDropList.Text.ToString());
    sqlFillRelated.Parameters.AddWithValue("@status", "Open");


    matches = int.Parse(selectRelatedCmd.ExecuteScalar().ToString());
    if (matches == 0)
    {
        matchingIncidentPanel.Visible = false;  
    }
    else if (matches >= 1)
    {
        matchingIncidentPanel.Visible = true;
    }

    MySqlDataAdapter da = new MySqlDataAdapter(sqlFILL, mycon);
    DataTable table = new DataTable();
    table.Locale = System.Globalization.CultureInfo.InvariantCulture;
    da.Fill(table);
    g.DataSource = table;
    g.DataBind();

    mycon.Close();
  

Ответ №1:

MySQL connector использует? вместо @ для обозначения имен параметров.

Попробуйте вот так:

 SELECT * FROM tablename WHERE (column1 = ?param1) AND (column2 = ?param2)
  

Документация MySQL

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

Комментарии:

1. Я пробовал это, но тогда некоторые из моих запросов не работали должным образом. Я использую MySQL 5.5 и только что нашел в документации пример использования @ parameters, но, похоже, они также не работают должным образом в моих запросах … dev.mysql.com/doc/refman/5.5/en /…

2. Я отредактировал свой оригинальный пост с дополнительным кодом. Спасибо.

3. Я попытаюсь протестировать предоставленный вами код. Мне это кажется совершенно нормальным, поэтому без тестирования я больше не могу вам помочь.

Ответ №2:

Оказывается, имена параметров были в порядке, но команда просто не инициализировалась. Теперь у меня есть работающий код, как показано ниже — спасибо за помощь :).

     public void getRelated()
{
    string sqlFILL = "SELECT incidentID, postcode AS Postcode, suburb AS Suburb, streetname AS Street, categorycode AS Category, DATE_FORMAT(dateRecorded, '%d/%m/%Y') AS 'Date Recorded', DATE_FORMAT(dateLastModified, '%d/%m/%Y') AS 'Date Last Modified', status AS Status FROM incidentdetails WHERE ((postcode = @postcode) AND (suburb = @suburb) AND (categorycode = @categorycode) AND (status = @status))";

    MySqlConnection mycon = new MySqlConnection(sqlconnection);
    MySqlDataAdapter da = new MySqlDataAdapter();
    mycon.Open();
    MySqlCommand sqlFillRelated = mycon.CreateCommand();

    sqlFillRelated.Parameters.AddWithValue("@postcode", int.Parse(PostcodeTxtBox.Text.ToString()));
    sqlFillRelated.Parameters.AddWithValue("@suburb", SuburbTxtBox.Text.ToString());
    sqlFillRelated.Parameters.AddWithValue("@categorycode", IncidentTypeDropList.Text.ToString());
    sqlFillRelated.Parameters.AddWithValue("@status", "Open");

    sqlFillRelated.CommandText = sqlFILL;
    da.SelectCommand = sqlFillRelated;

    DataSet ds = new DataSet();
    da.Fill(ds);
    g.DataSource = ds;
    g.DataBind();
    mycon.Close();
}