2014-10-22 68 views
0

我有這個代碼插入到多個表中的數據。我的問題是如何在數據庫中插入後捕獲多個返回並將其存儲在變量中。c#事務從sql或firebird的NonQuery捕獲單個/多個返回(字段)

我將使用返回的值將其插入另一個表中。

順便說一句fbtransaction與SQL事務幾乎相同。我只需要檢索值

  • tbl_employee(表1)
  • EMPID PK(汽車公司)
  • empMonitorID(汽車公司)
  • positionID 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 
} 

UPDATE

我試圖用這個代碼,但我似乎無法使它發揮作用。任何人都可以糾正我,如果這可以工作

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

你是什麼意思_「catch multiple returns value」_? – 2014-10-22 07:45:27

+0

,你可以在我的插入語句中看到數據庫將返回或將返回2 EMPID和empMonitorID的ID。 EmpID和Empmonitorid是數據庫生成或自動遞增的 – Mandz 2014-10-22 07:49:08

+0

啊,我知道,據我所知,你應該將它作爲查詢來執行(例如,你可以選擇),但我目前無法訪問visual studio,所以我可以不檢查。 – 2014-10-22 07:51:00

回答

1

天后的挫折我終於找到了我的答案,在插入時返回多個值。

而不是使用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()); 

此代碼避免插入後的附加選擇查詢。

+0

另外考慮使用你插入的值的參數,你問題中顯示的當前代碼已經打開到sql注入 – 2014-10-23 12:51:28

+0

我會試試那個先生謝謝你的建議。 – Mandz 2014-10-24 02:28:01

-2

,你需要把插入1個可選的存儲過程,然後做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 
+0

對於在數據庫端插入期間如何返回值,我沒有問題。我的問題是如何從c#.net端的數據庫捕獲返回值。 – Mandz 2014-10-22 23:54:26

0

我知道這個職位是2歲,但也許這可以幫助別人。對於Firebird,請使用'返回',然後添加一個帶有輸出方向的新FbPa​​rameter,然後ExecuteNonQuery,然後您可以從參數中獲取值,並根據您的喜好進行操作。

"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();