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());
}

 

posted @ 2022-08-25 17:00  masha2017  阅读(205)  评论(0编辑  收藏  举报