2012-02-13 74 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