高分求解:存储过程中能包含2个查询语句么? 如题,请高手指教。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 可以,在程序中可以返回两个DataTable 可以在返回时返回一个DataSet通过DataSet.Tables[int index]或DataSet.Tables["表名"]的方式得到对应的DataTable然后正常操作如果使用DataReader 需要调用DataReader.NextResult方式读取第二张表 存储过程就是一些SQL语句集合,想写多少都可以,除了简单的select外,还可以加入逻辑判断,游标等. 楼主到底是要问能否同时返回两个表给asp.net调用呢?还是能否在一个存储过程里执行两条select语句? 可以多个用dataset接了数据后分别放在不同的datatable里面 It's sure!So what do want indeed? please refer to http://www.asp.net/learn/data-access/tutorial-01-vb.aspx.In this article, two sql statements are used when inserting a record. 个人以为:能包含两个查询语句,但只能返回一个Table 没有问题,但程序中应设置返回的是DataSet 可以包含多条Select语句。你可以返回一个DataSet,假设存储过程如下:...SELECT * FROM T1PRINT 'Hello'SELECT * FROM T2SELECT * FROM T3如果要读取条二条SELECT语句的返回结果,则用:DataSet.Tables[1]表示即可。你自己可以试一下 可以使用多个查询语句,返回的是多个DataSet而不是多个DataTable 如果我有三个查询语句,是不是在dataset里就相应的有三个表,我可以把这三个表一块付给水晶报表的数据源么? 回复2楼,我就是想知道怎么将table[0],table[1]...付给水晶报表的数据源 应该是一个dataset多个datatable吧 晕,返回一个结果集,什么都可以包含,与DATATABLE DATASET 什么关系啊?涉及多表,关联起来就可以了 是这样没错不过不能一起交给报表需要手工的把三个表合并成一个新的表不过那样就不能实现报表绑定到DataTable进行更新的效果了 如果楼主想要实现报表同时绑定三个DataTable可以使用视图加触发器的方式实现 楼主还可以更改存储过程写法select * from table1,table2,table3.......这样返回一个结果集可以直接交给报表如果要实现更新,最好也把更新过程写成存储过程 这个问题我好象遇见过,前两天的事情,我解决了.可以返回两个输出参数,参数是游标类型,调用的时候传两个OUT类型的DATATABLE不知道是不是楼主的意思!!!!!!!!!!!!!!!! DataTable table1 = new DataTable(); table1.Columns.Add("a1"); table1.Columns.Add("a2"); table1.Columns.Add("a3"); table1.Columns.Add("a4"); table1.Columns.Add("a5"); table1.Columns.Add("a6"); table1.Rows.Add(new object[] { 1,2,3,4,5,6}); DataTable table2 = new DataTable(); table2.Columns.Add("b1"); table2.Columns.Add("b2"); table2.Rows.Add(new object[] { "b1", "b2" }); DataColumn[] columns = new DataColumn[table1.Columns.Count + table2.Columns.Count]; table1.Columns.CopyTo(columns,0); table2.Columns.CopyTo(columns, table1.Columns.Count); DataTable table3 = new DataTable(); foreach (DataColumn c in table1.Columns) { table3.Columns.Add(c.ColumnName, c.DataType);//先添加的table1的Columns } foreach (DataColumn c in table2.Columns) { table3.Columns.Add(c.ColumnName, c.DataType);//后添加的table2的Columns } for (int i = 0; i < table1.Rows.Count || i < table2.Rows.Count; i++) { //取值的时候先取table1,再取table2 object[] o = table1.Rows[i] == null ? new object[table1.Columns.Count] : table1.Rows[i].ItemArray; object[] o2 = table2.Rows[i] == null ? new object[table2.Columns.Count] : table2.Rows[i].ItemArray; object[] o3 = new object[o.Length + o2.Length]; o.CopyTo(o3,0);//copy的时候先copy table1 o2.CopyTo(o3, o.Length);//再copy table2(与前面的列对应) table3.Rows.Add(o3); } 上面这段代码没用,楼主请自行去掉 DataColumn[] columns = new DataColumn[table1.Columns.Count + table2.Columns.Count]; table1.Columns.CopyTo(columns,0); table2.Columns.CopyTo(columns, table1.Columns.Count); 这段代码是干什么的呢?是给table1附内容么?如果我现在有三个存在的表,是不是这段就不用了?还有一个疑问,如果三个表的结构和行数不一样,你的这个方法能用么? sql server可以,oracle不可以 我是举了个例子 例子里面的table1和table2是我自己new出来的,不是通过sql语句取到的楼主可以帮他们当成是你从数据库中取出来的两个表就行了行数不同没有关系,以table1和table2中行数多的为准,没有数据自动填充null 我又改善了一下,原来好像行数不同的确会出问题,现在好了调用的时候DataTable newTable = Utils.Merge(你的表1,你的表2); public class Utils { public static DataTable Merge(DataTable table1, DataTable table2) { DataTable table3 = new DataTable(); foreach (DataColumn c in table1.Columns) { table3.Columns.Add(c.ColumnName, c.DataType); } foreach (DataColumn c in table2.Columns) { table3.Columns.Add(c.ColumnName, c.DataType); } for (int i = 0; i < table1.Rows.Count || i < table2.Rows.Count; i++) { object[] o = table1.Rows.Count > i + 1 ? table1.Rows[i].ItemArray : new object[table1.Columns.Count]; object[] o2 = table2.Rows.Count > i + 1 ? table2.Rows[i].ItemArray : new object[table2.Columns.Count]; object[] o3 = new object[o.Length + o2.Length]; o.CopyTo(o3, 0); o2.CopyTo(o3, o.Length); table3.Rows.Add(o3); } return table3; } } 多说一句,我只是按照楼主的思路提供解决办法而已其实我觉得最好的解决方法是在数据库查询的时候就直接返回一张表不就行了嘛select * from 表1,表2,表3//返回一张表,包括表1,表2,表3中的所有列 在新窗口打开网页 请问高手,SESSION中的值生命周期问题? ??????????????????????????? 很急!! GridView的问题 晕菜呀, 目前访问该 Web 站点的用户过多 的问题 请教高手,如何把任务栏屏蔽掉,让浏览器最大化? 学NET也有一段时间了,基础东东会了进阶应该怎学? SOS,救命了:我从sqlserver中用程序把数据提出来放到datatable再插入Oralce 9i中, 關于TreeView的問題,請大家幫幫忙! 服务器CPU被占100%寻求帮助! 设计的网站登录页面编译提示:clsDB并不包含“GetResultAsReader”的定义
在返回时返回一个DataSet
通过DataSet.Tables[int index]或DataSet.Tables["表名"]的方式得到对应的DataTable
然后正常操作
如果使用DataReader 需要调用DataReader.NextResult方式读取第二张表
还是能否在一个存储过程里执行两条select语句?
用dataset接了数据后分别放在不同的datatable里面
SELECT * FROM T1
PRINT 'Hello'
SELECT * FROM T2
SELECT * FROM T3如果要读取条二条SELECT语句的返回结果,则用:
DataSet.Tables[1]表示即可。
你自己可以试一下
返回的是多个DataSet而不是多个DataTable
是这样没错
不过不能一起交给报表
需要手工的把三个表合并成一个新的表
不过那样就不能实现报表绑定到DataTable进行更新的效果了
select * from table1,table2,table3.......
这样返回一个结果集可以直接交给报表
如果要实现更新,最好也把更新过程写成存储过程
可以返回两个输出参数,参数是游标类型,调用的时候传两个OUT类型的DATATABLE
不知道是不是楼主的意思!!!!!!!!!!!!!!!!
DataTable table1 = new DataTable();
table1.Columns.Add("a1");
table1.Columns.Add("a2");
table1.Columns.Add("a3");
table1.Columns.Add("a4");
table1.Columns.Add("a5");
table1.Columns.Add("a6");
table1.Rows.Add(new object[] { 1,2,3,4,5,6});
DataTable table2 = new DataTable();
table2.Columns.Add("b1");
table2.Columns.Add("b2"); table2.Rows.Add(new object[] { "b1", "b2" }); DataColumn[] columns = new DataColumn[table1.Columns.Count + table2.Columns.Count];
table1.Columns.CopyTo(columns,0);
table2.Columns.CopyTo(columns, table1.Columns.Count); DataTable table3 = new DataTable();
foreach (DataColumn c in table1.Columns)
{
table3.Columns.Add(c.ColumnName, c.DataType);//先添加的table1的Columns
}
foreach (DataColumn c in table2.Columns)
{
table3.Columns.Add(c.ColumnName, c.DataType);//后添加的table2的Columns
} for (int i = 0; i < table1.Rows.Count || i < table2.Rows.Count; i++)
{
//取值的时候先取table1,再取table2
object[] o = table1.Rows[i] == null ? new object[table1.Columns.Count] : table1.Rows[i].ItemArray;
object[] o2 = table2.Rows[i] == null ? new object[table2.Columns.Count] : table2.Rows[i].ItemArray;
object[] o3 = new object[o.Length + o2.Length];
o.CopyTo(o3,0);//copy的时候先copy table1
o2.CopyTo(o3, o.Length);//再copy table2(与前面的列对应)
table3.Rows.Add(o3);
}
table1.Columns.CopyTo(columns,0);
table2.Columns.CopyTo(columns, table1.Columns.Count);
如果我现在有三个存在的表,是不是这段就不用了?
还有一个疑问,如果三个表的结构和行数不一样,你的这个方法能用么?
我是举了个例子 例子里面的table1和table2是我自己new出来的,不是通过sql语句取到的
楼主可以帮他们当成是你从数据库中取出来的两个表就行了行数不同没有关系,以table1和table2中行数多的为准,没有数据自动填充null
public class Utils
{
public static DataTable Merge(DataTable table1, DataTable table2)
{
DataTable table3 = new DataTable();
foreach (DataColumn c in table1.Columns)
{
table3.Columns.Add(c.ColumnName, c.DataType);
}
foreach (DataColumn c in table2.Columns)
{
table3.Columns.Add(c.ColumnName, c.DataType);
} for (int i = 0; i < table1.Rows.Count || i < table2.Rows.Count; i++)
{
object[] o = table1.Rows.Count > i + 1 ? table1.Rows[i].ItemArray : new object[table1.Columns.Count];
object[] o2 = table2.Rows.Count > i + 1 ? table2.Rows[i].ItemArray : new object[table2.Columns.Count];
object[] o3 = new object[o.Length + o2.Length];
o.CopyTo(o3, 0);
o2.CopyTo(o3, o.Length);
table3.Rows.Add(o3);
}
return table3;
}
}