在C#中结束循环时存储DataSet

时间:2018-01-22 07:40:37

标签: c# list dataset

我正在使用此代码填充DataSet

var ds = new DataSet();
List<string> list = new List<string>();
foreach (DataGridViewRow row in grdInterPOList.Rows)
{
    DataGridViewCheckBoxCell chk = row.Cells[0] as DataGridViewCheckBoxCell;
    if (Convert.ToBoolean(chk.Value) == true)
        if (row.Cells.Count >= 2 && row.Cells[1].Value != null) 
        {
            list.Add(row.Cells[1].Value.ToString());
        }
}
foreach (var _PO_No in list)
{

        ds= ShippingData_Export(_PO_No);

}


private DataSet ShippingData_Export(string X_PO_NO)
{
    var ds = new DataSet();
    var sqlConn = new SqlConnection(strConStr);
    try
    {
        sqlConn.Open();
        var cmd = new SqlCommand("proc_TBL_PO_M_ShippingExcel", sqlConn);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@X_PO_NO", X_PO_NO);
        var da = new SqlDataAdapter(cmd);
        da.Fill(ds);
        sqlConn.Close();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
    return ds;
}

如果我们选择多于1个_PO_No,那么我们只会在循环后得到最后一个值。 所以我的问题是如何在结束循环后存储DataSet值。 例如:如果我们在结束循环后选择2 _PO_No:GV01和GV02。我们将得到2 _PO_No不仅是最后一个(GV02)

1 个答案:

答案 0 :(得分:2)

代码中的问题是:

foreach (var _PO_No in list)
{
    ds = ShippingData_Export(_PO_No);
}

您正在循环浏览列表并在列表中的每个项目上调用ShippingData_Export,但每次调用此方法时,您都会覆盖ds。这就是为什么只存储最后一个值。

如果您希望单个DataSet包含多个结果,则需要将DataSet传递给ShippingData_Export方法并将结果添加到其中,而不是每个都创建一个新结果时间。

结果将是这样的:

foreach (var _PO_No in list)
{
    ShippingData_Export(_PO_No, ds);
}

private void ShippingData_Export(string X_PO_NO, DataSet ds)
{
    var sqlConn = new SqlConnection(strConStr);
    try
    {
        sqlConn.Open();
        var cmd = new SqlCommand("proc_TBL_PO_M_ShippingExcel", sqlConn);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@X_PO_NO", X_PO_NO);
        var da = new SqlDataAdapter(cmd);
        da.Fill(ds);
        sqlConn.Close();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
    return ds;
}

您的代码还有其他一些小问题:

  • 将{}添加到行if (Convert.ToBoolean(chk.Value) == true)之后的块中。习惯明确使用{}使代码更具可读性。
  • 您正在手动打开SQL Connection,但在发生异常时您不会将其关闭。查看using statement以确保即使出现问题也始终关闭连接。