带有c#参数的动态SQL查询

时间:2016-04-07 08:57:04

标签: c# sql ado.net sqldatareader

我想构建动态查询,其中列名和表名是参数。

以下是我写的代码

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);

我创建了两个参数@columnname和@tablename,它们传递给了函数

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

这给了我以下错误 “无效的对象名称'报告。@ tableName” 似乎在执行命令时不会替换参数值。我在这里缺少什么?

谢谢, AMOL

1 个答案:

答案 0 :(得分:1)

你需要稍微调整一下SQLQuery字符串,因为你的参数是SQL眼中字符串的一部分。

将其更改为此应该可以正常工作

testLimit