Article
· Jan 7 3m de lecture

Service métier pour interroger la base de données IRIS interne

Scenario

IRIS propose des adaptateurs entrants SQL à utiliser avec des passerelles SQL telles que EnsLib.SQL.InboundAdapter pour interroger à plusieurs reprises les connexions SQL Gateway. Un scénario est apparu dans lequel nous voulions interroger une base de données interne pour certaines données, mais nous n'avons pas vu de service prêt à l'emploi pour cela.

Approche souhaitée

Disposer d'un service générique capable d'interroger le SQL interne pour fonctionner avec les composants en aval.

Comment

Ce qui n'était pas clair, c'était "Comment envoyer un ensemble de résultats en aval". Ce n'était pas très clair car un jeu de résultats lui-même n'est pas une classe persistante et l'objet ne peut pas être "Swizzled", provoquant une erreur comme celle-ci

 <METHOD DOES NOT EXIST>zNewRequestMessage+4 ^Ens.MessageHeader.1 *%GetSwizzleObject,%sqlcq.SRFT.cls535 -- logged as '-'
number - @''

La solution etait d'utiliser l'objet

EnsLib.SQL.Snapshot

Cela peut ensuite être utilisé comme une opération commerciale pour envoyer un ensemble de résultats en aval en utilisant la fonction Import from resultset

set result=##class(EnsLib.SQL.Snapshot).%New()
// Some SQL query here resulting in resultset where rset is the resultset object
set tSC=result.ImportFromResultSet(rset)

Vous pouvez ensuite l'envoyer à une autre opération

set tSC=..SendRequestAsync(..ForwardComponentName,result,0)  Quit:$$$ISERR(tSC)

 

Notez dans le code téléchargé sur l'échange ouvert disponible ici via github . L'exemple est que vous pouvez l'ouvrir et l'interroger. Ce qui suit est la méthode de classe utilisée pour insérer un code HTML. Cela diffère légèrement de l'exemple publié car il est tiré d'une implémentation en direct.

ClassMethod GetDataTable(pRequest As EnsLib.SQL.Snapshot, html As %String) As %String
{
  //first html obj can be if the styling needs passed
  if $ISOBJECT(html){set html=""}
  //loop get column titles 
  set ColumnIteration=1
  set ColumnCount=pRequest.%ResultColumnCountGet()
  
  set html=html_" <table class=""tg"">"
  set html= html_ " " _"<tr>"
  set meta=pRequest.%GetMetadata() //this is like raw text of the result using it to get the column titles out
  if ColumnCount>0{
    while ColumnIteration<=ColumnCount{
      
      set html= html_ " <th>"_  meta.columns.GetAt(ColumnIteration).colName _" </th>"
      set ColumnIteration=ColumnIteration+1
    }

  }
  set html= html_ " " _"</tr>"
  //not get the data from each row. In html need a <tr> and a td. 
  set coldataiteration=1
  While pRequest.%Next() {
    set html= html_ " <tr>"
    while coldataiteration <=ColumnCount{
      set html= html_ " <td> "_pRequest.%GetData(coldataiteration) _" </td>"
      set coldataiteration=coldataiteration+1
    }
    
    set html= html_ " </tr>"
    set coldataiteration=1
  }
  set html= html_ " " _"</table>"
  $$$TRACE(html)
  return html
}

Sparkei/Internal-SQL-Service: Intersystems service that can be used to query an internal SQL table to send a snapshot downstream (github.com)
 

Discussion (0)1
Connectez-vous ou inscrivez-vous pour continuer