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