我在C#工作,我有一个DataSet
和一个DataTable
。我已将DataTable
添加到DataSet
。然后我使用SQL查询填充DataTable
。在调试器中,我可以在DataTable
中看到数据。我在DataSet的表列表中看到了DataTable
,但它是一个null
表(即没有列,没有数据)。为什么数据没有显示?这是我的代码:
DataSet ds = new DataSet();
DataTable dt = new DataTable("BaseData");
ds.Tables.Add(dt);
List<SqlParameter> paramz = new List<SqlParameter>();
paramz.Add(new SqlParameter("@LitHoldDetailsID", litHoldDetailsID));
dt = LHClassLibrary.LHDataAccessLayer.ExecuteSelect("usp_GetLitHoldDetails_A", paramz);
我试过
ds.AcceptChanges();
但这没有用。我是否真的必须提前定义DataTable中的所有列?这是一个返回大量列的查询,所以我希望我可以跳过这一步。
答案 0 :(得分:3)
你可能需要像这样使用SqlAdaptor.Fill(DataTable):
string sql = @"Data Source=.;Initial Catalog=test;Integrated Security=True";
SqlConnection conn = new SqlConnection(sql);
conn.Open();
SqlDataAdapter adaptor = new SqlDataAdapter("<sql query>", conn);
DataTable dt = new DataTable();
adaptor.Fill(dt);
答案 1 :(得分:2)
我将尝试以这种方式更改代码执行的顺序
DataSet ds = new DataSet();
List<SqlParameter> paramz = new List<SqlParameter>();
paramz.Add(new SqlParameter("@LitHoldDetailsID", litHoldDetailsID));
DataTable dt = LHClassLibrary.LHDataAccessLayer.ExecuteSelect("usp_GetLitHoldDetails_A", paramz);
dt.TableName = "BaseData";
if(dt.DataSet != null) dt.DataSet.Tables.Remove(dt);
ds.Tables.Add(dt);
我认为ExecuteSelect方法将初始化并返回一个DataTable,其中包含存储过程返回的所有列和行。
仅在此时,DataTable才会添加到您的DataSet中,而不是之前
在您的代码中,变量dt
被分配给ExecuteSelect返回的DataTable,但这与之前创建的DataTable不同,因此您的DataSet保留为空表。
答案 2 :(得分:0)
我总是这样做;希望这可以帮助!
using (SqlConnection con = new SqlConnection(SqlConString))
{
string command = "Your Query Here...";
using (SqlCommand cmd = new SqlCommand(command, con))
{
cmd.Parameters.AddWithValue("@Param", SqlDbType.Type).Value = YourParameter;
con.Open();
using (SqlDataAdapter da = cmd.ExecuteNonQuery())
{
da.Fill(dt);
}
}
}