【问题标题】:How do you use the MySql IN clause如何使用 MySql IN 子句
【发布时间】:2011-10-11 21:22:39
【问题描述】:

我试图弄清楚如何将 MySql In cluse 与 ASP.NET C# 一起使用。这是我的代码

var WebSites = string.Join(",", wsl.Select(x => "'" + x.DomainUrl + "'").ToArray());
string q = "select Id, Url, Title, Date, ImageUrl from post where WebSiteUrl IN (@Url)";

当我不使用参数时,此代码有效。当我包含参数时,我没有从查询中得到任何结果。

这是我的参数代码

cmd.Parameters.Add("@Urls", MySqlDbType.Text).Value = WebSites;

这是完整的代码

 public static IList<Post> FindPostsByWebSiteList(IEnumerable<WebSite> wsl)
 {
        var pl = new List<Post>();
        var WebSites = string.Join(",", wsl.Select(x => "'" + x.DomainUrl + "'").ToArray());
        string q = "select Id, Url, Title, Date, ImageUrl from post where WebSiteUrl IN (@Urls)";

        using (MySqlConnection con = new MySqlConnection(WebConfigurationManager.ConnectionStrings["MySqlConnectionString"].ToString()))
        {
            using (MySqlCommand cmd = new MySqlCommand(q, con))
            {
                cmd.Parameters.Add("@Urls", MySqlDbType.Text).Value = WebSites;
                con.Open();

                var reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                while (reader.Read())
                {
                    var p = new Post();
                    p.Id = reader.GetInt32("Id");
                    p.Url = reader.GetString("Url");
                    p.Title = reader.GetString("Title");
                    p.Date = reader.GetDateTime("Date");
                    p.ImageUrl = reader.GetString("ImageUrl");
                    pl.Add(p);
                }
                return pl;
            }
        }
    }

【问题讨论】:

  • 发生这种情况是因为您将所有 url 绑定在一个字符串中。
  • 我对C#中的绑定参数不熟悉,但是你确定可以这样绑定吗?通常您将绑定查询的实际参数。您正在做的是绑定查询的一部分。 IN 子句需要一个逗号分隔的列表。相反,您给它一个变量,其值包含逗号分隔列表的文本。我想这会导致问题。

标签: c# mysql


【解决方案1】:

你引用了@Url 而不是@Urls

也许你的问题只是一个错字

【讨论】:

  • 嗯..我已经纠正了错误,但仍然没有返回任何结果
  • 您遇到的问题是您的查询变成了 IN ( "..." ),整个 url 列表被编码为字符串。您可能需要使用 MySqlHelper.EscapeString 手动编写查询的这一部分,但需要进行测试
【解决方案2】:

IN 语句应该是一个字符串数组,而您传递的是单个字符串

您的最终 SQL 如下所示:

select Id, Url, Title, Date, ImageUrl from post where WebSiteUrl IN ('url1,url2,url3')

代替

select Id, Url, Title, Date, ImageUrl from post where WebSiteUrl IN ('url1', 'url2', 'url3')

检查这个问题:

Add List<int> to a mysql parameter

【讨论】:

    【解决方案3】:

    我找到了答案。在这里

        public static IList<Post> FindPostsByWebSiteList(string[] urls)
        {
            var pl = new List<Post>();
            var urlArray = urls.Select((x,y) => "@url" + y.ToString()).ToArray();
            var urlsJoined = string.Join(",", urlArray);
            string q = string.Format("select Id, Url, Title, Date, ImageUrl from post where WebSiteUrl IN ({0})", urlsJoined);
    
            using (MySqlConnection con = new MySqlConnection(WebConfigurationManager.ConnectionStrings["MySqlConnectionString"].ToString()))
            {
                using (MySqlCommand cmd = new MySqlCommand(q, con))
                {
                    for (int x = 0; x < urlArray.Length; x++)
                    {
                        cmd.Parameters.Add(urlArray[x], MySqlDbType.Text).Value = urls[x];
                    }
    
                    con.Open();
    
                    var reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                    while (reader.Read())
                    {
                        var p = new Post();
                        p.Id = reader.GetInt32("Id");
                        p.Url = reader.GetString("Url");
                        p.Title = reader.GetString("Title");
                        p.Date = reader.GetDateTime("Date");
                        p.ImageUrl = reader.GetString("ImageUrl");
                        pl.Add(p);
                    }
                    return pl;
                }
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-18
      • 1970-01-01
      • 2018-06-08
      • 2012-03-03
      • 2012-06-16
      • 1970-01-01
      • 2015-04-02
      相关资源
      最近更新 更多