第十一章 以编程方式使用 SQL 网关

第十一章 以编程方式使用 SQL 网关

注意:本节假设具有使用 ODBC API 调用的丰富经验 - 它无意提供有关如何使用 ODBC 函数的详细信息。如果遇到任何问题,可以通过启用 IRISODBC 日志记录来监视 SQL 网关。

  • FetchSamples 示例 --- 列出一个打开连接、运行查询并访问结果集的简单程序。
  • 创建和使用外部数据集 --- 演示使用 %SQL.Statement 方法来运行查询和访问数据集。
  • 直接调用 ODBC 函数 --- 演示如何直接调用 ODBC 查询函数,而不是通过的 %SQL.Statement
  • %SQLGatewayConnection 快速参考 --- 提供有关支持的方法和属性的详细信息。

在本章的其余部分中,%Library.SQLGatewayConnection通过其缩写名称 %SQLGatewayConnection来引用。

获取样本示例

以下示例简单演示了如何打开连接、准备和执行查询以及访问结果数据集。

java 复制代码
ClassMethod FetchSamples()
{
   #include %occInclude
   //Create new SQL Gateway connection object
   set gc=##class(%SQLGatewayConnection).%New()
   if gc=$$$NULLOREF quit $$$ERROR($$$GeneralError,"Cannot create %SQLGatewayConnection.")

   //Make connection to target DSN
   set pDSN="Cache Samples"
   set usr="_system"
   set pwd="SYS"
   set sc=gc.Connect(pDSN,usr,pwd,0)
   if $$$ISERR(sc) quit sc
   if gc.ConnectionHandle="" quit $$$ERROR($$$GeneralError,"Connection failed")

   set sc=gc.AllocateStatement(.hstmt)
   if $$$ISERR(sc) quit sc

   //Prepare statement for execution
   set pQuery= "select * from Sample.Person"
   set sc=gc.Prepare(hstmt,pQuery)
   if $$$ISERR(sc) quit sc
   //Execute statement
   set sc=gc.Execute(hstmt)
   if $$$ISERR(sc) quit sc
   //Get list of columns returned by query
   set sc=gc.DescribeColumns(hstmt, .columnlist)
   if $$$ISERR(sc) quit sc

   //display column headers delimited by ":"
   set numcols=$listlength(columnlist)-1  //get number of columns
   for colnum=2:1:numcols+1 {
      Write $listget($listget(columnlist,colnum),1),":"
   }
   write !

   //Return first 200 rows
   set sc=gc.Fetch(hstmt)
   if $$$ISERR(sc) quit sc
   set rownum=1
   while((gc.sqlcode'=100) && (rownum<=200)) {
      for ii=1:1:numcols {
         set sc=gc.GetData(hstmt, ii, 1, .val)
         write " "_val
         if $$$ISERR(sc) break
      }
      set rownum=rownum+1
      write !
      set sc=gc.Fetch(hstmt)
      if $$$ISERR(sc) break
   }

   //Close cursor and then disconnect
   set sc=gc.CloseCursor(hstmt)
   if $$$ISERR(sc) quit sc

   set sc=gc.Disconnect()
   quit sc
}

创建和使用外部数据集

要创建和使用查询外部数据库的数据集,请执行以下操作:

  1. 通过 %New() 方法创建 %SQLGatewayConnection的实例。
  2. 调用该实例的 Connect() 方法,传递指定 ODBC 数据源名称的参数,以及登录该源所需的用户名和密码(如有必要)。

Connect() 方法具有以下签名:

java 复制代码
method Connect(dsn, usr, pwd, timeout) as %Status

这里的dsn是数据源的DSNusr是可以登录该数据源的用户,pwd是对应的密码,timeout指定等待连接的时间。

  1. 通过 %New() 方法创建 %ResultSet 的实例,并提供字符串参数"%DynamicQueryGW:SQLGW"。

注意:这与典型动态查询("%DynamicQuery:SQL")使用的参数略有不同。

  1. 调用结果集的Prepare()方法。第一个参数应该是由 SQL 查询组成的字符串,第二个参数应该被省略,第三个参数是 %SQLGatewayConnection的实例。
  2. 调用结果集的 Execute() 方法,可以选择按查询期望的顺序提供任何参数。此方法返回一个状态,应检查该状态。

要使用结果集,通常一次检查一行。可以在使用 %ResultSet 的方法来检索信息,例如给定列中的值。通常,可以使用 Next() 迭代所有行,如以下示例所示:

java 复制代码
ClassMethod SelectAndWrite() as %Status
{
    Set conn=##class(%SQLGatewayConnection).%New()
    Set sc=conn.Connect("AccessPlayground","","")
    If $$$ISERR(sc) do $System.Status.DisplayError(sc) quit

    Set res=##class(%ResultSet).%New("%DynamicQueryGW:SQLGW")
    Set sc=res.Prepare("SELECT * FROM PEOPLE",,conn)
    If $$$ISERR(sc) do $System.Status.DisplayError(sc) quit

    Set sc=res.Execute()
    If $$$ISERR(sc) do $System.Status.DisplayError(sc) quit

    While res.Next()
    { Write !,res.GetData(1)," ",res.GetData(2)," ",res.GetData(3)
    }
    Set sc=conn.Disconnect()
    Quit sc
}
相关推荐
兔子的洋葱圈5 分钟前
【django】1-2 django项目的请求处理流程(详细)
后端·python·django
Mintopia8 分钟前
Node.js高级实战:自定义流与Pipeline的高效数据处理 ——从字母生成器到文件管道的深度解析
前端·javascript·node.js
Mintopia10 分钟前
Three.js深度解析:InstancedBufferGeometry实现动态星空特效 ——高效渲染十万粒子的底层奥秘
前端·javascript·three.js
北凉温华10 分钟前
强大的 Vue 标签输入组件:基于 Element Plus 的 ElTagInput 详解
前端
Asthenia041213 分钟前
如何为这条sql语句建立索引:select * from table where x = 1 and y < 1 order by z;
后端
加兵柠檬水13 分钟前
代码输出题,会这些就够了。
前端
Json201131513 分钟前
Gin、Echo 和 Beego三个 Go 语言 Web 框架的核心区别及各自的优缺点分析,结合其设计目标、功能特性与适用场景
前端·golang·gin·beego
樊小肆14 分钟前
实战!从 0 到 1 搭建 H5 AI 对话页面
前端·vue.js
sayen15 分钟前
记录 flutter 文本内容展示过长优化
前端·flutter
ihgry15 分钟前
SpringBoot+Mybatis实现Mysql分表
后端