使用MySql存储过程和
时出现错误
数据访问层(MVC)有一种方法,使用MySqlDataAdapter
和MySqlParameter
和DataTable
来读取数据库中的数据,称为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;
}
这就是所有人,我迫切需要获得更多帮助的紧急帮助
非常感谢您对我的帮助。
答案 0 :(得分:0)
您有MySQL,这是此问题的问题。通常需要弄清楚“您刚刚插入的东西的主键”。通常用于更新(G)UI。
如果这是SQL,则OUTPUT clause将成为您的朋友。单单这件事就值得它在黄金中的记忆足迹。但是MySQL没有任何等效的语法。这意味着您必须艰苦地做。
弄清楚这个值时,防范比赛条件非常重要。可靠的方法是用一个显式的替换DML语句的隐式事务和表锁,该锁同时覆盖DML语句和随后的DQL Satement(SELECT)。
不幸的是,我对MySQL语法的了解不那么强,所以其他人将不得不给您确切的代码。
答案 1 :(得分:0)
您的代码存在多个问题
您需要提供SP期望的所有参数,否则它将出错。由于您没有尝试捕获SP的权限,因此整个查询将在第一个错误时失败。
@accountId是一个sql变量,如果要使用它,则需要声明它
答案 2 :(得分:0)
答案是getCusttId
用?
代替@
的第二种方法。