Существует несколько проблем с этим кодом:
- похоже, что если
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. И имеет ограничение 2100 элементов в MS SQL.
Существует несколько способов приблизиться к этому. Зависит от вашей СУБД и требований.