我的应用程序使用一些存储过程可以非常快速地插入到多个表中。每个表中插入行的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
有人可以帮我理解我在这里做错了什么(以及如何解决)?
答案 0 :(得分:2)
您可以尝试在
中更改存储过程的最后一行 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];
}
}