我正在迭代循环,这个想法是每次循环都会将更多行添加到同一个数据表中。我明白通过使用填充方法就是这种情况。但是在我的代码中,最终的数据表是最后一个循环的结果。这是我的代码:
通话方法
// 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 :(得分: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);
}
}
}
所以我毕竟没有看到你的代码有什么问题。必须是未显示的内容。