Можно ли использовать MySql User Defined Variable в .NET MySqlCommand?
Я пытаюсь выполнить запрос, который в настоящее время работает в phpMyAdmin, но он не работает при выполнении его в .NET с помощью MySqlAdapter. Это оператор Sql.
SELECT @rownum := @rownum +1 rownum, t . *
FROM (
SELECT @rownum :=0
) r, (
SELECT DISTINCT
TYPE FROM `node`
WHERE TYPE NOT IN ('ad', 'chatroom')
)t
Использует @rownum для номера каждой отдельной строки, возвращаемой из моего внутреннего скалярного запроса. Но если я использую его в .NET, он предполагает, что @rownum является параметром и выбрасывает исключение, потому что я его не определял.
using (var sqlConnection = new MySqlConnection(SOURCE_CONNECTION))
{
sqlConnection.Open();
MySqlDataAdapter sqlAdapter = new MySqlDataAdapter(SqlStatement, sqlConnection);
DataTable table = new DataTable();
sqlAdapter.Fill(table);
sqlConnection.Close();
return table;
}
Любые идеи о том, как я могу обойти эту проблему? Или возможные способы получить номер строки?
Ответы
Ответ 1
Я нашел этот blog, в котором говорится, что с более новыми версиями .net Connector вы должны добавить
;Allow User Variables=True
в строку подключения.
Сравните мой вопрос SO Как использовать MySql User Defined Variable в .NET MySqlCommand?
Ответ 2
Какую версию поставщика данных MySQL вы используете? Возможно, вам придется обновить.
Я нашел это в 5.0 документации:
Предыдущие версии поставщика использовали символ "@" для отметки параметров в SQL. Это несовместимо с переменными пользователя MySQL, поэтому поставщик теперь использует '?' символ для нахождения параметров в SQL. Чтобы поддерживать старый код, вы можете установить "старый синтаксис = да" в строке подключения. Если вы это сделаете, помните, что исключение не будет выбрано, если вы не сможете определить параметр, который вы собираетесь использовать в своем SQL.
Ответ 3
Вы можете добавить столбец в свою таблицу под названием rownum, а затем заполнить его значениями:
table.Columns.Add("rownum");
for (int i=0; i < table.Rows.Count; i++)
{
table.Rows[i]["rownum"] = i;
}