請問,再事務中執行SqlCommand.Parameters.Clear()后,如何能將主鍵回傳呢,現在這樣執行過后回傳的主鍵 是0 ,
這段是執行sql的, list1和list2數量是相同的,list1[0]是回傳主鍵的sql陳述句,執行過后 clear()方法 是直接將@@IDENTITY也清空了嗎?, 還是說這種獲取主鍵的 不能用在事務了, 大神指導下唄 謝謝
public static bool ExecSqlReturn(List<string> list1, List<SqlParameter[]> list2)//傳陣列
{
SqlConnection con = SqlConn();
SqlTransaction trans = null;
try
{
SqlCommand Cmd = con.CreateCommand();
trans = con.BeginTransaction();
Cmd.Connection = con;
Cmd.Transaction = trans;
for (int i = 0; i < list1.Count; i++)
{
Cmd.CommandText = list1[i];
Cmd.Parameters.AddRange(list2[i]);
Cmd.ExecuteNonQuery();
Cmd.Parameters.Clear();
}
trans.Commit();
return true;
}
}
這段是傳的引數
public bool AddDict(T_D客戶資料 td客戶資料, List<T_D企業資質> 資質list)
{
List<string> list1 = new List<string>();
List<SqlParameter[]> list2 = new List<SqlParameter[]>();
string sql = "insert into D客戶資料 (編碼, 客戶類別, 客戶全稱, 拼音碼, 聯系人, 電話, 郵編, 手機, 傳真, 電子郵箱, 貨站, 地址, 送貨地址, 開戶行, 帳號, 稅號, 經營范圍s, 特殊藥品經營權s, 經營范圍, 特殊藥品經營權, 備注) values (@編碼, @客戶類別, @客戶全稱, @拼音碼, @聯系人, @電話, @郵編, @手機, @傳真, @電子郵箱, @貨站, @地址, @送貨地址, @開戶行, @帳號, @稅號, @經營范圍s, @特殊藥品經營權s, @經營范圍, @特殊藥品經營權, @備注)Select @ID = @@IDENTITY";//SCOPE_IDENTITY()
SqlParameter[] ps = new SqlParameter[]
{
new SqlParameter("@ID", SqlDbType.Int),
new SqlParameter("@編碼",td客戶資料.編碼),
new SqlParameter("@客戶類別",td客戶資料.客戶類別),
new SqlParameter("@客戶全稱",td客戶資料.客戶全稱),
new SqlParameter("@拼音碼",td客戶資料.拼音碼),
new SqlParameter("@聯系人",td客戶資料.聯系人),
new SqlParameter("@電話",td客戶資料.電話),
new SqlParameter("@郵編",td客戶資料.郵編),
new SqlParameter("@手機",td客戶資料.手機),
new SqlParameter("@傳真",td客戶資料.傳真),
new SqlParameter("@電子郵箱",td客戶資料.電子郵箱),
new SqlParameter("@貨站",td客戶資料.貨站),
new SqlParameter("@地址",td客戶資料.地址),
new SqlParameter("@送貨地址",td客戶資料.送貨地址),
new SqlParameter("@開戶行",td客戶資料.開戶行),
new SqlParameter("@帳號",td客戶資料.帳號),
new SqlParameter("@稅號",td客戶資料.稅號),
new SqlParameter("@經營范圍s",td客戶資料.經營范圍s),
new SqlParameter("@特殊藥品經營權s",td客戶資料.特殊藥品經營權s),
new SqlParameter("@經營范圍",td客戶資料.經營范圍),
new SqlParameter("@特殊藥品經營權",td客戶資料.特殊藥品經營權),
new SqlParameter("@備注",td客戶資料.備注)
};
ps[0].Direction = ParameterDirection.Output;
int 客戶編碼i = Convert.ToInt32(ps[0].Value);
list1.Add(sql);
list2.Add(ps);
for (int i = 0; i < 資質list.Count; i++)
{
string sql1 = "insert into d企業資質 (客戶編碼i, 標志, 企業資質, 證書編號, 有效期至, 備注) values (@客戶編碼i, @標志, @企業資質, @證書編號, @有效期至, @備注)";
/*string sql1 = "insert into d企業資質 (客戶編碼i, 標志, 企業資質, 證書編號, 有效期至, 備注) values ('{0}', '{1}', '{2}', '{3}', '{4}', '{5}')";
sql1 = string.Format();*/
list1.Add(sql1);
SqlParameter[] ps1 = new SqlParameter[]
{
new SqlParameter("@客戶編碼i",客戶編碼i),//
new SqlParameter("@標志",資質list[i].標志),
new SqlParameter("@企業資質",資質list[i].企業資質),
new SqlParameter("@證書編號",資質list[i].證書編號),
new SqlParameter("@有效期至",資質list[i].有效期至),
new SqlParameter("@備注",資質list[i].備注),
};
list2.Add(ps1);
}
return SQLHELPER.ExecSqlReturn(list1, list2);
}
uj5u.com熱心網友回復:
可以不用out引數的。比如:
var sql = "insert into 企業資質 (...) values (...); select @@IDENTITY AS 'Identity';";
var id = cmd.ExecuteScalar();
這里的id就是那個插入記錄的id(@@IDENTITY)。
uj5u.com熱心網友回復:
這個我是知道的,但是我這是一次插入多條陳述句,第一條陳述句的系統序號是后續陳述句的客戶編碼i,然后現在這樣寫,回傳的主鍵是0,不知道什么原因
uj5u.com熱心網友回復:
你回傳的output值在Parameters里,清除了當然就沒了,不是事務的問題uj5u.com熱心網友回復:
那怎樣能接受到呢,沒研究明白
uj5u.com熱心網友回復:
你要把你的陳述句里的ID定義成output才行的
declare @ID int output
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/81396.html
標籤:ASP.NET
