数据集可以使用存储过程返回多少个表

问题描述 投票:0回答:3

我正在使用包含6个选择查询的存储过程,我正在从C#执行此存储过程。我只获得前3个查询的数据集中的表格。即从我使用的前3个查询中检索数据。数据集仅包含3个表。

我无法理解什么是错误的,或者从C#执行存储过程是否可以检索最多只有3个表

更新:

Create Procedure myTest
    @paraID as bigint
AS

在这里,我使用@paraid子句中的参数where编写了6个选择查询

在C#中:

SqlConnection con = new SQLConnection();
SqlCommand cmd = new SQLCommand();
SqlDAtaadpter adpt = new SqlDataadapter();

DataSet ds = new DataSet();

con.ConnectionString = "MyConnectionString";

con.Open();
cmd.CommandType= CommandType.StoredProcedure;
cmd.CommandText ="mytest";
cmd.Parameters.Add("@paraID", SqlDbType.Bigint).value = 1;

cmd.Connection = con;

adpt.SelectCommant = cmd;
adpt.Fill(ds);

con.Close();

这是我的c#代码。现在告诉我要做什么

c# sql-server-2005
3个回答
4
投票

FRom DbDataAdapter.Fill Method (DataSet)

如果命令未返回任何行,则不会向DataSet添加任何表,也不会引发任何异常。

当用于填充DataSet的SELECT语句返回多个结果(如批处理SQL语句)时,如果其中一个结果包含错误,则会跳过所有后续结果,并且不会将其添加到DataSet中。

当指定的查询返回多个结果时,返回查询的每个行的结果集将放在一个单独的表中。通过将整数值附加到指定的表名称来命名其他结果集(例如,“Table”,“Table1”,“Table2”等)。因为没有为不返回行的查询创建表,所以如果处理插入查询后跟select查询,则为select查询创建的表名为“Table”,因为它是第一个创建的表。使用列和表名称的应用程序应确保不会发生与这些命名模式的冲突。

您确定没有错误并且所有6个SELECT语句都返回数据吗?


0
投票

数据集没有这样的数据表限制,因此在您的情况下,您可以从SP存储和返回数据表。我认为你的sp执行必定存在一些问题。如果您确定sp上没有错误且没有异常,那么对于测试,您可以使用microsoft dll来告诉您究竟发生了什么。

Microsoft为访问数据库提供了一个很好的dll(数据访问应用程序块),因此您可以尝试这样做。在这个DLL中,SqlHelper类中有一些函数,如ExecuteDataSet,ExecuteNonQuery等。

所以在你的情况下你可以使用

object [] objParams = {par1,par2}; DataSet ds = SqlHelper.ExecuteDataset(ConnectionString,“SP_Name”,objParams);

和SP_Name应该是这样的..

创建过程SP_REName varchar @ par1 as

//从tab1中选择* //从tab2中选择* //从tab3中选择* //从tab4结束选择*

所以在SqlHelper的ExecuteDataSet上,你将得到4个表...所以试试ApplicationDataBlock.dll


0
投票

我意识到这个问题已经过时了,但当我遇到同样的问题时,这是我通过谷歌搜索找到的唯一一个描述问题的问题。接受的答案没有帮助,所以我分享我的解决方案。 回顾一下这个问题。使用DataAdapter从返回多个结果集的存储过程中填充表,可以获得比预期更少的表。在我的情况下,从8开始是4。直接在Management Studio中调用存储过程会返回正确的数字。最初的OP对环境一无所知。我在Linux发行版上使用mono来通过网络访问SQL Server时遇到了问题。在托管SQL Server的计算机上本地运行相同的c#二进制文件时,没有问题。当我检查时,我所拥有的每个存储过程(返回多个结果集)在从Linux调用时都有同样的问题。 为了彻底,我设置SQL Profiler来捕获SP调用。虽然您无法看到返回的实际结果,但它确实确认正在获取正确的行数。因此,我不得不得出结论,单声道实现中的某个地方存在一个错误,导致DataAdapter无法填充所有表。幸运的是,有一种很好的方法可以解决这个问题,完全不使用DataAdapter,而是使用DataReader。我已经有了一个帮助函数,它从DataReader返回一个DataTable(不是很难自己编写,但是如果有人需要帮助,请告诉我),所以我能够编码:

SqlDataReader rdr = cmd.ExecuteReader();
List<DataTable> tables = new List<DataTable>();
while (rdr.HasRows)
{
    DataTable t = GetTableFromReader(rdr);
    tables.Add(t);
    rdr.NextResult();
}

然后我需要做的就是将表添加到DataSet中,我已经完成了DataAdapter的Fill方法所做的工作。此技术适用于.Net的本机Windows和Mono实现。顺便说一句,根据我的经验,文档中引用的摘录实际上是错误的。它声明如果多个结果集的任何部分不包含任何行,则DataAdapter的Fill方法不会将表添加到DataSet。这是不正确的。事实上,你确实添加了一个表,正确设置了列,没有行。如果您绑定到DataSet,这一点尤其重要(并且非常有用)。但是,我的上述解决方法不会这样做。它的行为与文档说DataAdapter应该!因此,如果要绑定到生成的DataSet,则必须添加自己的空表来替换丢失的表。我的解决方法工作并检索正确数量的表的事实进一步证明了所遇到的问题是单声道实现中的错误。

© www.soinside.com 2019 - 2024. All rights reserved.