Как я могу перебрать массив и заполнить сетку данных? - PullRequest
1 голос
/ 12 июля 2011

Вот сценарий:

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

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

protected void submitButton_Click(object sender, EventArgs e)
    {
        string textLines;
        string[] textLine;

        textLines = scannedCode.Text;

        textLine = textLines.Split(Environment.NewLine.ToArray(), StringSplitOptions.RemoveEmptyEntries);

        DataSet ds = null;
        Database db = DatabaseFactory.CreateDatabase("ConnectionString");
        DataSet ds2 = null; 
        Database db2 = DatabaseFactory.CreateDatabase("ConnectionString");

        foreach (string s in textLine)
        {
            try
            {
                DbCommand command2 = db.GetStoredProcCommand("sel_InfoByID_p");
                db2.AddInParameter(command2, "@pGuid", DbType.String, s);
                ds2 = db2.ExecuteDataSet(command2);
                DataGrid1.DataSource = ds2;
                DataBind();

             }

            catch (Exception ex)
            {

            }
        }



    }

Ответы [ 4 ]

1 голос
/ 12 июля 2011

Во-первых, можно объединить два набора данных с помощью метода DataSet.Merge.Это означает, что вы должны создать новый DataSet вне цикла, а затем объединить его с DataSet, созданным хранимой процедурой.Еще одним решением является копирование строк из одного набора данных в другой с помощью метода ImportRow таблицы.Последнее решение выглядит лучше для меня.Вот пример кода:

DataTable dt = new DataTable;
...  

ds2 = db2.ExecuteDataSet(command2);
for(int i = 0; i < ds2.Tables[0].Rows.Count; i ++)
dt.ImportRow(ds2.Tables[0].Rows[i]);

...
DataGrid1.DataSource = dt;
DataGrid1.DataBind();
1 голос
/ 12 июля 2011

Создайте DataTable снаружи и в вашем цикле for добавьте возвращенную строку.

DataTable dt = new DataTable();

/// ... Добавить известные столбцы здесь

Внутри цикла добавьте строки в таблицу. Сразу после for for bind table.

protected void submitButton_Click(object sender, EventArgs e)
    {
        string textLines;
        string[] textLine;

        textLines = scannedCode.Text;

        textLine = textLines.Split(Environment.NewLine.ToArray(), StringSplitOptions.RemoveEmptyEntries);

        DataSet ds = null;
        Database db = DatabaseFactory.CreateDatabase("ConnectionString");
        DataSet ds2 = null; 
        Database db2 = DatabaseFactory.CreateDatabase("ConnectionString");

        DataTable dt = new DataTable();
        ///...Add known columns here
        foreach (string s in textLine)
        {
            try
            {
                DbCommand command2 = db.GetStoredProcCommand("sel_InfoByID_p");
                db2.AddInParameter(command2, "@pGuid", DbType.String, s);
                DataRow myNewRow = db2.ExecuteDataSet(command2).tables[0].rows[0];
                dt.Rows.Add(myNewRow);

             }

            catch (Exception ex)
            {

            }
        }


               DataGrid1.DataSource = dt;
                DataBind();


    }
0 голосов
/ 13 июля 2011

На самом деле ваша проблема заключалась в том, что вы связываете сетку на КАЖДОЙ итерации, иначе ничего плохого в коде. Так что вместо:

    foreach (string s in textLine)
    {
        try
        {
            DbCommand command2 = db.GetStoredProcCommand("sel_InfoByID_p");
            db2.AddInParameter(command2, "@pGuid", DbType.String, s);
            ds2 = db2.ExecuteDataSet(command2);
            DataGrid1.DataSource = ds2;
            DataBind();
         }
        catch (Exception ex)
        {
        }
    }

сделать это:

    foreach (string s in textLine)
    {
        try
        {
            DbCommand command2 = db.GetStoredProcCommand("sel_InfoByID_p");
            db2.AddInParameter(command2, "@pGuid", DbType.String, s);
            ds2 = db2.ExecuteDataSet(command2);
         }
        catch (Exception ex)
        {
        }
    }

    DataGrid1.DataSource = ds2;
    DataBind();

Однако, поскольку вы выполняете циклы с той же функциональностью, для оптимизации я предлагаю:

    SqlConnection connection = new SqlConnection(ConnectionString);
    SqlCommand command = new SqlCommand("MyStoredProcName", connection);
    command.CommandType = CommandType.StoredProcedure;

    SqlParameter submitParam = new SqlParameter("@pGuid", SqlDbType.String);

    //use SqlDbType.Bit if  you are returning true/false.      
    SqlParameter returParameter = new SqlParameter("@ReturnedParam", SqlDbType.String);  
    returParameter.Direction = ParameterDirection.Output;

    connection.Open();

    foreach (string s in textLine)
    {
            returnString.Value = s;            
            command.Parameters.Clear(); 
            command.Parameters.Add(submitParam); 
            command.Parameters.Add(returParameter);         

            try
            {                
                    command.ExecuteNonQuery();
                    store the returned string in DataTable, BindingList<string> or any, but this is how to retrieve it:
                Convert.ToString(Command.Parameters["@ReturnedParam"].Value, CultureInfo.CurrentCulture)
            }
            catch (Exception ex)
            {
                ;;
            }
    }

    connection.Close();

    Do the grid binding here
0 голосов
/ 12 июля 2011

Попробуйте

DataTable obj_Tb=new DataTable();
  obj_Tb.Columns.Add("ColumnName");
   .  //Add Columns as your requirement
   .
   .

foreach (string s in textLine)
        {
            try
            {
                DataRow objrow=obj_Tb.NewRow();
                DbCommand command2 = db.GetStoredProcCommand("sel_InfoByID_p");
                db2.AddInParameter(command2, "@pGuid", DbType.String, s);
                ds2= db2.ExecuteDataSet(command2);
          objrow["ColumnName"]=ds2.Table[0].Rows[RowNumber]["ColumnName"].tostring();
                //Add Values to all columns as requirement
                obj_Tb.Rows.Add(objrow);

             }

            catch (Exception ex)
            {

            }
}
              DataGrid1.DataSource = obj_Tb;
              DataGrid1.DataBind();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...