1 Востаннє редагувалося Betterthanyou (27.04.2020 08:51:21)

Тема: MySql Змінні, Parameter '@j' must be defined.

В запиті використовується оголошення змінних @j та @i, тобто це не параметри якi потрібно замінити, це оголошені mysql змінні. Але MySqlCommand напевно вважає їх за параметри, тому що видає виняток Parameter '@j' must be defined.

public DataTable GetStatistics()
        {
            MySqlCommand mySqlCommand = new MySqlCommand();
            mySqlCommand.Connection = db.mySqlConnections;

            mySqlCommand.CommandText =
            "SELECT count(Id_) " +
            "INTO @j " +
            "FROM FinancialTransaction_ " +
            "WHERE KeyToRecipient_ " +
            "IN(60); " +
            "SET @i := 0; " +
            "SELECT " +
            "AVG(Sum_) " +
            "FROM " +
            "( " +
            "SELECT " +
            "@i:= @i + 1, " +
            "FLOOR(@i / (@j / (6 - 1))) AS `group_id`, " +
            "Sum_, " +
            "Date_ " +
            "FROM " +
            "FinancialTransaction_ " +
            "WHERE KeyToRecipient_ IN(60) " +
            "ORDER BY " +
            "Date_ ASC " +
            ") AS tab1 " +
            "GROUP BY " +
            "group_id;";

            MySqlDataReader result = mySqlCommand.ExecuteReader();
            var dt = new DataTable();
            dt.Load(result);
            return dt;
        }

Як виконати запит записаний mySqlCommand.CommandText не використовуючи mysql функцій чи процедур ?

2 Востаннє редагувалося koala (27.04.2020 10:00:49)

Re: MySql Змінні, Parameter '@j' must be defined.

Трохи погуглив - схоже, там дійсно дещо різний синтаксис у різних бібліотеках. Спробуйте

SET @j = (SELECT count(Id_) FROM FinancialTransaction_ WHERE KeyToRecipient_ IN(60))

3 Востаннє редагувалося Betterthanyou (27.04.2020 10:37:33)

Re: MySql Змінні, Parameter '@j' must be defined.

koala написав:

Трохи погуглив - схоже, там дійсно дещо різний синтаксис у різних бібліотеках. Спробуйте

SET @j = (SELECT count(Id_) FROM FinancialTransaction_ WHERE KeyToRecipient_ IN(60))

Щойно спробував виконати.

Весь запит, окремо запит (тільки @j частина) та спробував замінити "@j =" на "@j :=" - все це дає ту ж саму помилку
Навіть якщо написати

SET @j = 1;

або

SET @j := 1;

та сама помилка

Подякували: koala1

4

Re: MySql Змінні, Parameter '@j' must be defined.

https://stackoverflow.com/questions/225 … be-defined

Треба додати Allow User Variables=True у рядок з'єднання, щоб використовувати змінні. На кшталт:

Database=testdb;Data Source=localhost;User Id=root;Password=hello;Allow User Variables=True
оригінал (англ.)

You need to add Allow User Variables=True in the connection string in order to use custom variables.

Подякували: Betterthanyou, leofun012

5

Re: MySql Змінні, Parameter '@j' must be defined.

Betterthanyou написав:

...не використовуючи mysql функцій чи процедур ?

А чому саме так? Бо на мою думку збережена процедура тут гарно б прилаштувалася.

Щодо помилки (не працюю з С#), але спробуйте:

Allow User Variables=True

Люди пишуть, що допомагає - http://blog.tjitjing.com/index.php/2009 … fined.html

Подякували: koala, Betterthanyou, leofun013

6

Re: MySql Змінні, Parameter '@j' must be defined.

Так, працює

7 Востаннє редагувалося Betterthanyou (27.04.2020 11:03:19)

Re: MySql Змінні, Parameter '@j' must be defined.

fed_lviv написав:

А чому саме так? Бо на мою думку збережена процедура тут гарно б прилаштувалася.

Наперед не відомо де саме буде стояти серверна програма, в серверній програмі є sql файл який встановить всі таблиці та зв'язки між ними (схему). Та ще один файл з процедурами, функціями і вюшками. Якщо раптом другий файл не встановиться, або якась процедура не буде знайдена, програма виконає метод з серверу (тобто sql запит), для того щоб замінити неіснуючу sql функцію.

8

Re: MySql Змінні, Parameter '@j' must be defined.

Betterthanyou написав:

...Якщо раптом другий файл не встановиться, або якась процедура не буде знайдена...

*SCRATCH*  не дуже зрозумів, де саме може "загубитися" умовний "другий" файл, але то таке...

Використовуйте міграції для БД, щось типу Liquibase, Flyway або що там є для С#... аби все чого немає створювалося.

Подякували: Betterthanyou1