集算器提供了 ODBC 接口,C# 可以通过集算器 ODBC 调用 SPL。结构图如下:

ODBC 服务

安装集算器 ODBC 驱动

使用集算器 ODBC,首先客户端需要安装 ODBC 驱动,在集算器安装路径下的 bin 目录中,用管理员权限执行 esprocOdbcinst.exe,即可安装集算器 ODBC 的驱动程序。

启动 ODBC 服务

在集算器的 [安装根目录]esProcbin 中,双击 esprocs.exe 文件(在 Linux 系统中,可以运行 ServerConsole.sh 来启动服务窗口),弹出如下服务窗口:

选择 Odbc Server ,点击【Config】按钮,可以打开集算器 ODBC 服务窗口如下:

ODBC 服务配置中主要配置 IP、ODBC 服务的端口、允许访问的用户名和密码。配置完成后,点击【OK】,保存配置。然后点击【start】启动服务。

添加 ODBC 数据源

驱动程序安装成功后,可以添加对应的 ODBC 数据源,选择 EsprocOdbc ODBC Driver

在弹出的配置窗口中,配置集算器 ODBC 的连接参数,数据源名称用户可自定义,IP、端口、用户名密码等参数要与服务器中的配置一致,如:

点击 Connect Test 可以测试连接,如果配置正确,会显示测试连接成功:

C# 调用

执行 SPL 语句

比如创建一个数据表,并添加两个字段 baseNum、square2,分别将 100 以内的自然数及其的平方值组成 100 条记录插入到数据表中,最后将表中的数据作为结果集返回。

C# 代码如下:

using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using System.ComponentModel;using System.Text;using System.Data.Odbc;namespace ODBCtest{   classDB{publicvoid rset(OdbcConnectionconn, string selectSql){OdbcCommandcmd = newOdbcCommand(selectSql, conn);OdbcDataReader reader = cmd.ExecuteReader();int nCount = 0;//循环输出列名for (int i=0; i< reader.FieldCount;i++){Console.Write( reader.GetName(i) + "t");}Console.Write("n");while (reader.Read()){Console.Write(reader.GetInt32(0) + "t");Console.WriteLine(reader.GetInt32(1) + "t");nCount++;}Console.WriteLine("while end column="+ reader.FieldCount);Console.WriteLine("while end row=" + nCount);}}classProgram{staticvoid Main(string[] args){//生成ODBC连接字符串,其中DSN、UID、PWD属性依次表示ODBC数据源名称、用户名、密码stringconstr = "DSN=EsprocOdbc;"+ "UID=user0;"+ "PWD=123;";OdbcConnectionconn = newOdbcConnection(constr);conn.Open();//要执行的SPL语句stringspl = "10.new(~:baseNum,~*~:square2)";DBdb = newDB();    db.rset(conn, spl);Console.Write("end....");Console.ReadKey();conn.Close();}}   }

执行结果:

在 SPL 中访问本地文件

通过 SPL 还可以访问本地的文件,其中包括 Txt、Excel、Json、Csv、Ctx 等多种类型的文件,访问时可以通过绝对路径查文件位置,也可以通过相对路径查找,使用相对路径时,则是相对于配置文件中的主目录,所以,首先我们来配置下主目录:
在 raqsoftConfig.xml 文件的节点 < Esproc ></ Esproc > 中添加以下节点:

 <!--集算器主路径,该路径为单一的绝对路径--><mainPath>D:mainFile</mainPath>

我们把要调用的文件 employee.txt 放到主目录下面,在 C# 中调用时,建立连接等部分的代码与上例是完全相同的, SPL 语句部分如下:

stringspl = "=file("employee.txt").import@t()";//SPL语句

这里支持绝对路径与相对路径的使用。

结果集输出部分代码如下:

while (reader.Read()){Console.Write(reader.GetInt32(0) + "t");Console.Write(reader.GetString(1) + "t");Console.Write(reader.GetString(2) + "t");Console.Write(reader.GetString(3) + "t");Console.Write(reader.GetString(4) + "t");Console.Write(reader.GetDate(5).ToString("yyyy-MM-dd") + "t");Console.Write(reader.GetDate(6).ToString("yyyy-MM-dd") + "t");Console.Write(reader.GetString(7) + "t");Console.WriteLine(reader.GetInt32(8) );nCount++;}

执行结果:

对于这种简单运算,还可以使用简单 SQL 语法:

stringspl = "$select * from employee.txt";

其中 $ 表示访问本地文件系统,两种写法的结果集相同。

带参数的 SPL 语句

参数是 SQL 语句的一个重要组成部分,同样,SPL 语句中也支持参数的使用,例如,像上例中,要查询 employee.txt 文件中的数据,但是要求只查询工资在 10000 到 15000 之间的记录,并根据工资升序排序:

调用部分代码如下:

stringspl = "$select * from employee.txt where SALARY > ? and SALARY< ? order by SALARY";

其中用?表示参数。

rset 方法中的传参部分代码如下:

OdbcCommandcmd = newOdbcCommand(selectSql, conn);cmd.Parameters.Add("arg1", OdbcType.Int).Value = 10000;cmd.Parameters.Add("arg2", OdbcType.Int).Value = 15000;

执行结果:

有数据源的 SPL 语句

集算器既然是个数据计算工具,那么数据来源的重要途径之一就是数据库了,C# 中如何来调用带数据源的 SPL 语句呢?往下看:
C# 调用带数据源的 SPL 语句之前,需要先在应用项目中添加对应的数据库驱动,然后在配置文件 raqsoftConfig.xml 中配置数据源信息。
例如:调用的 SPL 语句中使用的数据源名称为 dm,数据库类型为 HSQL,那么配置如下:
首先,将 HSQL 的数据集驱动 hsqldb.jar 加载到应用项目中;
其次,在 raqsoftConfig.Xml 的 < Runtime ></ Runtime > 节点中配置数据源信息:

<DBList><DB name="dm"><!--数据源名称--><property name="url" value="jdbc:hsqldb:hsql://127.0.0.1/demo" /><!-- url连接--><property name="driver" value="org.hsqldb.jdbcDriver" /><!--数据库驱动--><property name="type" value="13" /><!--数据库类型--><property name="user" value="sa" /><!--用户名--><property name="password" value=""/><!--密码--><property name="batchSize" value="1000" /><property name="autoConnect" value="true" /><!--是否自动连接,如果设定为true,则可以直接以$开头的SQL语句来访问数据库,如果为false,则不会自动连接,使用前必须用connect(db)语句创建数据库连接--><property name="useSchema" value="false" /><property name="addTilde" value="false" /><property name="dbCharset" value="UTF-8" /><property name="clientCharset" value="UTF-8" /><property name="needTransContent" value="false" /><property name="needTransSentence" value="false" /><property name="caseSentence" value="false" /></DB></DBList>

现在我们通过 SPL 从 dm 数据源中查询 SALES 表,过滤出 SELLERID 为 3 的员工,在 2014 年 11 月 11 号到 2014 年 12 月 12 号期间的所有订单信息:

调用部分代码如下:

stringspl = "$(dm)select * from SALES  where  SELLERID = ? and  ORDERDATE>TO_DATE(?,'YYYY-MM-DD') and  ORDERDATE<TO_DATE(?,'YYYY-MM-DD')";

rset 方法中参数传递部分代码如下:

 cmd.Parameters.Add("arg1", OdbcType.Int).Value = 3;cmd.Parameters.Add("arg2", OdbcType.Date).Value = "2014-11-11";cmd.Parameters.Add("arg3", OdbcType.Date).Value = "2014-12-12";

结果集输出部分代码如下:

while (reader.Read()){Console.Write(reader.GetInt32(0) + "t");Console.Write(reader.GetString(1) + "t");Console.Write(reader.GetInt32(2) + "t");Console.Write(reader.GetDecimal(3) + "t");Console.WriteLine(reader.GetDateTime(4).ToString("yyyy-MM-dd HH  ss") + "t");nCount++;}

执行结果:

执行 SPL 脚本

C# 调用 ODBC,除了可以直接执行单句的 SPL 语句,还可以调用更复杂的 SPL 脚本(后缀为 dfx 的文件)。
比如下面的 dfx 文件:

SPL 脚本思路:
循环遍历 CITIES 表记录,通过 CITIES. STATES 过滤 STATES 表,若 STATES. ABBR 首字母为参数 arg1,则将 STATES 表中的 NAME 值赋给 CITIES. STATE,并将 CITIES 表中的这条记录拼接到 B1 格中,最终返回 B1 格的结果集。
在这个网格文件中,需要从数据源 dm 中获取数据,同时使用了参数 arg1:

数据源配置方法可以参考上面的示例,网格文件保存为 city.dfx,dfx 文件可以存放在应用项目类路径或 raqsoftConfig.xml 中配置的主目录下,当 dfx 文件比较多的时候,为了便于统一维护和管理,我们还可以将 dfx 文件放到 dfx 寻址路径中,寻址路径的配置方式如下:
在 raqsoftConfig.xml 文件的 < Esproc></ Esproc> 节点中,添加以下内容:

<dfxPathList><!--配置dfx文件寻址路径,该路径为绝对路径,可以设置多个路径,以“;”隔开-->  <dfxPath>D:dfxFile</dfxPath></dfxPathList>

调用部分代码如下:

stringspl = "call city(?)";

rset 方法中传参部分代码如下:

  cmd.Parameters.Add("arg1", OdbcType.VarChar).Value = "A";

输出结果集部分代码如下:

while (reader.Read()){Console.Write(reader.GetString(0) + "t");Console.WriteLine(reader.GetString(1) + "t");nCount++;}

通过 call 调用 dfx 文件除了上面的写法,还可以在调用 dfx 时直接传参,如下:

stringspl = "call city('A')";

执行结果:

上述内容就是 C# 调用 SPL 脚本的常用方式了,其他程序调用 SPL 的用法:

Java 如何调用 SPL 脚本
Java 如何远程调用 SPL 脚本
Birt 调用 SPL 脚本
JasperReport 调用 SPL 脚本
HTTP 调用 SPL

==============

想了解更多集算器应用集成用法的小伙伴儿可以去官网上的在线教程中查看

c# export server 调用sql_C# 如何调用 SPL 脚本相关推荐

  1. BIRT 调用 SPL 脚本

    结构图如下: BIRT 中调用 SPL,首先需要将集算器 JDBC 集成到 BIRT 设计器中,简单来说就是,将加载集算器所需的 jar 包及配置文件放到 BRIT 对应目录中.需要注意的是,集算器 ...

  2. 直观讲解一下 RPC 调用和 HTTP 调用的区别!

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者:浮生忆梦 blog.csdn.net/m0_3811 ...

  3. 直观讲解一下RPC调用和HTTP调用的区别

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:浮生忆梦 blog.csdn.net/m0_38110132 ...

  4. 把接口调用打成jar包的类怎么写_直观讲解RPC调用和HTTP调用的区别

    来源 :浮生忆梦 很长时间以来都没有怎么好好搞清楚RPC(即Remote Procedure Call,远程过程调用)和HTTP调用的区别,不都是写一个服务然后在客户端调用么?这里请允许我迷之一笑~N ...

  5. oracle创建包 和调用,oracle创建函数和调用存储过程和调用函数的例子(区别)...

    创建函数: 格式:create or replace function func(参数 参数类型) Return number Is Begin --------业务逻辑--------- End; ...

  6. RPC调用和HTTP调用的区别你知道吗

    前言 很长时间以来都没有怎么好好搞清楚RPC(即Remote Procedure Call,远程过程调用)和HTTP调用的区别,不都是写一个服务然后在客户端调用么?这里请允许我迷之一笑~Naive! ...

  7. 调用http_【学习充电】直观讲解一下 RPC 调用和 HTTP 调用的区别!

    很长时间以来都没有怎么好好搞清楚RPC(即Remote Procedure Call,远程过程调用)和HTTP调用的区别,不都是写一个服务然后在客户端调用么?这里请允许我迷之一笑~Naive!本文简单 ...

  8. java thrift异步调用_thrift异步调用 - thrift-cob_style-tnonblockingserver - ItBoth

    [ thrift 在python中使用了 tornado和  twisted 来作为异步的webserive服务提供异步接口,自身并没有实现     twisted:         Generate ...

  9. jsp运行linux脚本,jsp页面调用哪个Linux的shell 脚本步骤

    当前位置:我的异常网» Linux/Unix » jsp页面调用哪个Linux的shell 脚本步骤 jsp页面调用哪个Linux的shell 脚本步骤 www.myexceptions.net  网 ...

  10. php调用rpc,远程调用RPC

    [TOC] # 远程调用 RPC(Remote procedure Call) > using php-amqplib 在第二节教程中,我们知道了怎样使用工作队列将耗时的任务分发给多个消费者. ...

最新文章

  1. app如何打开了request url_手机日历app内如何打开节日提醒功能?支持提前提醒节日的云便签...
  2. c++成员函数的重载、覆盖、隐藏区别
  3. elasticsearch api中的Bulk API操作
  4. c语言中条件编译相关的预编译指令
  5. 超图软件试用许可操作步骤_软件中的操作步骤
  6. linux的 dev vdal,RAZVOJ DELA NA DALJAVO V SLOVENIJI
  7. 2020 ccf推荐中文期刊_中国计算机学会推荐中文期刊目录,让业内学者不再盲目投稿...
  8. vue 根据接口数据筛选_如何根据行值变化筛选数据
  9. 基于SpringBoot的在线问卷调查管理系统
  10. 《游戏大师Chris Crawford谈互动叙事》一第 6 章 数学之苦劳
  11. java修炼之多线程学习心得
  12. EOS私链发币简要说明
  13. 常见的无法上网故障原因和解决方法
  14. 音频转文字怎么转?这些方法值得一试
  15. LeetCode笔记——122买卖股票的最佳时机Ⅱ
  16. ios怎么用spotify_在iOS中通过Spotify进行身份验证
  17. Win10 Windows Subsystem for Linux
  18. QDockWidget 简单的自定义标题栏
  19. mac中的Windows虚拟机字体太小解决办法
  20. 股票投资失败的原因探讨一:弃大道而行小道

热门文章

  1. Out of Browser 开篇
  2. USACO Section 1.1 : Greedy Gift Givers
  3. Cisco *** 完全配置指南-连载-***概述
  4. 3.企业安全建设入门(基于开源软件打造企业网络安全) --- 业务网安全加固
  5. 18.go 日志监控系统
  6. 28. magento使用细节
  7. java 读取clob字段的几种方法
  8. [2019杭电多校第四场][hdu6621]K-th Closest Distance(主席树)
  9. “购物比价类”Target SDK≥26优秀应用展示
  10. php 基础 自动类型转换