Циклический просмотр текстового файла для построения запроса и отображения результатов в повторителе

1

Я пытаюсь перебрать текстовый файл и запустить запрос по содержимому каждой строки. Полученные данные каждого запроса должны отображаться в My_Repater.

У меня работает следующий код, но он заполняет ретранслятор только данными из последнего запроса. Как я могу заполнить репетиров по строкам результатами каждого запроса? Любая помощь будет очень высоко ценится.

protected void txtUpload1_Click(object sender, EventArgs e)
    {
        //Define file upload control as fu
        FileUpload fu = FileUpload1;
        //Check to see if file is present
        if (fu.HasFile)
        {
            //Create StreamReader and pass contents of file
            StreamReader reader = new StreamReader(fu.FileContent);
            //Open SQL connection
            String strConnString = System.Configuration.ConfigurationManager.ConnectionStrings["mike_db"].ConnectionString;
            SqlConnection con = new SqlConnection(strConnString);
            con.Open();
            //Do the following until all file content has been read
            do
            {
                string item = reader.ReadLine();
                string qry = "select * from prod_class where item =" + "'" + item + "';";
                cmd = new SqlCommand(qry, con);
                queryText.Text = qry;
                DataSet ds = new DataSet();
                da = new SqlDataAdapter(cmd);
                da.Fill(ds);
                //Bind data to the repeater
                My_Repeater.DataSource = ds;
                My_Repeater.DataBind(); 
            }
            while (reader.Peek() != -1);
            reader.Close();
        }
    }
  • 0
    привязать данные вне цикла while. создать все данные в цикле для внешней переменной, а затем связать, когда вы закончите чтение всех данных.
  • 0
    Кроме того, я не уверен, но Repeater может иметь свойство AppendDataBoundItems , как ComboBox . Это сделает так, что каждый раз, когда вы вызываете DataBind, он будет добавляться вместо замены. Не уверен, что если есть.
Показать ещё 4 комментария
Теги:
repeater

2 ответа

1
Лучший ответ

Вы можете запустить один запрос со всем идентификатором (пример ниже). Несколько комментариев для улучшения кода:

1) Во-первых, и самое главное, вы оставляете себя открытым для SQL-инъекций.

2) Научитесь использовать инструкцию using для одноразовых объектов (например, SQLConnection)

3) Хранимая процедура повысит производительность, затем вы можете передать весь свой идентификатор в параметре таблицы.

protected void txtUpload1_Click(object sender, EventArgs e)
{
    //Define file upload control as fu
    FileUpload fu = FileUpload1;
    //Check to see if file is present
    if (fu.HasFile)
    {
        //Create StreamReader and pass contents of file
        StreamReader reader = new StreamReader(fu.FileContent);
        //Open SQL connection
        String strConnString = System.Configuration.ConfigurationManager.ConnectionStrings["mike_db"].ConnectionString;
        SqlConnection con = new SqlConnection(strConnString);
        con.Open();

        string items = "";
        //Do the following until all file content has been read
        do
        {
            items += reader.ReadLine() + ",";

        }
        while (reader.Peek() != -1);

        //remove last comma
        items = items.Substring(0, items.Length -1);

        string qry = String.Format("select * from prod_class where item IN ({0})", items);
        cmd = new SqlCommand(qry, con);
        queryText.Text = qry;
        DataSet ds = new DataSet();
        da = new SqlDataAdapter(cmd);
        da.Fill(ds);
        //Bind data to the repeater
        My_Repeater.DataSource = ds;
        My_Repeater.DataBind(); 

        reader.Close();
    }
}
  • 0
    Спасибо за этот подробный ответ. Все выглядит хорошо и имеет смысл, за исключением items += reader.ReadLine() + ","; , Я получаю сообщение об ошибке " Use of unassigned local variable 'items' . РЕДАКТИРОВАТЬ: исправлено с помощью string items = "";
  • 0
    Извините код не был проверен. Заменить на строковые элементы = "";
Показать ещё 2 комментария
1

Создайте объект для хранения ваших данных, заполните его в цикле while, а затем DataBind() повторителя после того, как все будет готово.

public class MyObject
{
    public string MyValue1 { get; set; }
    public string MyValue2 { get; set; }
}

var myList = new List<MyObject>();
while(){
//...
myList.Add(new MyObject { MyValue1 = ds["myvalue1]", MyValue2 = ds["myvalue2"]});
}

My_Repeater.DataSource = myList;
My_Repeater.DataBind();
  • 0
    Это отличная идея. Однако у меня возникли проблемы с этим: MyValue1 = ds["myvalue1"] Чем я должен заменить ["myvalue1"] на? Я попытался использовать индексирование ds[0] и имя поля из базы данных ds["item"] . Оба выдают ошибки.
  • 0
    Возможно, вам придется привести ваши значения из источника данных. MyValue1 = ds ["myvalue1"]. ToString (), MyValue2 = ds ["myvalue2"]. ToString ()
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню