Проблема в заполнении GridView в ASP.NET (C #) - PullRequest
2 голосов
/ 11 июня 2011

Я пытаюсь заполнить Gridview результатами из цикла. Но я получаю только последний результат в цикле.
Я думаю, что GridView перезаписывается при каждом выполнении цикла for.

Можете ли вы, люди, помочь мне решить эту проблему, пожалуйста.

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 ]

3 голосов
/ 11 июня 2011

Существует несколько проблем с этим кодом:

  • похоже, что если 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.

Существует несколько способов приблизиться к этому. Зависит от вашей СУБД и требований.

2 голосов
/ 11 июня 2011

Используйте предложение in в SQL-запросе и передайте список идентификаторов в FilePath

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

Проверьте эти URL-адреса, связанные с использованием предложения in.

Методы для In-Clause и SQL Server

Параметризация предложения SQL IN?

1 голос
/ 11 июня 2011

Создайте список или BindingSource вне цикла, свяжите его с вашим сеточным представлением, а затем добавьте все записи в этот список или источник.

Проблема с вашим текущим подходом заключается в том, что вы перезаписываете записи, извлеченные избаза данных с новым источником данных каждый раз, так как вы указали, только «последний» «установлен», и более старые назначения удаляются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...