0

我在这里遇到了与此问题类似的问题(在运行时显示 SQL Server 查询结果中的列的数据类型和大小),该问题没有可靠的解决方案。

我想知道是否有人找到了解决方案或解决方法。我可以使用SqlDataAdapter.Fill() 没有问题,但是.FillSchema() 会报错我在存储过程中创建的临时表不存在。

我的目标是能够用数据和来自源的模式填充 DataTable。

4

3 回答 3

1

存储过程和临时表通常不能很好地与数据库对象的强类型实现混合。

如果您将#temp 表更改为应该可以解决您的问题的表@variable。

如何从临时表更改为表变量的示例如下:

    CREATE TABLE #tempTable (ID INT, Val VARCHAR(50))

    DECLARE @tempTable TABLE(ID INT, Val VARCHAR(50))
于 2019-05-30T11:42:49.943 回答
0

我遇到了同样的问题SqlDataAdapter。我能够通过更改要使用的代码来解决该问题SqlDataReader

如果您根本不需要修改架构

如果您不需要操作DataTable对象的架构并且您还计划使用从存储过程返回的数据,则以下代码段将正常工作。

var command = new SqlCommand("stored procedure name")
{
    CommandType = CommandType.StoredProcedure 
};

var adapter = new SqlDataAdapter(command);
var dt = new DataTable();

adapter.Fill(dt);


var command = new SqlCommand("stored procedure name")
{
    CommandType = CommandType.StoredProcedure 
};

var reader = command.ExecuteReader();
var dt = new DataTable();

dt.Load(reader);

这两种方法都将使用与从存储过程调用返回的名称和类型相对应的列名称和类型填充数据表。如果您需要有关架构的信息,可以通过DataTable.Columns属性访问它。

如果需要修改架构

如果您只需要模式信息,或者如果您需要在DataTable使用数据填充对象之前操作对象中的模式,即使SqlDataAdapter.FillSchema不需要,以下方法也可以使用。

var command = new SqlCommand("stored procedure name")
{
    CommandType = CommandType.StoredProcedure 
};

var reader = command.ExecuteReader();

var schemaTable = reader.GetSchemaTable();

SqlDataReader.GetSchemaTable()将返回一个将DataTable列元数据填充为行的对象。

您可以枚举结果以构建和/或操作对象中的列,该DataTable对象将保存由SqlDataReader.

在我的例子中,我需要每列都是一个字符串,以避免在将数据导出到电子表格时从 Microsoft Excel 格式化“帮助”。例如,我的代码如下所示:

var dt = new DataTable();

foreach(DataRow row in schemaTable.Rows)
{
    dt.Columns.Add((string)row["ColumnName"], typeof(string));
}

dt.Load(reader);
于 2018-06-19T21:53:56.020 回答
-1

如果不需要DataSet,只需要一个DataTable,可以使用

DataTable dt= new DataTable();

dt.Load(cmd.ExecuteReader());

对于 DataSet,您至少必须告诉 SP 返回的表的名称(这意味着数字)。

DataSet ds = new DataSet();
SqlDataReader sdr = cmd.ExecuteReader();
ds.Load(sdr, LoadOption.OverwriteChanges,"Table1");
于 2013-11-06T12:52:46.860 回答