2013-04-01 58 views
1

我想插入使用具有兩個表的存儲過程的數據參數。這第一個表是數據是通過文本框的第二個數據是通過一個網格,我存儲在數據庫中並傳遞給插入。問題是當讀取數據表並插入它時,說有太多的參數發生在for循環中。任何建議如何處理這個SP?提前致謝。使用存儲過程來插入數據表自

CODE:

try 
{ 
    SqlConnection conn = new SqlConnection(); 
    conn.ConnectionString = strConnection; 
    SqlCommand cmd = new SqlCommand(); 
    cmd.Connection = conn; 
    cmd.CommandTimeout = 120; 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.CommandText = "insFamilyDetails"; 
    cmd.Parameters.AddWithValue("@strHusbandName", strHusbandName); 
    cmd.Parameters.AddWithValue("@strRelation", strRelation); 
    .... 
    .... 
    // Child Details 
    for (int i = 0; i < strChildredDetails.Rows.Count; i++) 
    { 
    cmd.Parameters.AddWithValue("@strChildName", strChildredDetails.Rows[i][0].ToString()); 
    cmd.Parameters.AddWithValue("@strDOB", strChildredDetails.Rows[i][1]); 
    cmd.Parameters.AddWithValue("@strBaptisedon", strChildredDetails.Rows[i][2]); 
    cmd.Parameters.AddWithValue("@strFirstComOn", strChildredDetails.Rows[i][3]); 
    cmd.Parameters.AddWithValue("@strConfirmedOn", strChildredDetails.Rows[i][4]); 
    cmd.Parameters.AddWithValue("@strMarried", "0"); 
    cmd.Parameters.AddWithValue("@strAlive", "1"); 
    } 
    conn.Open(); 
    ReturnValue = Convert.ToBoolean(cmd.ExecuteNonQuery()); 
    conn.Close(); 
} 
catch (Exception e) 
{ 
DL_LogAppErrors(e.ToString(), System.Reflection.MethodBase.GetCurrentMethod().Name, "Insert Family Details"); 
return ReturnValue; 
} 

return ReturnValue; 

回答

1

我從代碼中假設你將添加到主表和子表中。對於這種情況,你需要的過程分爲兩個:

  1. 用於添加數據主表
  2. 循環添加的子數據
    注意:您需要添加新集之前清除參數,而不是增加新的參數,改變現有參數

編輯的價值:使用事務

con.Open(); 
SqlTransaction trans = con.BeginTransaction(); 

try { 
    // Execute the SP here 
    // After all SP executed, call the commit method 
    trans.Commit(); 
} catch (Exception ex) { 
    // An error happened, rollback 
    trans.RollBack(); 
} 
con.Close(); 
+0

我試過這種方式,它作品,但我發現是說,如果主表數據插入和子數據失敗,那麼就有問題。所以在SP中,我添加了一個事務並回滾,如果其中任何一個失敗了 – Adrian

+0

那麼你是否說你創建了一個SP來將數據輸入到這兩個表(主和子)? – Ruly

+0

是的。在單個SP中有兩個插入語句。如果主服務器出現故障,它將不會插入到子服務器中,如果子服務器也出現故障,事務處理將回滾。不確定這是否是正確的方法,有什麼建議? – Adrian

1

您在每次循環添加參數command。第一次迭代之後,您正嘗試在參數集合中添加相同的parameter名稱。您可能需要使用SqlParameterCollection.Clear清除每次迭代中的參數集合。執行命令後清除參數集合(在循環體中)。

conn.Open(); 
for (int i = 0; i < strChildredDetails.Rows.Count; i++) 
{ 
    cmd.Parameters.AddWithValue("@strChildName", strChildredDetails.Rows[i][0].ToString()); 
    cmd.Parameters.AddWithValue("@strDOB", strChildredDetails.Rows[i][2]); 
    cmd.Parameters.AddWithValue("@strBaptisedon", strChildredDetails.Rows[i][2]); 
    cmd.Parameters.AddWithValue("@strFirstComOn", strChildredDetails.Rows[i][3]); 
    cmd.Parameters.AddWithValue("@strConfirmedOn", strChildredDetails.Rows[i][4]); 
    cmd.Parameters.AddWithValue("@strMarried", "0"); 
    cmd.Parameters.AddWithValue("@strAlive", "1"); 
    ReturnValue = Convert.ToBoolean(cmd.ExecuteNonQuery()); 
    cmd.Parameters.Clear(); 
} 
conn.Close(); 

如果你有很多記錄表中插入那麼您可以在SP和分裂發送逗號分隔值然後SP和插入。它會保存數據庫調用。這post將顯示你如何做到這一點。

+0

檢查我更新的答案。 – Adil

+0

有兩張表格1父母和2孩子。 1父母許多孩子 - 孩子從網格中獲得。我需要在插入父ID後使用該ID插入子表。不確定這是否是正確的方法 – Adrian

+0

如果您有許多記錄要插入表中,則可以在SP中發送逗號分隔值,然後在SP中拆分並插入它們。它會保存數據庫調用。 – Adil

0

對於要插入你要調用ExecuteNonQuery()函數,即每行,應該是裏面的for循環,之後清除參數集合在循環的末尾。

conn.Open(); 
// Child Details 
    for (int i = 0; i < strChildredDetails.Rows.Count; i++) 
    { 
    cmd.Parameters.AddWithValue("@strHusbandName", strHusbandName); 
    cmd.Parameters.AddWithValue("@strRelation", strRelation); 
    .... 
    .... 
    cmd.Parameters.AddWithValue("@strChildName", strChildredDetails.Rows[i][0].ToString()); 
    cmd.Parameters.AddWithValue("@strDOB", strChildredDetails.Rows[i][1]); 
    cmd.Parameters.AddWithValue("@strBaptisedon", strChildredDetails.Rows[i][2]); 
    cmd.Parameters.AddWithValue("@strFirstComOn", strChildredDetails.Rows[i][3]); 
    cmd.Parameters.AddWithValue("@strConfirmedOn", strChildredDetails.Rows[i][4]); 
    cmd.Parameters.AddWithValue("@strMarried", "0"); 
    cmd.Parameters.AddWithValue("@strAlive", "1"); 
    ReturnValue = Convert.ToBoolean(cmd.ExecuteNonQuery()); 
cmd.Parameters.Clear(); 

} 
+0

我認爲這將起作用讓我檢查並告訴你 – Adrian

+0

它在主表中插入兩條記錄,在子表中插入兩條記錄。 1名家長和2名兒童。 – Adrian

+0

您的存儲過程需要更改,您可以將其更改爲使用用戶定義的類型作爲輸入參數,創建表類型併發送數據,否則使用單獨的SP作爲主表數據和子表數據。 – Arun

0

前面已經說過,你需要有內部的ExecuteNonQuery每個循環中,如果要插入網格的記錄。

替代選擇是使用表,如果你使用SQL Server 2008尊貴的參數,則這將讓生活更容易,你不必做往返於你的GridView的每個記錄。只需傳遞數據表即可。

請檢查this鏈接。

編輯:

對於SQL Server 2005,您可能需要使用XML。請檢查this鏈接。

public string SerializeObject<T>(T Obj) 
{ 
string strxml = string.Empty; 
using (StringWriter sw = new StringWriter()) 
{ 
    XmlSerializer xs = new XmlSerializer(typeof(T)); 
    xs.Serialize(sw, Obj); 
    strxml = sw.ToString(); 
} 
return strxml; 
} 

鏈接包含上述功能,通過您的數據表,以該功能,檢查出生成的XML,並使用相同的外殼中在存儲過程中對元件XML作爲XML是大小寫敏感的。