2014-11-03 93 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

相关问题