【问题标题】:SQL query return ListSQL查询返回列表
【发布时间】:2017-05-21 15:42:00
【问题描述】:

我似乎无法正常工作:

我的表格列标题是“流派”“艺术家”“专辑” 我传入的参数是(类型,过滤器,值)(“艺术家”,“流派”,“摇滚”),其中数据库中有两行,流派为“摇滚”。

当我跟随调试器时,'while (reader.Read())' 必须返回 false,因为从未进入循环,因此没有任何内容写入列表。

    public static List<String> getWithFilter(String type, String filter, String value)
    {

        List<String> columnData = new List<String>();

        string query = "SELECT @type FROM Music WHERE" +
            " @filter = '@value'";
        SqlConnection connection = Database.GetConnection();
        SqlCommand getData = new SqlCommand(query, connection);
        getData.Parameters.AddWithValue("@type", type);
        getData.Parameters.AddWithValue("@filter", filter);
        getData.Parameters.AddWithValue("@value", value);
        connection.Open();

        using (connection)
        {
            using (getData)
            {
                using (SqlDataReader reader = getData.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        columnData.Add(reader.GetString(0));
                    }
                }
            }
        }
        return columnData;
    }

【问题讨论】:

  • 列名不能使用参数,使用时也不能用引号引起来。您必须实际构建查询,例如 "SELECT " + type + " FROM... WHERE " + filter + " = @value";
  • 使用SQL参数很好,但typefilter不能是参数,因为它们代表我理解的列名。
  • 你确定吗?如果可以以这种方式使用参数(我不确定),则选择看起来像select 'artist' from music where 'genre' = ''Rock''
  • @CraigHalloway 不,你写它的方式执行的查询是SELECT 'artist' FROM Music WHERE 'genre' = 'Rock'。请注意 "artist` 和 "genre" 周围的单引号,这会将它们转换为字符串文字。当然,WHERE 条件永远不会满足。
  • @IvanStoev 实际上我相信是'genre' = '@value',因为它们在最后一个参数周围有多余的引号。

标签: c# mysql sql winforms visual-studio


【解决方案1】:

您不能对列名使用参数,并且在使用它们时不要在它们周围加上引号。现在您的查询相当于

SELECT 'artist' FROM Music WHERE 'genre' = '@value'

您可以改为执行以下操作。

string query = "SELECT " + type + " FROM Music WHERE " + filter + " = @value";

只需删除创建 @type@fitler 参数的行。

【讨论】:

  • 这不会容易受到 SQL 注入攻击吗?
  • @maccettura 仅当 type 和或 filter 是用户输入时。如果是,则 OP 应首先根据有效列名列表检查它们。
【解决方案2】:

您正在寻找格式化字符串插值(需要C# 6.0):

string query = 
   $@"SELECT {type} 
        FROM Music 
       WHERE {filter} = @value";

... 

getData.Parameters.AddWithValue("@value", value);

格式有点啰嗦:

 string query = String.Format(
    @"SELECT {0} 
        FROM Music 
       WHERE {1} = @value", type, filter);

【讨论】:

    【解决方案3】:

    我假设您使用的是 .net 2

    DateTime current = DateTime.Now;
           Console.WriteLine(current);
            SqlConnection conn = new SqlConnection();
            string q = "SELECT @field FROM student";
            SqlDataAdapter da = new SqlDataAdapter(q, conn);
            da.SelectCommand.Parameters.AddWithValue("@field", "snName");
            DataTable dt = new System.Data.DataTable();
            conn.Open();
            da.Fill(dt);
            conn.Close();
            List<string> names = new List<string>();
            foreach (DataRow dr in dt.Rows)
            {
                names.Add(dr[0].ToString());
            }
            Console.WriteLine("Fetching {0} data for {1}", names.Count, DateTime.Now - current);
            Console.ReadKey();
    

    您可以使用 lambda 表达式来映射 .net 中的数据表>4

    【讨论】:

      猜你喜欢
      • 2013-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-28
      • 1970-01-01
      • 2019-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多