使用sqldataAdapter.Fill附加Datatable

时间:2016-10-02 15:19:57

标签: c# .net datatable

我正在迭代循环,这个想法是每次循环都会将更多行添加到同一个数据表中。我明白通过使用填充方法就是这种情况。但是在我的代码中,最终的数据表是最后一个循环的结果。这是我的代码:

通话方法

        // 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;
    }

有什么不合适的地方吗?

1 个答案:

答案 0 :(得分:0)

每次拨打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);
        }
    }
}

所以我毕竟没有看到你的代码有什么问题。必须是未显示的内容。