从存储过程中读取输出参数值

时间:2013-04-04 14:20:05

标签: c# mysql

我的应用程序使用一些存储过程可以非常快速地插入到多个表中。每个表中插入行的PK值用于插入下一个表:

基本上,我的存储过程看起来像这样:

create procedure `insert_file`(out @fileid bigint, @filedata longblob, @datesaved datetime)
    begin
        insert into file(filedata, datesaved)
        values(@filedata, @datesaved);

        set @fileid = last_insert_id();
    end $$
delimiter ;

我期待的是输出刚刚插入的行的ID,以便我可以在我的“加入”表中使用它(将此文件连接到另一个对象的表 - 如用户或文章)。

这是我的代码:

Int64 lastInsertID;

// db.getReader(string cmd, List<MySqlParameter>());
using (MySqlDataReader dr = db.getReader("insert_file", requiredParameters))
{
    if (dr.HasRows())
    {
        dr.Read();

        lastInsertID = dr.GetInt64("@fileid");
    }
}

虽然这似乎在我脑海中有意义,但我一直都会收到错误:

  

在结果中找不到指定的列:@fileid

有人可以帮我理解我在这里做错了什么(以及如何解决)?

2 个答案:

答案 0 :(得分:2)

  • 第一:在阅读器打开之前,您无法读取输出参数。
  • 第二:您无法使用阅读器读取输出参数,因为 storedprocedure使用Set语句并将值赋给 变量不是你用datareader取回的结果集

您可以尝试在

中更改存储过程的最后一行
 select last_insert_id();

但是,您不再需要输出参数。

使用该参数的正确方法是通过ExecuteNonQuery

using (MySqlConnection cn = new MySqlConnection(GetConnectionString()))
using(MySqlCommand cmd = new MySqlCommand("insert_file", cn))
{
    cn.Open();
    // Add the required parameters here //
    cmd.ExecuteNonQuery();
    lastInsertID = Convert.ToInt32(cmd.Parameters["@fileid"].Value);
}

答案 1 :(得分:0)

如果Rows集合中有一行,则第一个单元格中的值应该是您要查找的内容。试试这个:

Int64 lastInsertID;

    // db.getReader(string cmd, List<MySqlParameter>());
    using (MySqlDataReader dr = db.getReader("insert_file", requiredParameters))
    {
        if (dr.HasRows())
        {
            dr.Read();

            lastInsertID = dr.Rows[0].Items[0];
        }
    }