2016-10-02 48 views
0

我循環通過一個循環,其想法是,每當它通過循環更多的行被添加到數據表一樣。我明白,通過使用填充方法,情況就是如此。但是在我的代碼中,最後的數據表是最後一個循環的結果。這裏是我的代碼:附加的DataTable使用sqldataAdapter.Fill

調用方法

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

做任何事情看的地方?

+0

如果你看,爲這個「helper」方法準備所有東西的代碼比直接使用DB Provider更復雜,更隱晦和不夠精確。 – Plutonix

回答

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

所以我沒有看到你的代碼有什麼問題。必須是未顯示的東西。