2014-11-03 143 views
-1

我有一個窗口的形式,我在按鈕單擊事件這樣如何將此方法轉換爲捕獲插入的ID?

Candidate CanObj = new Candidate(txtName.Text); 
if (new CandidateOP().saveCandidate(CanObj)) 
{ 
    MessageBox.Show("NEW candidate details added"); 
} 

這是我的業務層的方法插入值。

public Boolean saveCandidate(Candidate CanObj) 
{ 
    string query6 = "EXEC insertToCand01'" + CanObj.NIC + "'"; 
    return (new DataAccessLayer().executeNonQueries(query6)); 
} 

這是我的數據訪問層方法

public Boolean executeNonQueries(string query02) 
{ 
    Boolean flag = false; 
    SqlConnection con = null; 
    SqlCommand com = null; 
    try 
    { 
     con = new SqlConnection(DBConnect.makeConnection()); 
     con.Open(); 
     com = new SqlCommand(query02, con); 
     com.ExecuteNonQuery(); 
     flag = true; 
    } 
    catch (Exception ex) 
    { 
     flag = false; 
     throw ex; 
    } 
    finally 
    { 
     com.Dispose(); 
     con.Close(); 
    } 
    return flag; 
} 

這是我的存儲過程中插入內的查詢。 在我的表中,ID被設置爲自動增量。

INSERT INTO Candidate (User_Name) VALUES (@Uname); 

現在我想顯示插入的ID插入時顯示。 所以我改變了這樣的查詢。

INSERT INTO Candidate (User_Name) OUTPUT INSERTED.User_ID VALUES (@Uname); 

我想改變我的數據訪問層和業務層獲得值回 如何改變我的數據訪問層來實現這一目標?

在此先感謝。

+1

我不喜歡你浪費了新的實例:( – Reniuz 2014-11-03 14:34:34

回答

1

只是一個快速但重要的注意事項:您應該真正使用參數化查詢來避免SQL注入問題,並且還使用適當的ORM系統。

關於您的具體問題:使用ExecuteScalar而不是ExecuteNonQuery調用您的過程,並從存儲過程返回生成的ID。

你實際上並不需要一個SP,例如你可以做一個select scope_identity()。或者你可以在SP中使用輸出參數。但是返回標量是最簡單的方法。

+0

@ fejecjoco糾正我,如果我錯了,因爲我讀這是最好的方法,因爲如果你使用並行執行計劃這是bes t方法。關於sql注入。是的,我知道這件事。在這一點上,這是不必要的,因爲這是我的私人使用。請不要只專注於此。請提出您對轉換方法的關注。 – Sahil 2014-11-03 14:43:41

+0

我不只關注那個。我寫了關於ExecuteScalar的信息,我相信這是最簡單的方法。 – fejesjoco 2014-11-03 15:13:45

+0

有關該問題的任何代碼幫助? – Sahil 2014-11-03 15:42:08

0

事情是這樣的:

Candidate CanObj = new Candidate(txtName.Text); 
int id = new CandidateOP().saveCandidate(CanObj); 
/* You have **id** here, and you can use it. */ 
if (id >= 0) 
{ 
    MessageBox.Show("NEW candidate details added"); 
} 

業務層:

public Boolean saveCandidate(Candidate CanObj) 
{ 
    string query6 = "EXEC insertToCand01'" + CanObj.NIC + "'"; 
    return new DataAccessLayer().executeNonQueries(query6); 
} 

和您的接入層:

public int executeNonQueries(string query02) 
{ 
    long id = -1; 
    SqlConnection con = null; 
    SqlCommand com = null; 
    try 
    { 
     con = new SqlConnection(DBConnect.makeConnection()); 
     con.Open(); 
     com = new SqlCommand(query02, con); 
     SqlParameter returnParameter = com.Parameters.Add("RetVal", SqlDbType.Int); 
     returnParameter.Direction = ParameterDirection.ReturnValue; 
     com.ExecuteNonQuery(); 
     id = (int) returnParameter.Value; 
    } 
    catch (Exception ex) 
    { 
     id = -1; 
     throw ex; 
    } 
    finally 
    { 
     com.Dispose(); 
     con.Close(); 
    } 
    return id; 
} 
+0

@Sahil:我編輯了我的答案。 – 2014-11-03 14:46:18

+0

@ Ali Sepehri.Kh如何在變量的表單級別獲取id? – Sahil 2014-11-03 15:02:57

+0

你能不能包含一個代碼示例如何將它捕捉到表單級別的int類型變量中。 – Sahil 2014-11-03 15:31:42

相關問題