Cache对接外部数据库

为了方便和外部系统对接,获得第三方数据库的数据或者往第三方表更新和插入数据,包装了Cache查询第三方库的公共方法。简化原始操作的麻烦和可能带来的连接释放不当问题。

1.到服务器配置好ODBC后配置SqlGetWay
在这里插入图片描述

2.实现公共接口
主要提供三方面接口,一、得到json格式。二、得到xml格式返回。三、得到$LB数组返回。

内部用$LB的返回比较方便,JSON和Xml根据需要选择。

/// 查询第三方数据库的数据得到json
/// w ##class(LIS.WS.DHCLISServiceBase).SQLGatewayGetJsonMTHD("xianfen","cx","cx123456","select top 10 * from listm" )
/// mDSN:SQL网关配置的名称
/// mUsrName:数据库密码
/// mUsrPwd:数据库密码
/// sql:SQL语句
ClassMethod SQLGatewayGetJsonMTHD(mDSN, mUsrName, mUsrPwd, sql, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, Sessions, Output RowCount As %String) As %String
{
	//ODBC-系统DSN的名称,在SQL网关配置的名称
	s mDSN=$g(mDSN)
	//数据库账号
    s mUsrName=$g(mUsrName)  
    //数据库密码   
    s mUsrPwd=$g(mUsrPwd) 
    //执行的SQL语句
    s sql=$g(sql)  
    s RowCount=$g(RowCount)
    //创建连接
    s conn=##class(%SQLGatewayConnection).%New()
    set $ZTRAP="ERR" 
    //设置超时
    s sc=conn.Connect(mDSN,mUsrName,mUsrPwd,10)  
    i $$$ISERR(sc) do $System.Status.DisplayError(sc) d
    .THROW ##class(%Exception.SystemException).%New("连接异常","D",,"-1^第三方数据库连接失败")
    s rset = ##class(%ResultSet).%New("%DynamicQueryGW:SQLGW")
    //调用第三方SQL
    s sc = rset.Prepare(sql,,conn)  
    //发送错误就释放连接
    i $$$ISERR(sc) do $System.Status.DisplayError(sc) d
    .s close=rset.Close()
    .s sc=conn.Disconnect() 
    .THROW ##class(%Exception.SystemException).%New("连接异常","D",,"-1^第三方数据库连接失败")
    s sc=rset.Execute()
    //发送错误就释放连接
    i $$$ISERR(sc) do $System.Status.DisplayError(sc) d
    .s close=rset.Close()
    .s sc=conn.Disconnect() 
    .THROW ##class(%Exception.SystemException).%New("连接异常","D",,"-1^第三方数据库连接失败")
    s Xml=##Class(LIS.WS.BLL.DHCDataJSON).DataSetToSortJSONStream(rset , "", "", "", "", .RowCount,"","")
    s sc=conn.Disconnect()
    q Xml.Read()
    
ERR
    s sc=conn.Disconnect()
    s err=$tr("查询异常.错误"_$tr($ZERROR,"^","--")_".错误代码:"_$ECODE,"<>")
	s objStream=##Class(LIS.Util.Response).GetReturn("","-1",err)
    Quit objStream.Read()
}

/// 查询第三方数据库的数据得到xml
/// w ##class(LIS.WS.DHCLISServiceBase).SQLGatewayGetXmlMTHD("xianfen","cx","cx123456","select top 10 * from listm" )
/// mDSN:SQL网关配置的名称
/// mUsrName:数据库密码
/// mUsrPwd:数据库密码
/// sql:SQL语句
ClassMethod SQLGatewayGetXmlMTHD(mDSN, mUsrName, mUsrPwd, sql, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, Sessions, Output RowCount As %String) As %String
{
	//ODBC-系统DSN的名称,在SQL网关配置的名称
	s mDSN=$g(mDSN)
	//数据库账号
    s mUsrName=$g(mUsrName)  
    //数据库密码   
    s mUsrPwd=$g(mUsrPwd) 
    //执行的SQL语句
    s sql=$g(sql)  
    s RowCount=$g(RowCount)
    //创建连接
    s conn=##class(%SQLGatewayConnection).%New()
    set $ZTRAP="ERR" 
    //设置超时
    s sc=conn.Connect(mDSN,mUsrName,mUsrPwd,10)  
    i $$$ISERR(sc) do $System.Status.DisplayError(sc) d
    .THROW ##class(%Exception.SystemException).%New("连接异常","D",,"-1^第三方数据库连接失败")
    s rset = ##class(%ResultSet).%New("%DynamicQueryGW:SQLGW")
    //调用第三方SQL
    s sc = rset.Prepare(sql,,conn)  
    //发送错误就释放连接
    i $$$ISERR(sc) do $System.Status.DisplayError(sc) d
    .s close=rset.Close()
    .s sc=conn.Disconnect() 
    .THROW ##class(%Exception.SystemException).%New("连接异常","D",,"-1^第三方数据库连接失败")
    s sc=rset.Execute()
    //发送错误就释放连接
    i $$$ISERR(sc) do $System.Status.DisplayError(sc) d
    .s close=rset.Close()
    .s sc=conn.Disconnect() 
    .THROW ##class(%Exception.SystemException).%New("连接异常","D",,"-1^第三方数据库连接失败")
    s Xml=##class(LIS.Util.DataSetXML).DataSetToSortStream(rset,"", "", "", "", .RowCount,"","")
    s sc=conn.Disconnect()
    q Xml.Read()
    
ERR
    s sc=conn.Disconnect()
    s err=$tr("查询异常.错误"_$tr($ZERROR,"^","--")_".错误代码:"_$ECODE,"<>")
	s objStream=##Class(LIS.Util.Response).GetReturn("","-1",##Class(LIS.WS.BLL.DHCDataJSON).DealForXML(err))
    Quit objStream.Read()
}

/// 查询第三方数据库的数据得集合,返回二维数组,第一行为列名,后面的为数据行,最多返回1000行
/// w ##class(LIS.WS.DHCLISServiceBase).SQLGatewayGetList("xianfen","cx","cx123456","select top 10 * from listm" )
/// mDSN:SQL网关配置的名称
/// mUsrName:数据库密码
/// mUsrPwd:数据库密码
/// sql:SQL语句
ClassMethod SQLGatewayGetList(mDSN, mUsrName, mUsrPwd, sql, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, Sessions, Output RowCount As %String)
{
	//ODBC-系统DSN的名称,在SQL网关配置的名称
	s mDSN=$g(mDSN)
	//数据库账号
    s mUsrName=$g(mUsrName)  
    //数据库密码   
    s mUsrPwd=$g(mUsrPwd) 
    //执行的SQL语句
    s sql=$g(sql)  
    s RowCount=$g(RowCount)
    //创建连接
    s conn=##class(%SQLGatewayConnection).%New()
    set $ZTRAP="ERR" 
    //设置超时
    s sc=conn.Connect(mDSN,mUsrName,mUsrPwd,10)  
    i $$$ISERR(sc) do $System.Status.DisplayError(sc) d
    .THROW ##class(%Exception.SystemException).%New("连接异常","D",,"-1^第三方数据库连接失败")
    s rset = ##class(%ResultSet).%New("%DynamicQueryGW:SQLGW")
    //调用第三方SQL
    s sc = rset.Prepare(sql,,conn)  
    //发送错误就释放连接
    i $$$ISERR(sc) do $System.Status.DisplayError(sc) d
    .s close=rset.Close()
    .s sc=conn.Disconnect() 
    .THROW ##class(%Exception.SystemException).%New("连接异常","D",,"-1^第三方数据库连接失败")
    s sc=rset.Execute()
    //发送错误就释放连接
    i $$$ISERR(sc) do $System.Status.DisplayError(sc) d
    .s close=rset.Close()
    .s sc=conn.Disconnect() 
    .THROW ##class(%Exception.SystemException).%New("连接异常","D",,"-1^第三方数据库连接失败")
    s retLb=""
    //查询语句
    i ($zcvt(sql,"U")["SELECT ")
    {
	    s colCount=rset.GetColumnCount()
		s rownum=0
		While(rset.Next())
    	{
	    	i rownum>1000 break
	    	s oneRow=""
			s oneRowName=""
        	f i=1:1:colCount 
        	{
	      	s colField=rset.GetColumnName(i)
    	  	s colVal=rset.GetData(i)
	      	i i=1 d
	      	.s oneRowName=$lb(colField)
	      	.s oneRow=$lb(colVal)
	      	e  d
	      	.s oneRowName=oneRowName_$lb(colField)
	      	.s oneRow=oneRow_$lb(colVal)
        	}
        	i '$l(retLb) d
        	.s retLb=$lb(oneRowName)
        	s retLb=retLb_$lb(oneRow)
        	s rownum=rownum+1
    	}
    }
    else
    {
	    s retLb=$lb(sc)
    }
    s sc=conn.Disconnect()
    q retLb
    
ERR
    s sc=conn.Disconnect()
    Quit ""
}

3.调用测试
返回json
在这里插入图片描述

返回xml
在这里插入图片描述

返回list
在这里插入图片描述

更新数据
在这里插入图片描述

通过包装方便Cache的SQLGetWay的连接延伸到其他数据库。方便和外部系统做接口。直接通过SQL进行增删改查。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小乌鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值