我有以下查询:
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
答案 0 :(得分:3)
目前您正在使用位置参数(?
)而非名为参数(@empnum
)。你没有告诉我们你正在使用什么数据库,但我希望如果可以使用命名参数,你可以在任何地方使用相同的名称,只需添加一个值。
使用位置参数,您必须为每个占位符提供一个值,因为没有办法将单独的那些绑定在一起。
答案 1 :(得分: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
这样,您应该只能传递一次参数。