1

我有以下查询:

 public static DataTable GetTasks(int empNum)
        {
                StringBuilder cmdTxt = new StringBuilder();
                Dictionary<string, string> paramList = new Dictionary<string, string>();
                cmdTxt.Append(" SELECT DISTINCT a.task_code, a.task_name ");
                cmdTxt.Append(" FROM rr2_task a, rr2_task_state b, rr2state_user c ");
                cmdTxt.Append(" WHERE a.task_code= b.task_code ");
                cmdTxt.Append(" AND b.state_code= c.state_code ");
                cmdTxt.Append(" AND c.emp_num = ? ");
                cmdTxt.Append(" AND b.new_flag= 1 ");
                cmdTxt.Append(" UNION SELECT DISTINCT a.task_code, a.task_name FROM rr2_task a , rr2_candidate b ");
                cmdTxt.Append(" WHERE empnum_candidate = ? ");
                cmdTxt.Append(" AND a.task_code = b.task_code ");
                cmdTxt.Append(" UNION SELECT DISTINCT a.task_code, a.task_name FROM rr2_task a, rr2_taskstate b, rr2_stategroup c ");
                cmdTxt.Append(" WHERE a.task_code= b.task_code ");
                cmdTxt.Append(" AND b.state_code= c.state_code ");
                cmdTxt.Append(" AND ((( c.group_type = 1 ) AND ( c.group_code = (SELECT x.degree_code FROM kk2_degree_infor x WHERE x.emp_num = ? ");
                cmdTxt.Append(" AND x.degree_date = ( SELECT MAX(xx.degree_date) FROM kk2_degree_infor xx WHERE xx.emp_num = x.emp_num )))) ");
                cmdTxt.Append(" OR (( c.group_type = 2 ) AND ( c.group_code =  ( SELECT y.title_code FROM hetjob y WHERE y.emp_num = ? ");
                cmdTxt.Append(" AND y.title_date = ( SELECT MAX(yy.title_date) FROM hetjob yy WHERE yy.emp_num = y.emp_num ))))) ");

现在我应该添加四个具有不同名称的参数,尽管它实际上是一个具有相同值的参数吗? empNum

4

2 回答 2

3

那么目前您使用的是位置参数 ( ?) 而不是命名参数 ( @empnum)。您还没有告诉我们您使用的是什么数据库,但我希望如果您可以使用命名参数,您可以在任何地方使用相同的名称并只需添加一个值。

使用位置参数,您必须为每个占位符提供一个值,因为无法将单独的占位符绑定在一起。

于 2012-11-22T09:17:18.257 回答
0

首先,使用@创建一个多行字符串

string sql = @"SELECT ...
FROM...
WHERE...";

避免一些混乱:)

关于您的问题,如果使用带有匿名参数的 OleDB 提供程序,请声明具有此类值的变量,然后引用它:

DECLARE @par int; --or char or whatever else
SET @par = ?

SELECT ...
FROM ...
WHERE x = @par
AND y = @par

这样,您应该只能传递一次参数。

于 2012-11-22T09:19:27.393 回答