1

我的应用程序使用一些存储过程相当快地插入到多个表中。每个表中插入行的 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

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

4

2 回答 2

2
  • 首先:在阅读器打开之前,您无法读取输出参数。
  • 第二:您无法使用读取器读取输出参数,因为存储过程使用 Set 语句并将值分配给变量而不是您使用数据读取器返回的结果集

可能您可以尝试更改存储过程的最后一行

 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);
}
于 2013-04-04T14:23:09.150 回答
0

如果 Rows 集合中有 Row,则 forst 单元格中的值应该是您要查找的值。尝试这个:

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];
        }
    }
于 2013-04-04T14:28:23.547 回答