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

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

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

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

获取样本示例

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

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() 方法具有以下签名:

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() 迭代所有行,如以下示例所示:

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
}
02-07 10:18