2011-06-11 67 views
2

我試圖用循環結果填充Gridview。但我只得到循環中的最後一個結果。
我認爲GridView在每次執行for循環時都被覆蓋。在ASP.NET中填充GridView時出現問題(C#)

請問您能幫我解決這個問題嗎?

for (int j = 0; j < i; j++) 
{ 
    Label1.Text += fipath[j]; 
    Label1.Text += "-------------"; 
    SqlConnection conn = new SqlConnection("Server=ILLUMINATI;" + "Database=DB;Integrated Security= true"); 
    SqlCommand comm = new SqlCommand("Select * from FileUpload where UploadedBy='" + NAME + "' AND FilePath='" + fipath[j] + "'", conn); 

    try 
    { 
     conn.Open(); 
     SqlDataReader rdr = comm.ExecuteReader(); 
     if (Role.Equals("admin")) 
     { 
      GridView1.DataSource = rdr; 
      GridView1.DataBind(); 
     } 
     rdr.Close(); 
    } 
    catch 
    { 
     conn.Close(); 
    } 
} 

回答

3

有一個以上的問題,此代碼:

  • 好像如果Role== "admin"你不需要在網格的所有
  • DataSource查詢數據庫被覆蓋在每個循環迭代,這是爲什麼你只看到最後一個值。
  • 使用SqlCommand的參數來防止SQL注入。
  • 不要在循環中運行字符串連接。使用StringBuilder代替
  • 使用using爲您的連接。代碼更清潔這種方式。

的修復看起來是這樣的:

if (Role != "admin") 
    return; 

var dataTable = new DataTable(); 
var stringBuilder = new StringBuilder(); 
using (var connection = new SqlConnection("Server=ILLUMINATI;" + "Database=DB;Integrated Security= true")) 
using (var command = connection.CreateCommand()) 
{ 
    connection.Open(); 
    command.CommandText = "Select * from FileUpload where UploadedBy = @UploadedBy AND FilePath = @FilePath"; 
    command.Parameters.AddWithValue("UploadedBy", NAME); 
    var filPathParameter = command.Parameters.Add("FilePath", SqlDbType.VarChar); 
    for (int j = 0; j < i; j++) 
    { 
     stringBuilder.Append(fipath[j]); 
     stringBuilder.Append("-------------"); 
     filPathParameter.Value = fipath[j]; 
     dataTable.Load(command.ExecuteReader(), LoadOption.PreserveChanges); 
    } 
} 
Label1.Text += stringBuilder.ToString(); 
GridView1.DataSource = dataTable; 
GridView1.DataBind(); 

另外,我不知道你的正常循環多少個元素是。如果它是一個或兩個,並且您在FileUpload表中有適當的索引,則可以保持原樣。但是,如果您需要爲您應該考慮切換到一個單一的查詢,而不是

例如多次做:

var filePathes = string.Join(",", fipath.Select(arg => "'" + arg + "'")); 
var command = "Select * from FileUpload where UploadedBy = @UploadedBy AND FilePath in (" + filePathes + ")"; 

此查詢SQL注入容易。 MS SQL中有2100個元素限制。

有多種方法可以解決這個問題。取決於您的DBMS和要求。

+0

謝謝!!!!!!!!!!!第二種方法對我來說更容易,並且運作良好。 – Naresh 2011-06-11 17:19:00

1

創建循環外的列表或BindingSource的,綁定,爲你的GridView,然後所有記錄添加到列表或來源。

你目前的方法存在的問題是,你每次都用一個新的數據源覆蓋從數據庫中提取的記錄,所以如你所述,只有最後一個被「設置」,並且舊的分配被丟棄。

+0

如何Dynamically.Can你能告訴我請的項目添加到列表中。 – Naresh 2011-06-11 16:59:11

+1

@ ILLUMINATI7590:使用[IDataReader](http://msdn.microsoft.com/en-us/library/system.data.idatareader.aspx)(您的rdr實例)中的Read方法,並將對象添加到bindingsource中使用[Add](http://msdn.microsoft.com/zh-cn/library/system.windows。forms.bindingsource.add.aspx)方法。 – Patrick 2011-06-11 17:05:42

2

使用SQL查詢的in條款,並通過ID的列表中的文件路徑

SqlCommand comm = new SqlCommand("Select * from FileUpload where UploadedBy='" + NAME 
+ "' AND FilePath in (" + listOfIDs + ")", conn); 

檢查出涉及使用in條款這些URL。

Techniques for In-Clause and SQL Server

Parameterizing a SQL IN clause?

+0

它看起來是正確的。但由於某種原因,它沒有給出任何結果。 – Naresh 2011-06-11 17:06:55

+0

我刪除了for循環,並給出fipath而不是fipath [j]。它不打印任何東西。 – Naresh 2011-06-11 17:07:48

+1

如果你有SQL服務器,你必須在參數(如1,2,3,4)中給出Id的列表,只需在那裏驗證查詢並在SQL命令中複製該查詢。從FileUpload中選擇*從uploadUp =''和Filepath(1,3,4,5) – 2011-06-11 17:09:51

相關問題