Выяснить Last_Insert_Id () Используя c # и MySql хранимую процедуру (в уровне доступа к данным MVC) - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть ошибка, когда я использую хранимую процедуру MySql и
Уровень доступа к данным (MVC) имеет метод, используемый для чтения данных из базы данных, используя MySqlDataAdapter и MySqlParameter и DataTable для чтенияданные с именем storedata я тестировал этот метод ранее в контроллере входа в систему, и он также работает: основная ошибка здесь, когда мне нужно сохранить последний accountId с помощью функции MySql last_insert_id(), но он всегда возвращает нулевое значение, в которое я пытался преобразовать егоint затем добавляет 1 при каждом открытии формы, но это бесполезно, поскольку возвращает ошибку

System.ArgumentException: «accountId параметра» не найден в коллекции. '

вот метод на уровне доступа к данным, который я использую для хранения данных из базы данных

 public DataTable storeData(string trChannel,MySqlParameter[] list_OF)
    {
            InitializeDb();// Database configration method 
            MySqlCommand Transmeter = new MySqlCommand
            {
                CommandType = CommandType.StoredProcedure,
                CommandText = trChannel,
                Connection = dbcon  // dbcon its Connection string comming from DAL
            };


            if (list_OF != null)
            {
                Transmeter.Parameters.AddRange(list_OF);
            }


            MySqlDataAdapter massenger = new MySqlDataAdapter(Transmeter);

            DataTable _mainContainer = new DataTable();
            massenger.Fill(_mainContainer);
            disConnect();
            return _mainContainer;

        }

Хранимая процедура, которую я использовал таким образом, после того, как я попытался использовать last_insert_id () и мне это не удалосья изменяю sp на это и его работу и выдаю мне результат, когда я вызываю его внутри MySQL Server

CREATE DEFINER=`root`@`localhost` PROCEDURE `getAccountId`(out accountId int(5))BEGIN select Max(acotId)from accounts;set @accountId=last_insert_id(acotId); END

В этом случае сервер собирается выдать ошибку

Неизвестный «acotId» в списке полей

, но мне не нужно это исправлять, потому что он дает мне результат, поэтому, когда я вызывал эту процедуру внутри приложения, используя метод, который возвращаетзначение DataTable дает первую ошибку, которую я написал до System.ArgumentException: 'Parameter 'accountId' not found in the collection.', для записи, которую я получил более чем пятью методами, содержит одну и ту же ошибку, большинство из них с входным или выходным параметром и большинство без ..

  public DataTable getAcotId()
    {
        DataTable pdbContainer = new DataTable();
        pdbContainer = _socket.storeData("getAccountId",null);//_socket it's a link to data access layer
        return pdbContainer;
    }

Я попробовал также метод, подобный этому, с параметром, и он также не работает

    public DataTable getCusttId()
    {
        MySqlParameter[] parCut = new MySqlParameter[1];
        parCut[0] = new MySqlParameter("?custId", MySqlDbType.Int16, 5) ;
        parCut[0].Direction = ParameterDirection.Output;
        DataTable pdbContainer = new DataTable();
        pdbContainer = _socket.storeData("getCustomerId", parCut);
        return pdbContainer;
    }

Наконец, я хочу преобразовать результат этих методов в int, и я думаю об использовании этого кода

int customerFinalId = getCustId.Rows.Fields[i].Feilds<int>("custId")

Это все, ребята, и мне очень нужна немедленная помощь для более необходимого

Большое спасибо за помощь ..

Ответы [ 3 ]

0 голосов
/ 28 ноября 2018

Есть несколько проблем с вашим кодом

  1. Вы должны предоставить все параметры, которые ожидает ваш SP, иначе он просто выдаст ошибку.Поскольку у вас нет попыток поймать ваш SP, весь ваш запрос будет отправлен после первой ошибки.

  2. @ accountId - переменная sql, и вам нужно объявить, что если вы хотите ее использовать

  3. last_insert_id не принимает никаких параметров, если вы не хотите установить их явнокоторый разрушает всю цель этого в вашем примере.
0 голосов
/ 07 декабря 2018

Ответ здесь - второй метод getCusttId, заменяющий ? на @, который работает для меня.

0 голосов
/ 28 ноября 2018

Вы получили MySQL, это проблема для этой проблемы.Очень часто вам нужно выяснить «Первичный ключ того, что вы только что вставили».Обычно для обновления пользовательского интерфейса (G).

Если бы это был SQL, предложение OUTPUT было бы вашим другом.Одна только эта вещь стоит своего следа памяти в золоте.Но MySQL не имеет никакого эквивалентного синтаксиса.Это означает, что вы должны сделать это трудным путем.

При вычислении этого значения очень важно защититься от условий гонки.Надежный способ - заменить неявные блокировки транзакций и таблиц в операторе DML на явные, которые охватывают как оператор DML, так и нижеследующий DQL (SELECT).

К сожалению, в MySQL я не настолько солиденСинтаксис, так что кто-то еще должен будет дать вам точный код.

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