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();
我没有使用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