gpt4 book ai didi

.net - 执行存储过程返回多个表而不使用 SqlDataAdapter.Fill()?

转载 作者:行者123 更新时间:2023-12-01 04:01:19 26 4
gpt4 key购买 nike

我知道通常推荐的从存储过程填充 DataSet 实例的方法是使用 SqlDataAdapter.Fill(DataSet)。我能找到的每个答案都说要以开箱即用的方式使用它。我会正常授予的,它很好用。

但是,当您需要处理存储过程输出和 DataSet 输入之间的数据时,它会崩溃。具体来说,当在输出中使用自定义 CLR 类型时,它会以 InvalidOperationException: DataReader.GetFieldType(n) returned null. 中断。哪里n是在其输出中使用 CLR 类型的列的列索引(在其中一个表中;似乎没有明显的方法可以告诉列索引引用哪个表)。这是可以理解的,因为读者不知道相关列中的数据类型。

我可以把CLR类型的反序列化逻辑打出来,两个地方都用,但是 在 Fill() 崩溃之前,我似乎没有时间调用任何此类反序列化方法。

我知道 SqlCommand.ExecuteReader() ,但似乎只能从那张 table 中取出一张 table 。

有问题的 CLR 类型旨在用更严格的内容替换核心系统字段之一(当前存储为自由格式文本)。遍历数据库并向此类字段的每个返回实例添加方法调用的问题已被讨论为一种可能性,但绝对是一项不平凡的工作。因此,人们认为可以在 DAL 中进行转换(只要求可以通过编程方式识别此类列,这是可行的),从而使存储对客户端透明,并且客户端对数据的使用仍然对数据库透明。

因此:如何在不使用 SqlDataAdapter.Fill() 的情况下访问存储过程输出中的所有表? 或者 ,我如何 Hook 到 SqlDataAdapter.Fill() 的执行以在 SP 的执行和填充 DataSet 之间进行手动处理?

最佳答案

可以 选择带有 DataReader 的多个表.您可以使用 reader.NextResult 检查是否有更多结果集并将数据阅读器推进到它:

using (var con = new SqlConnection(Properties.Settings.Default.ConnectionString))
{
using (var cmd = new SqlCommand("StoredProcedureName", con))
{
cmd.CommandType = CommandType.StoredProcedure;
int rowCount = 0;
con.Open();
using (IDataReader rdr = cmd.ExecuteReader())
{
while (rdr.Read())
{
Console.WriteLine("Object 1 in Row {0}: '{1}'", ++rowCount, rdr[0]);
}
if (rdr.NextResult())
{
rowCount = 0;
while (rdr.Read())
{
Console.WriteLine("Object 1 in Row {0}: '{1}'", ++rowCount, rdr[0]);
}
}
}
}
}

关于.net - 执行存储过程返回多个表而不使用 SqlDataAdapter.Fill()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13340921/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com