修改DataTable是C#中DataSet的一部分 - 更改未在DataSet中显示

时间:2013-01-07 21:11:43

标签: c# datatable dataset

我在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中的所有列?这是一个返回大量列的查询,所以我希望我可以跳过这一步。

3 个答案:

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