DataSet获取返回存储过程的具体表名
使用Dataset获取SqlServer中存储过程返回的表数据是以table1、table2.....的形式显示的。
当存储过程返回的表有十几个,甚至更多的时候,如果使用table1、table2的方式就很容易搞混淆。
此时就有个想法了。能不能用具体的表名指定返回的table信息,来代替table1、table2....来减少混淆。
还有个原因,当你使用table1、table2的时候,修改代码需要添加结果集,那么你就只能把结果集放到最后,如果放到其他位置,那么代码获取到的结果集全部都混乱了。
但是如果使用了表名就不一样了,结果集可以随意添加随意摆放,只需要把结果集与表名的顺序一一对应即可。
https://zhidao.baidu.com/question/577431238.html
这里提供了相应的思路。
我也是按照这个思路来进行相应的处理。
我的方法是:
1、在存储过程的参数中,添加一个OUTPUT的字段,然后根据返回的table给OUTPUT字段设置相应的值,这样就能通过OUTPUT字段与返回的table一一对应了。
如下代码所示
ALTER PROCEDURE [dbo].[SP_TEST] @OUT_TABLE_NAME VARCHAR(100)='' OUTPUT --輸出結果表的名稱 AS BEGIN TRY SELECT * FROM SYS_USER SELECT * FROM SYS_DEPT SELECT * FROM SYS_CLASS_ROOM SET @OUT_TABLE_NAME='SYS_USER,SYS_DEPT,SYS_CLASS_ROOM' END TRY BEGIN CATCH SELECT ERROR_MESSAGE() ERROR_MSG SET @OUT_TABLE_NAME='ERR_TABLE' END CATCH
这样,就能获取到返回的表字段 OUT_TABLE_NAME = 'SYS_USER,SYS_DEPT,SYS_CLASS_ROOM'
然后就可以通过分割字段,并赋值给每个DataTable即可
如下代码所示:
DataSet ds = dal.getDashBoardByLineChartData(line, type); string x = "SYS_USER,SYS_DEPT,SYS_CLASS_ROOM"; string[] xx = x.Split(','); for (int i = 0; i <xx.Length; i++) { ds.Tables[i].TableName = xx[i].ToString(); }
最终的结果显示
===============================================================================================
更新一下
用上面的output方式,貌似c#不能同时获取output值与返回的数据集。所以改了一下
不使用output输出值了,改用直接使用数据集的方式。
例如:
ALTER PROCEDURE [dbo].[SP_TEST] AS BEGIN TRY SELECT * FROM SYS_USER SELECT * FROM SYS_DEPT SELECT * FROM SYS_CLASS_ROOM SELECT 'SYS_USER,SYS_DEPT,SYS_CLASS_ROOM,TABLE_NAME' TABLE_NAME END TRY BEGIN CATCH SELECT ERROR_MESSAGE() ERROR_MSG SELECT 'ERR_TABLE,TABLE_NAME' TABLE_NAME END CATCH
不过要注意一下的是,SELECT 'SYS_USER,SYS_DEPT,SYS_CLASS_ROOM' TABLE_NAME一定要确定位置。可以放到结果集的第一位,也可以放到最后(我的例子是放到输出结果集的最后) (只能放到最后一位,放到第一位会有bug。比如说,第一第二条sql正常输出,但是第三条sql异常,就会跳到catch里面了。如果放到第一位,就获取不到 ERR_TABLE 这个重要的表名了(这个表名用于判断存储过程是否出现异常))
然后在c#中获取最后的一个结果集,然后赋值
DataSet ds = dal.getDashBoardByLineChartData(line, type); string[] tableName = ds.Tables[ds.Tables.Count-1].Rows[0]["TABLE_NAME"].ToString().Split(','); for (int i = 0; i < tableName.Length; i++) { ds.Tables[i].TableName = tableName[i].ToString(); }
c#判断储存过程是否异常(如果返回的表名列表中存在 ERROR_TABLE,则说明这个存储过程异常)
if (tableName.Contains("ERROR_TABLE")) { return errObj(dt.Rows[0]["ERROR_MSG"].ToString()); }