2012-02-13 57 views
2

我只有一個文件在我的數據庫中,從組2中,當我嘗試檢索這個組編號爲2的最後5個文件時,我檢索這個文件4次?C#循環,SQL和檢索信息

我知道這是我的循環中的一個問題,但我不明白哪裏是檢索4次具有相同ID的同一文件的問題。

這是我使用的代碼!

   dynamic queryString = ("SELECT Files.Id, Files.Name, Files.Date, Files.Path, Files.[Group] FROM Files,Groups WHERE Files.[Group] = " + param + "ORDER BY Files.Id DESC"); 
       SqlCommand theCommand = new SqlCommand(queryString, dbConnection); 
       dbConnection.Open(); 
       SqlDataReader reader = theCommand.ExecuteReader(); 

       int i = 0; 

       while (reader.Read()) 
       { 
        i++; 

        HyperLink fileHl = new HyperLink(); 
        fileHl.Text = reader["Name"].ToString(); 
        fileHl.CssClass = "filelink" + i; 
        fileHl.ID = reader["Id"].ToString(); 
        fileHl.NavigateUrl = String.Format("downloading.aspx?path={0}&file={1}", reader["Path"], reader["Name"]); 
        linktofiles.Controls.Add(fileHl); 
        linktofiles.Controls.Add(new LiteralControl("<br>")); 
       } 
+1

如果你不使用任何字段,你爲什麼在你的查詢中包含'Groups'表? – Marco 2012-02-13 10:18:23

+0

你正在做一個奇怪的,不合格的,加入這裏...通常解釋大部分重複。 – 2012-02-13 10:19:20

+2

@Shai:我認爲這是錯誤的答案。事實上,修復一個不同的選擇是一個典型的錯誤。 – 2012-02-13 10:19:54

回答

2

從你選擇刪除Groups表。你沒有使用它,並且你沒有正確連接,所以它會給你帶來不希望的結果。此外,不要使用dynamic作爲連接字符串的類型。使用string

+0

感謝您的回答! – Kiwimoisi 2012-02-13 10:37:01

4

的問題是你的查詢(而不是你的循環):

"SELECT Files.Id, Files.Name, Files.Date, Files.Path, Files.[Group] 
FROM Files,Groups 
WHERE Files.[Group] = " + param + 
"ORDER BY Files.Id DESC"; 

你需要加入你執行的是CROSS JOINFilesGroups否則之間,並會收到一排在所有匹配的行Files乘以Groups中的行。

事實上,你應該簡單地刪除Groups,因爲你沒有從該表中選擇任何內容:

"SELECT Files.Id, Files.Name, Files.Date, Files.Path, Files.[Group] 
FROM Files 
WHERE Files.[Group] = " + param + 
"ORDER BY Files.Id DESC"; 

爲了完整起見,使用的參數,而不是串聯文本。有助於避免SQL注入。

+0

FTLOG可以停止發佈容易受SQL注入影響的SQL。參數,人物;使用參數。 – adelphus 2012-02-13 10:27:55

+1

我完全知道SQL注入是什麼,可以做什麼。如果我每次寫入「注意SQL注入」時都有一美元,我就有50美元!我建議你在正確的地方留下評論,這是違反OP的問題 – 2012-02-13 10:29:55

0

dynamic queryString = ("SELECT DISTINCT Files.Id, Files.Name, Files.Date, Files.Path, Files.[Group] FROM Files,Groups WHERE Files.[Group] = " + param + "ORDER BY Files.Id DESC");

+1

這可能會起作用,但是出於錯誤原因;它將通過刪除由不必要的完整外連接添加的重複項來工作。正確的方法應該是:刪除不正確的連接。但是,它會破壞數據中的任何**真正的**重複。 – 2012-02-13 10:22:07