Я пытаюсь перебрать текстовый файл и запустить запрос по содержимому каждой строки. Полученные данные каждого запроса должны отображаться в 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();
}
}
Вы можете запустить один запрос со всем идентификатором (пример ниже). Несколько комментариев для улучшения кода:
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();
}
}
items += reader.ReadLine() + ",";
, Я получаю сообщение об ошибке " Use of unassigned local variable 'items'
. РЕДАКТИРОВАТЬ: исправлено с помощью string items = "";
Создайте объект для хранения ваших данных, заполните его в цикле 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();
MyValue1 = ds["myvalue1"]
Чем я должен заменить ["myvalue1"]
на? Я попытался использовать индексирование ds[0]
и имя поля из базы данных ds["item"]
. Оба выдают ошибки.
Repeater
может иметь свойствоAppendDataBoundItems
, какComboBox
. Это сделает так, что каждый раз, когда вы вызываете DataBind, он будет добавляться вместо замены. Не уверен, что если есть.