C # ASP Project с использованием MySql 5.5 - синтаксис запроса параметров - PullRequest
1 голос
/ 25 апреля 2011

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

Например, что такое синтаксисfor:

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, запрос возвращает таблицу, как и ожидалось, но кажется, что эти параметры не выбираются, потому что он всегда возвращает пустой набор.Я могу точно скопировать запрос и без проблем запустить его через обозреватель сервера, добавив параметры вручную.

    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();

Ответы [ 2 ]

0 голосов
/ 26 апреля 2011

Оказывается, с именами параметров все в порядке, но команда просто не инициализировалась.У меня теперь работает код, как показано ниже - спасибо за помощь:).

    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();
}
0 голосов
/ 25 апреля 2011

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

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

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

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

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

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