0

我在 C# 中工作,我有一个DataSet和一个DataTable. 我已将DataTable. 然后我用 SQL 查询DataSet填充。DataTable在调试器中,我可以看到我的DataTable. 我DataTable在 DataSet 的表列表中看到了我的,但它是一个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 中的所有列吗?这是一个返回大量列的查询,所以我希望我可以跳过这一步。

4

3 回答 3

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);
于 2013-01-07T21:18:26.943 回答
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 仍然是一个空表。

于 2013-01-07T21:23:24.677 回答
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);
        }
    }
}
于 2013-01-07T21:25:04.637 回答