2016-04-07 33 views
-1

我想建立动态查询,其中列名和表名是参数。带有参数的动态SQL查询在c#

以下是传递给函数

public SqlDataReader ExecuteReader(string sql, List<SqlParameter> parametersList = null) 
     { 
      SqlConnection conn = new SqlConnection(); 

      conn.ConnectionString = this._connectionString; 

      conn.Open(); 

      SqlCommand cmd = new SqlCommand(); 

      cmd.Connection = conn; 

      cmd.CommandText = sql; 

      cmd.CommandType = CommandType.Text; 

      if (parametersList != null) 
      { 
       foreach (SqlParameter p in parametersList) 
       { 
        cmd.Parameters.Add(p); 
       } 
      } 

      SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection); 

      return reader; 
     } 

这给了我下面的错误 “无效的对象名称的代码我已经写

string query = "DECLARE @sqlQuery varchar(max); " + 
           " SELECT @sqlQuery = 'select distinct [@columnName] from [" + Globals.REPORTING_SCHEMA + "].[@tableName]'; " + 
           " exec(@sqlQuery);"; 

       List<SqlParameter> parametersList = new List<SqlParameter>(); 

       SqlParameter param = new SqlParameter(); 

       param.ParameterName = "tableName"; 

       param.SqlDbType = System.Data.SqlDbType.VarChar; 

       param.Value = request.TableName; 

       parametersList.Add(param); 

       param = new SqlParameter(); 

       param.ParameterName = "columnName"; 

       param.SqlDbType = System.Data.SqlDbType.VarChar; 

       param.Value = request.ColumnName; 

       parametersList.Add(param); 

       SQLHelpher sqlHelper = new SQLHelpher(networkConnectionString); 

       SqlDataReader dataReader = sqlHelper.ExecuteReader(query, parametersList); 

我已经创建了两个paramters @columnname和@tablename报告。@ tableName“ 似乎参数值在执行命令时未被替换。我在这里错过了什么?

感谢, 阿莫尔

回答

1

你只需要稍微调整你的SQLQuery字符串作为你的PARAMATERS在SQLS眼中的字符串的一部分。

改成这样,它应该工作

string query = "DECLARE @sqlQuery varchar(max); " + 
           " SELECT @sqlQuery = 'select distinct [' + @columnName + '] from [" + Globals.REPORTING_SCHEMA + "].[' + @tableName + ']'; " + 
           " exec(@sqlQuery);"; 
+0

魔术!非常感谢理查德。 – amol

+0

没问题 –