为了方便和外部系统对接,获得第三方数据库的数据或者往第三方表更新和插入数据,包装了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进行增删改查。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐