c在sql或firebird上捕获来自NonQuery的单个/多个返回(字段)的事务

本文关键字:单个 事务 字段 返回 NonQuery firebird sql | 更新日期: 2023-09-27 18:27:20

我有这样的代码,它将数据插入多个表中。我的问题是如何在数据库中插入后捕获多个返回,并将其存储在变量中。

我将使用返回的值将其插入到另一个表中。

顺便说一下,fbtransaction与SQL事务几乎相同。我只需要检索的值

  • tbl_employee(表1)
  • empID pk(自动公司)
  • empMonitorID(自动公司)
  • 位置ID fk
  • 名字

这是我的代码

using FirebirdSql.Data.FirebirdClient;
DBconnection dbConString = new DBconnection(); //initialize connectDB with connection string
FbConnection dbConnect = new FbConnection(dbConString.getConnectionString()); // connect to database using connectdb
dbConnect.Open();
FbTransaction transaction = dbConnect.BeginTransaction(); // instantiate transaction
try
{
    FbCommand myCommand = new FbCommand(getQueryStrings(), dbConnect, transaction);
    string return_empid = myCommand.ExecuteNonQuery()// have no idea how the return EmpID
    string return_empMonitorID = myCommand.ExecuteNonQuery()// have no idea how to retrieve empMonitorID 
    FbCommand myCommand2 = new FbCommand(getQueryStrings(return_empid), dbConnect, transaction);//need to add return_empid to be insertted to the postion table
myCommand2.ExecuteNonQuery()

    transaction.Commit();
}
catch (Exception x)
{
    transaction.Rollback();
    MessageBox.Show("No Update has been made. Error (" +
    x.Message + ")");
 }
 finally
 {
     dbConnect.Close();
 }

private void getQueryStrings()
{
    return " insert into tbl_employee (positionID,first name,last name) values
    ('" + txtposiID + "','" + fname + "','" + lname + "' 
) returning empID,  empMonitorID ;" //this query returns emp id and emp monitor id
}

更新

我正在尝试使用此代码,但似乎无法使其正常工作。如果可以工作,有人能纠正我吗

string return_empid = = (string)myCommand.ExecuteScalar();

c在sql或firebird上捕获来自NonQuery的单个/多个返回(字段)的事务

经过几天的沮丧,我终于找到了在插入时返回多个值的答案。

我没有使用ExecuteNonQuery(),而是使用了ExecuteScalar(),如下代码所示。我还在命令中添加了参数,这样我就可以捕捉返回中的特定行。

myCommand.Parameters.Add("empID", SqlDbType.BigInt).Direction =ParameterDirection.Output;
myCommand.Parameters.Add("empMonitorID ", SqlDbType.BigInt).Direction = ParameterDirection.Output;
myCommand.ExecuteScalar();
MessageBox.Show(myCommand.Parameters["empID"].Value.ToString());
MessageBox.Show(myCommand.Parameters["empMonitorID "].Value.ToString());

这段代码避免了插入后的额外选择查询。

我知道这篇文章已经2年了,但也许这可以帮助其他人。对于Firebird,使用"return",并添加一个带有输出方向的新FbParameter,然后执行NonQuery,然后您可以从参数中获取值,并对其执行任何您喜欢的操作。

"insert into db (field1,field2) VALUES (@value1,@value2) returning id"
cmd.Parameters.AddWithValue("@value1",myvalue);
cmd.Parameters.AddWithValue("@value2",myvalue);
cmd.Parameters.Add(new FbParameter { ParameterName = "RET_id", FbDbType = FbDbType.Integer, Direction = ParameterDirection.Output });
cmd.ExecuteNonQuery();
string myReturnid = cmd.Parameters["RET_id"].Value.ToString();

您需要将插入放入一个可选的存储过程中,然后执行select from my_sp(val1, val2, ...)

其中sp看起来有点像

declare procedure mysp (val1 integer, val2 integer) returning val8 integer, val9 integer
begin
insert into table1 ... returning into :val8;
insert into table2 ... returning into :val9;
suspend;
end