2011-07-24 112 views
2

我想弄清楚如何在ASP.NET C#中使用MySql。這裏是我的代碼你如何使用MySql IN子句

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

發生這種情況是因爲您綁定了單個字符串中的所有url。 – zerkms

+0

我不熟悉C#中的綁定參數,但是您確定可以以這種方式綁定嗎?通常你會綁定查詢的實際參數。你正在做的是綁定查詢的一部分。 IN子句期望逗號分隔列表。您正在給它一個單一的變量,其值包含逗號分隔列表的文本。我想這會造成問題。 – Brad

回答

1

我已經找到了答案。這是

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

你已經在你的問題雖然

引用,而不是@Urls

也許只是一個錯字@url

+0

嗯..我糾正了錯誤,但它仍然沒有返回任何結果 – Luke101

+0

你的問題是你的查詢變成了IN(「...」)整個url列表被編碼爲一個字符串。您可能需要使用'MySqlHelper.EscapeString'手動編寫該部分查詢,但需要通過測試 –

0

IN語句應該期望一個字符串數組,並且您傳遞一個單一的s特林

你最後的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