informix是否支持命名参数?

时间:2012-11-22 09:15:04

标签: c# informix parameterized-query

我有以下查询:

 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

2 个答案:

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

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