我有一个Windows窗体,我在按钮点击事件中插入值
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);
我想更改数据访问层和业务层以获取值 如何更改我的数据访问层来实现这一目标?
提前致谢。
答案 0 :(得分:1)
只是一个快速但重要的注意事项:您应该使用参数化查询来避免SQL注入问题,并使用正确的ORM系统。
关于您的具体问题:使用ExecuteScalar而不是ExecuteNonQuery调用您的过程,并从您的存储过程返回生成的id。
您实际上并不需要SP,例如,您可以执行select scope_identity()
。或者您可以在SP中使用输出参数。但是返回标量是最简单的方法。
答案 1 :(得分: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;
}