我正在使用包含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#代码。现在告诉我要做什么
答案 0 :(得分:4)
FRom DbDataAdapter.Fill Method (DataSet)
如果命令没有返回任何行, 没有表添加到DataSet, 并且没有例外。
当SELECT语句用于 填充DataSet返回多个 结果,例如批处理SQL语句, 如果其中一个结果包含 错误,所有后续结果都是 跳过并且未添加到 数据集。
当指定的查询返回时 多个结果,结果集为 每行返回查询都放在 一个单独的表。额外的结果 集合通过附加整数来命名 指定表名的值 (例如,“表”,“表1”, “表2”,依此类推)。因为没有桌子 是为没有的查询创建的 如果处理插入,则返回行 查询后跟一个select查询, 为select查询创建的表是 名为“表”,因为它是第一个 表创建。应用使用 列和表名应该确保 与这些命名冲突 模式不会发生。
您确定没有错误,并且所有6个SELECT语句都返回数据吗?
答案 1 :(得分: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应该是这样的..
crerate Procedure SP_Name varchar @ par1 如
//从tab1中选择* //从tab2中选择* //从tab3中选择* //从tab4中选择* 端
所以在SqlHelper的ExecuteDataSet上,你将获得4个表... 所以尝试ApplicationDataBlock.dll
答案 2 :(得分: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,则必须添加自己的空表来替换丢失的表。 我的解决方法工作并检索正确数量的表的事实进一步证明了所遇到的问题是单声道实现中的错误。