用c#调用mysql存储过程出错.提示如下:
“检测到 PInvokeStackImbalance
Message: 对 PInvoke 函数“MySQLDriverCS!MySQLDriverCS.CPrototypes::mysql_real_escape_string”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。”
C#调用代码如下:
          
            MySQLConnectionString str= new MySQLConnectionString("localhost", "abc", "root", "root");
            MySQLConnection conn = new MySQLConnection(str.AsString);            conn.Open();            MySQLCommand comm = new MySQLCommand();
            comm.Connection = conn;
            comm.CommandText = "pro_Insert";//存储过程名称
            comm.CommandType = CommandType.StoredProcedure;            MySQLParameter par1 = new MySQLParameter("?sUserName", "a");
            comm.Parameters.Add(par1);            MySQLParameter par2 = new MySQLParameter("?sUserPass", "a");
            comm.Parameters.Add(par2);            MySQLParameter par3 = new MySQLParameter("?iID", 0);
            par3.Direction = ParameterDirection.Output;
            comm.Parameters.Add(par3);
            int rev=comm.ExecuteNonQuery();            int id = Convert.ToInt32(par3.Value);            MessageBox.Show(id.ToString());
存储过程代码如下:
CREATE PROCEDURE `pro_Insert`(
in sUserName varchar(45),
in sUserPass varchar(45),
out iID int)
BEGIN
  insert into `abc`.`t1` (
  UserName,
  UserPass)
  values(
  sUserName,
  sUserPass);
  set iID=@@IDENTITY;
  select iID;
END代码只是实现了简单的数据插入,并返回新数据的ID(自动编号),在MYSQL下直接调用存储过程没有问题,但代码中会保持。
另:使用MySQLDriverCS.dll

解决方案 »

  1.   

    http://topic.csdn.net/t/20060509/11/4738192.html
    看看能解决不?
      

  2.   

    没人在.net下用mysql吗?郁闷。
      

  3.   

    “检测到 PInvokeStackImbalance 
    Message: 对 PInvoke 函数“MySQLDriverCS!MySQLDriverCS.CPrototypes::mysql_real_escape_string”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。” 
    这种错误没遇见过,不过个人建议不用MySQLDriverCS.dll
    只用MySql.Data.dll看有没有这样的错误。因为:原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配---这句话
      

  4.   

    最新发现,用ODBC.NET可以,但用MySQLDriverCS.dll 就是不行,或许真的是MySQLDriverCS.dll 
    的原因。