【问题标题】:Add parameters in query on c#在c#的查询中添加参数
【发布时间】:2015-08-04 12:51:14
【问题描述】:

在我的 代码后面 的 aspx 页面中,我在 sql 查询中传递 Parameters 的值时遇到问题。

我使用 MySql 数据库。

第 1 步:

我在 List 中添加查询的输出:

while (reader.Read())
{
    idcolor = reader["idcolor"].ToString();
    colorList.Add(idcolor.ToString());
}

ns = string.Join("','", colorList.ToArray());

debug中,输出为:

ns = red','green

第 2 步:

我需要在 sql 查询中使用 string ns 的值。

并在parameters中传递string ns的值:

str = null;
str = ns == null ? "" : ns.ToString();

sql = @" SELECT * FROM Experience WHERE Colors IN (?); ";

    DataSet dsColors = new DataSet();

    using (OdbcConnection cn =
      new OdbcConnection(ConfigurationManager.ConnectionStrings["ConnMySQL"].ConnectionString))
    {
        cn.Open();

        using (OdbcCommand cmd = new OdbcCommand(sql, cn))
        {

            cmd.Parameters.AddWithValue("param1", Server.UrlDecode(str.ToString()));

            OdbcDataAdapter adapter = new OdbcDataAdapter(cmd);
            adapter.Fill(dsColors);
        }
    }

    return dsColors;

第 3 步:

如果在查询中使用:

sql = @" SELECT * FROM Experience WHERE Colors IN (?); ";

dataset 中的输出为空。

如果在查询中使用:

sql = @" SELECT * FROM Experience WHERE Colors IN ( '" + Server.UrlDecode(str.ToString()) + "' ); ";

dataset 中的输出是对的。

有人知道我该如何解决吗?

你能推荐一下吗?

你能帮帮我吗?

提前谢谢你。

【问题讨论】:

    标签: c# mysql sql parameters


    【解决方案1】:

    你必须使用MySql.Data.MySqlClient;来连接Mysql:

    sql = @" SELECT * FROM Experience WHERE Colors IN (@param1,@param2) ";
    
        DataSet dsColors = new DataSet();
    
        using ( MySqlConnection cn =
          new MySqlConnection(ConfigurationManager.ConnectionStrings["ConnMySQL"].ConnectionString))
        {
            cn.Open();
    
            using (MySqlCommand cmd = new MySqlCommand(sql, cn))
            {
    
                cmd.Parameters.Add("@param1", colorList[0]/ToString());
                cmd.Parameters.Add("@param2",colorList[1].ToString());    
                MySqlDataAdapter adapter = new MySqlaAdapter(cmd);
                adapter.Fill(dsColors);
            }
        }
    

    【讨论】:

    • 解释你发现了什么问题,你做了什么改变以及如何解决问题。
    • 使用 MySqlClient 代替 Oldedb
    • 不知道为什么这被否决了。我只能重复 apomene:使用 MySqlClient。上升了。
    • 服务器在托管我不使用MySqlClient
    【解决方案2】:

    如果你不想为每种颜色添加参数,你可以去

    MySql.Data.MySqlClient.MySqlHelper.EscapeString()

    这并不漂亮,但它是由参数内部使用的,您可以添加动态数量的值,并且可以安全地防止注入

    while (reader.Read())
    {
        idcolor = reader["idcolor"].ToString();
        colorList.Add(MySql.Data.MySqlClient.MySqlHelper.EscapeString(idcolor));
    }
    
    ns = string.Join("','", colorList.ToArray());
    

    【讨论】:

      【解决方案3】:

      您需要在 in 子句中为您想要的每个项目添加一个参数和占位符。例如

      sql = @" SELECT * FROM Experience WHERE Colors IN (?,?,?); ";
      

      然后为每个添加参数。

      cmd.Parameters.AddWithValue("param1", Server.UrlDecode(str.ToString()));
      

      示例

              List<string> colours = new List<string>();
      
              colours.Add("black");
              colours.Add("red");
      
              var placeHolders = string.Join(",",(from colour in colours select "?").ToList());
      
              var sql = @String.Format(" SELECT * FROM Experience WHERE Colors IN ({0}); ",placeHolders);
      
              DataSet dsColors = new DataSet();
      
              using (OdbcConnection cn = new OdbcConnection(ConnectionString))
              {
                  cn.Open();
      
                  using (OdbcCommand cmd = new OdbcCommand(sql, cn))
                  {
                      foreach(var colour in colours)
                      {
                          cmd.Parameters.AddWithValue(colour, colour);
                      }
      
                      OdbcDataAdapter adapter = new OdbcDataAdapter(cmd);
                      adapter.Fill(dsColors);
                  }
              }
      

      【讨论】:

        【解决方案4】:

        您似乎与上下文关系密切,但尝试一次获取一种颜色的结果,并不断更改参数的 VALUE。通过调用 FILL,它只会在每次调用时不断向表中添加记录。但是,请将 FILL 设置为指向 DataTable 而不是 DataSet。因此,它不会一直将 TABLES 放入您的数据集中,而是使用一个继续附加到它的数据集。如果您有 1 种颜色或 1000 种颜色,这将起作用...

        ... rest of previous code BEFORE the OdbcCommand
        ... and ensure clean values for your colors as others have noted.
        using (OdbcCommand cmd = new OdbcCommand(sql, cn))
        {
           // Just to add the parameter "place-holder" for your query
           cmd.Parameters.AddWithValue("param1", "");
        
           // DataTable ONCE to receive all the colors being queried
           DataTable tblAllColors = new DataTable();
        
           // build the adapter ONCE no matter how many colors you will be querying
           OdbcDataAdapter adapter = new OdbcDataAdapter(cmd);
        
           // so for this loop, you are just getting the colors one at a time.
           foreach( string s in colorList )
           {
              // next color you are trying to get... just overwrite the 
              // single parameter with the new color.
              adapter.SelectCommand.Parameters[0].Value = s;
              adapter.Fill(tblAllColors);
           }
        
           // you would otherwise have to build your query dynamically and keep 
           // adding parameter-placeholders "?" for each color in a comma list 
           // as you were attempting... which would be a slightly different query.
        }
        
        dsColors.Tables.Add( tblAllColors );
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-11-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-04
          • 2018-07-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多