使用sqldataAdapter.Fill追加数据表

本文关键字:数据表 追加 Fill sqldataAdapter 使用 | 更新日期: 2023-09-27 18:09:50

我正在通过循环迭代,其想法是,每次它通过循环更多的行被添加到相同的数据表。我明白,通过使用填充方法,这将是这种情况。然而,在我的代码中,最后的数据表是最后一个循环的结果。下面是我的代码:

调用方法
        // declare a new new datatable to hold the results of the query
        DataTable dtResults = new DataTable();
        foreach (OrgChartNode node in RadOrgChart1.GetAllNodes())
        {
            Label label1 = (Label)node.GroupItems[0].FindControl("Label1");
            foreach (OrgChartRenderedField rf1 in node.GroupItems[0].RenderedFields)
            {
                if (rf1.Label == "ibl")
                {
                    string[] iblWords = rf1.Text.Split(':');
                    string iblId = iblWords[0].Trim();
                    string[,] sqlParam01 =
                                {
                                    { "@document_id", iblId },
                                    { "@class_id", "123" }
                                };
                    dtResults = Helper.GetDataTablePrime(SQL_Default.SQL_Report, sqlParam01, dtResults);
                }
            }
            RadGrid2.DataSource = dtResults;
            RadGrid2.DataBind();

这里是GetDataTablePrime方法:

    public static DataTable GetDataTablePrime(string query, string[,] sqlParameters, DataTable dtContents)
    {
        String connString = "Data Source=*********************************";
        SqlDataAdapter adapter = new SqlDataAdapter();
        using (SqlConnection conn = new SqlConnection(connString))
        {
            adapter.SelectCommand = new SqlCommand(query, conn);
            // loop through adding parameters
            for (int i = 0; i <= sqlParameters.GetUpperBound(0); i++)
            {
                adapter.SelectCommand.Parameters.Add(new SqlParameter(sqlParameters[i, 0], sqlParameters[i, 1]));
            }
            adapter.Fill(dtContents);
            conn.Close();
        }
        return dtContents;
    }

使用sqldataAdapter.Fill追加数据表

不要在每次调用GetDataTablePrime时新建数据适配器。使用与dtResults相同的实例

编辑这个答案是错误的。如果每次都重新启动数据适配器,它仍然可以工作:

using System;
using System.Data;
using System.Data.SqlClient;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add(new DataColumn("foo"));
            for (int i = 0; i < 3; i++)
            {
                dt = FillIt(dt);
            }
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                Console.WriteLine(dt.Rows[i][0]);
            }
            Console.ReadKey();
        }
        private static DataTable FillIt(DataTable dtin)
        {
            SqlDataAdapter da = new SqlDataAdapter();
            SqlConnection cnxn = new SqlConnection("Data Source=(LocalDB)''MSSQLLocalDB;Initial Catalog=master;Integrated Security=True");
            SqlCommand cmd = new SqlCommand("SELECT 'bar' AS [foo];", cnxn);
            da.SelectCommand = cmd;
            da.Fill(dtin);
            return dtin;
        }
    }
}

但是您不需要返回数据表。它是一个引用类型,所以你可以直接填充它。

using System;
using System.Data;
using System.Data.SqlClient;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add(new DataColumn("foo"));
            for (int i = 0; i < 3; i++)
            {
                FillIt(dt);
            }
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                Console.WriteLine(dt.Rows[i][0]);
            }
            Console.ReadKey();
        }
        private static void FillIt(DataTable dtin)
        {
            SqlDataAdapter da = new SqlDataAdapter();
            SqlConnection cnxn = new SqlConnection("Data Source=(LocalDB)''MSSQLLocalDB;Initial Catalog=master;Integrated Security=True");
            SqlCommand cmd = new SqlCommand("SELECT 'bar' AS [foo];", cnxn);
            da.SelectCommand = cmd;
            da.Fill(dtin);
        }
    }
}

所以我看不出你的代码有什么问题。