MySQL存储过程,c#和inout参数

时间:2011-03-02 00:51:42

标签: c# mysql stored-procedures

我有一个存储过程,基本上可以查看交叉引用表中是否存在ID ...如果存在,我想将其恢复。如果没有,我想创建一个新的并将其取回....这里是存储过程:

BEGIN

declare data_found int default 1;
declare l_id int default -1;

declare continue handler for 1329
  set data_found=0;

Set p_unique_id = -1;

begin

  select unique_id, is_default into p_unique_id, p_is_default  from jmax.ids where alt_number=p_alt_num;
end;

if p_unique_id>0 then
   set p_existed=1;
else
  insert into jmax.ids (alt_number,is_default) VALUES (p_alt_num,p_is_default);
  set p_existed=0;
  select unique_id into p_unique_id from jmax.ids where alt_number=p_alt_num;

end if;

END

我在dforge中使用它应该找到的值运行它,它确实设置了我的outparam。

当我在c#中调用它时,我收到一个错误:你的列序数无效......这里是c#:

DBAccess.DBUtils dbObj =   DBAccess.DBUtils.Instance();
        MySqlDataReader theReader;
        MySqlCommand theCommand = new MySqlCommand("TestInOut", dbObj.GetLocalConnection());

        MySqlParameter p_alt_num, p_is_default, p_unique_id, p_existed;
        theCommand.CommandType = CommandType.StoredProcedure;

        p_alt_num = theCommand.Parameters.Add("p_alt_num", MySqlDbType.VarChar);
        p_alt_num.Value = "12044";  //my text value
        p_is_default = theCommand.Parameters.Add("p_is_default", MySqlDbType.Int32);
        p_unique_id = theCommand.Parameters.Add("p_unique_id", MySqlDbType.Int32);
        p_unique_id.Direction = ParameterDirection.InputOutput;
        p_existed = theCommand.Parameters.Add("p_existed", MySqlDbType.Int32);
        p_existed.Direction = ParameterDirection.InputOutput;

        theReader = theCommand.ExecuteReader();
        theReader.Close();

        Console.WriteLine("unique ID = <" + theReader.GetInt32(1));  //this line blows up

有什么建议吗?

提前致谢

1 个答案:

答案 0 :(得分:1)

ExecuteReader期待您的存储过程中的表结果集,它看起来不像它(您执行SELECT ... INTO而不是SELECT ... FROM)。尝试使用ExecuteNonQuery并从参数本身读取值。

// retVal contains the number of records affected by the query. It may return
// the number of rows found, not sure for mysql.
int retVal = theCommand.ExecuteNonQuery();
Console.WriteLine("unique ID = <{0}", p_unique_id.Value);

另请注意,在关闭之后,您无法从阅读器访问数据。在您的示例中,您调用theReader.Close();然后尝试在关闭后阅读它。