使用c#和MySql存储过程(在数据访问层MVC中)找出Last_Insert_Id()

时间:2018-11-28 15:03:52

标签: c# mysql model-view-controller

使用MySql存储过程和
时出现错误 数据访问层(MVC)有一种方法,使用MySqlDataAdapterMySqlParameterDataTable来读取数据库中的数据,称为storedata。登录控制器,它也可以正常工作:这里的主要错误是当我需要使用MySql last_insert_id()函数存储最后一个accountId时,它总是返回null值,我尝试将其转换为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更改为this及其工作,并在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值的方法在应用程序内部调用此过程时,会给出我在{{之前1}}根据记录,我得到了五个以上的方法包含相同的错误,其中大多数带有输入或输出参数,而大多数没有..

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;
    }

最后,我想将这种方法的结果转换为int,我考虑使用此代码

    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;
    }

这就是所有人,我迫切需要获得更多帮助的紧急帮助

非常感谢您对我的帮助。

3 个答案:

答案 0 :(得分:0)

您有MySQL,这是此问题的问题。通常需要弄清楚“您刚刚插入的东西的主键”。通常用于更新(G)UI。

如果这是SQL,则OUTPUT clause将成为您的朋友。单单这件事就值得它在黄金中的记忆足迹。但是MySQL没有任何等效的语法。这意味着您必须艰苦地做。

弄清楚这个值时,防范比赛条件非常重要。可靠的方法是用一个显式的替换DML语句的隐式事务和表锁,该锁同时覆盖DML语句和随后的DQL Satement(SELECT)。

不幸的是,我对MySQL语法的了解不那么强,所以其他人将不得不给您确切的代码。

答案 1 :(得分:0)

您的代码存在多个问题

  1. 您需要提供SP期望的所有参数,否则它将出错。由于您没有尝试捕获SP的权限,因此整个查询将在第一个错误时失败。

  2. @accountId是一个sql变量,如果要使用它,则需要声明它

  3. last_insert_id不带任何参数,除非您想显式设置它,这会破坏示例中的整个目的。

答案 2 :(得分:0)

答案是getCusttId?代替@的第二种方法。