如何转换此方法来捕获插入的ID?

时间:2014-11-03 14:17:26

标签: c# .net winforms

我有一个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);  

我想更改数据访问层和业务层以获取值 如何更改我的数据访问层来实现这一目标?

提前致谢。

2 个答案:

答案 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;
}