跳转至

Connect IoT - 数据库驱动程序#

数据库驱动程序的目的是允许与数据库服务器通信(在这个版本中只有MSSQL可用)。

它负责根据驱动程序定义动态创建必要的SQL查询,以执行命令或处理事件。

数据类型#

这些是受支持的特定数据类型:

名称 描述
VARCHAR 非Unicode字符串值
NVARCHAR Unicode/非Unicode字符串值
TEXT 文本值
INT 整数值(4个字节)
BIGINT 大整数值(8个字节)
TINYINT 极小整数值(1个字节)
SMALLINT 小整数值(2个字节)
BIT 位值
FLOAT 浮点值
DECIMAL 十进制值
REAL 实数值
DATE 日期值
DATETIME 日期和时间组合值
TIME 时间值
BINARY 二进制字节值

异常流程参数#

异常流程支持以下参数:

名称 类型 可能的值 默认值 描述
dataBase 枚举 MSSQL MSSQL 驱动程序将连接的数据库类型
server 字符串 127.0.0.1 数据库所在的服务器
端口 整数 1433 服务器正在侦听的端口
instanceName 字符串 要连接的实例名称。SQL Server Browser服务必须在数据库服务器上运行,并且必须可以访问数据库服务器上的UDP端口1434
encrypt 布尔值 false 确定连接是否加密的标志
user 字符串 用于身份验证的用户名
密码 字符串 用于身份验证的密码
字符串 用户的域
databaseName 字符串 要连接的数据库
connectionTimeout 整数 15000 连接超时(毫秒)
requestTimeout 整数 15000 请求超时(毫秒)
databasePollingInterval 整数 300000 调用系统以检查数据库是否已更改的间隔时间(毫秒)

事件#

为了处理事件,数据库驱动程序会创建一个查询,该查询将轮询数据库(触发查询),并在发现更改时执行另一个查询来检索所需的数据(结果查询)。

触发查询和结果查询都是根据驱动程序定义上的配置构建的:

名称 类型 可能的值 默认值 描述
table 字符串 将通过轮询监控的表的名称
参数 字符串 用于触发器的列的名称
pollingInterval 整数 10000 用于检查指定列上是否发生更改的轮询时间间隔(以毫秒为单位)
triggerType 枚举 OnNewRows
OnRowChanged
OnNewRows 触发器类型。
“OnNewRows”:将在检测到新行时引发事件。
“OnRowChanged”:将在触发查询结果发生更改时引发事件。
“无”:不执行任何操作
trigger 枚举 RowNumber
Count
Field
Count 要使用的触发器。
“行号”:将使用行号函数来检测新的更改。
“计数”:将使用行计数来检测新的更改。
“字段”:将监控特定字段是否有新的更改。
“无”:不执行任何操作。
resultDataFormat 枚举 SingleRow
AllNew
SingleRow 事件发生时传递结果的方式。
“SingleRow”:即使检测到多行,也只会在每个事件中返回一行。
“AllNew”:将返回检测到的所有行
processingMode 枚举 FireAndForget
ContinueOnProcessingConfirmation
结果的处理模式类型。
“FireAndForget”:事件将被触发,且不会等待处理确认。
“ContinueOnProcessingConfirmation”:事件将等待确认回复(此事件的命令类型为“ConfirmDataProcessing”),然后才会使用新数据引发更多事件。
processingTimeout 整数 60000 处理模式为“ContinueOnProcessingConfirmation”的事件等待确认的超时时间(以毫秒为单位)。超时后,事件将被丢弃
maxRetries 整数 3 处理模式为“ContinueOnProcessingConfirmation”的事件到期前的最大重试次数
maxRowsToProcess 整数 0 每个批处理结果要处理的最大行数(0表示全部)
orderByColumn 字符串 用于排序的列
orderByType 枚举 ASC
DESC
ASC 用于排序的顺序类型
ignoreInitialValues 布尔值 false 确定是否应忽略初始值。如果设置为false且表中存在值,则会立即触发事件
rawResultQuery 字符串 触发查询后要执行的查询,而不是基于设置计算的查询(留空以忽略)。可使用的令牌包括:触发查询返回的“CurrentValue”值
“LastPersistedValue_”值将被保留,该值引用触发查询处理的最后一个值。
用作触发器的“TriggerQuery”查询
触发查询返回的“TriggerResults”值,该值将绕过结果查询的创建过程,并将发出在触发查询中收集到的值。
rawTriggerQuery 字符串 要作为触发查询执行的查询,而不是基于设置计算的查询(留空以忽略)。

事件属性#

事件属性表示将作为结果检索的表列。属性和数据库列之间的关联可按如下所示进行指定:

名称 类型 可能的值 默认值 描述
columnName 字符串 将该事件的属性与事件中的列相关联。

事件示例#

示例1:订阅ROW_NUMBER事件

事件配置:

table: [Table01], argument: "Column01", pollingInterval: 1000, triggerType: "OnNewRows", trigger: "RowNumber", resultDataFormat: "AllNew", maxRowsToProcess: 2, orderByColumn: "Column01", orderByType: "DESC", processingMode: "FireAndForget", ignoreInitialValues: true

事件属性配置:

name: "EventPropName", deviceId: "EventPropID", columnName: "Column02"

在此示例中,将每秒执行一次的触发器查询(pollingInterval: 1000)如下:

Select TOP 1 ROW_NUMBER() OVER(ORDER BY Column01) as Column01 from [Table01] order by Column01 DESC

它将检索Column02的所有新值(在事件属性上指定)。请注意,maxRowsToProcess设置为2,因此如果结果超过2行,事件将被引发多次,每个事件只返回2行。此外,这是一个FireAndForget事件,这意味着引发事件后,无需任何回复即可继续轮询。

结果示例:

EventPropName value:
[
    {"Column02": "Value01"},
  {"Column02": "Value02"}
]

示例2:订阅COUNT事件

事件配置:

table: [Table01], argument: "Column01", pollingInterval: 1000, triggerType: "OnNewRows", trigger: "Count", resultDataFormat: "SingleRow", orderByColumn: "Column01" , orderByType: "DESC", processingTimeout: 3000, maxRetries: 3, processingMode: "ContinueOnProcessingConfirmation", ignoreInitialValues: false

事件属性配置:

name: "EventPropName01", deviceId: "EventPropID01", columnName: "Column01"

name: "EventPropName02", deviceId: "EventPropID02", columnName: "Column02"

在此示例中,将每秒执行一次的触发器查询(pollingInterval: 1000)如下:

Select TOP 1 Count(Column01) as Column01 from [Table01]

在这种情况下,Column01Column02值(作为SingleRow)都将在事件上发送(因为它在事件属性配置中指定)。

引发事件后,驱动程序将等待确认回复(processingMode: "ContinueOnProcessingConfirmation")。要回复事件,我们需要执行ConfirmationDataProcessing类型的命令。如果在配置的(processingTimeout: 3000)时间内未收到回复,则事件将被再次发送(直到达到maxRetries中定义的最大次数)。之后,事件数据将丢失,轮询过程将再次启动。

如果ignoreInitialValues设置为false且相应表中存在值,则会立即触发事件。

结果示例:

EventPropName01 value:
{"Column01": 000100}

EventPropName02 value:
{"Column02": "Value01"}

示例3:订阅FIELD事件

事件配置:

table: [Table01], argument: "Column01", pollingInterval: 1000, triggerType: "OnNewRows", trigger: "Field", resultDataFormat: "SingleRow", orderByColumn: "Column01", orderByType: "DESC", processingMode: "FireAndForget", ignoreInitialValues: true

事件属性配置:

name: "EventPropName01", deviceId: "EventPropID01", columnName: "Column01"

name: "EventPropName02", deviceId: "EventPropID02", columnName: "Column02"

在此示例中,将每秒执行一次的触发器查询(pollingInterval: 1000)如下:

Select TOP 1 Column02 from Table01 order by Column02 DESC

在这种情况下,Column01Column02值(作为SingleRow)都将在事件上发送(因为它在事件属性配置中指定)。

结果示例:

EventPropName01 value:
{"Column01": "Value01"}

EventPropName02 value:
{"Column02": 20200920}

命令#

命令是将在数据库上执行的SQL查询。

名称 类型 可能的值 默认值 描述
类型 枚举 Select
更新
Insert
删除
执行
Raw
ConfirmationDataProcessing
Select 命令类型:
Select :执行Select查询
Update:执行Update查询
Insert:执行Insert查询
Delete:执行Delete查询
Execute:执行存储过程
Raw:执行原始查询
ConfirmationDataProcessing:确认接收到事件(适用于processingMode设置为ContinueOnProcessingConfirmation的事件)
参数 字符串 告知系统命令的必要上下文。例如,“表名称”或“存储过程名称”。
操作 枚举 AND
OR
AND 要在参数查询之间执行的操作类型,适用于条件(即WHERE条件)
“AND”:将执行AND操作
“OR”:将执行OR操作
“NONE”:系统将假定不执行任何操作。
resultType 枚举 ArrayOfResults
SingleResult
SingleValue
ArrayOfResults 命令所需的返回值类型。
“ArrayOfResults”:系统将返回一个对象数组,这些对象将在列名和值之间进行匹配
“SingleResult”:系统将返回一个对象,该对象将在列名和“SingleValue”值之间进行匹配:系统将返回查询结果。

命令参数#

命令参数表示命令的输入,可以根据以下信息进行配置:

名称 类型 可能的值 默认值 描述
类型 枚举 ParameterValue
ParameterQuery
RawQuery
EventReply
ParameterValue 查询上下文中的参数类型:
ParameterValue 用于检索命令类型的列Select、用于更新命令类型的列Update或用于插入命令类型的列Insert
ParameterQuery用于过滤列的查询(命令类型SelectUpdateDeleteExecuteRaw
RawQuery要执行的原始查询(命令类型Raw
EventReply包含事件名称的参数(命令类型ConfirmationDataProcessing
columnName 字符串 将该命令的参数与命令中的列相关联。
操作 枚举 Equal
GreaterThan
LessThan
GreaterThanOrEqual
LessThanOrEqualTo
ALL
ANY
IN
LIKE
NOT
Equal 可在参数查询类型的命令参数中执行的操作类型(对于其他类型将被忽略)
“Equal”:将执行=操作
“GreaterThan”:将执行>操作
“LessThan”:将执行<操作
“GreaterThanOrEqualTo”:将执行>=操作
“LessThanOrEqualTo”:将执行<=操作
“NotEqualTo”:将执行<>操作。
“ALL”:将执行ALL操作。
“ANY”:将执行ANY操作。
“IN”:将执行IN操作。
“LIKE”:将执行LIKE操作。
“NOT”:将执行NOT操作。
“None”:不会添加任何操作。

备注/行为#

  • 如果命令类型Select且未定义任何参数值,则将检索所有列。

  • 对于命令类型Select,可以使用函数(如COUNT()ROW_NUMBER())MAX()等)。在这种情况下,必须为特定参数值columnName上设置相应函数。

    • 示例:如果将columnName设置为Count(column01) as Quantity,则查询将为 Select Count(column01) as Quantity From table01
  • ParameterValue有一个默认值,当没有为命令提供其他值时,将使用该值。

命令示例#

示例1: 执行Select命令

命令配置:

type: "Select" , argument: "[Table01]", operation: "None", resultType: "ArrayOfResults"

命令参数配置:

name: "ParamValue", type: "ParameterValue", columnName: "Column01", operation: "None"

name: "ParamQuery", type: "ParameterQuery", columnName: "Column02", operation: "Equal"

执行命令时,必须提供parameterQuery的值(本示例中为10),将执行的查询如下所示:

Select Column01 From [Table01] Where Column02 = 10

由于该命令的resultType被定义为ArrayOfResults,因此查询结果将以数组的形式返回:

[
    {"Column01":"Value01"},
    {"Column01":"Value02"},
    {"Column01":"Value03"}
]

示例2:执行Update命令

命令配置:

type: "Update" , argument: "[Table01]", operation: "AND", resultType: "SingleRow"

命令参数配置:

name: "ParamValue01", type: "ParameterValue", columnName: "Column01", operation: "None"

name: "ParamQuery01", type: "ParameterQuery", columnName: "Column01", operation: "Equal"

name: "ParamQuery02", type: "ParameterQuery", columnName: "Column02", operation: "GreaterThanOrEqualTo"

在此示例中,我们需要在命令执行时提供所有3个参数。假设值为ParamValue01 = false, ParamQuery01 = true, ParamQuery02 = 20,我们将执行以下查询:

Update [Table01] Set Column01 = false Where Column01 = true AND Column02 >= 20

驱动程序扩展#

此异常流程驱动程序提供了一组扩展,允许自定义执行独立于关联的驱动程序定义的操作。这意味着您可以使用自定义项执行命令,甚至注册/侦听事件,而无需对其进行描述。

  • 这在访问共享的设备数据或者由于过于复杂而无法使用常规机制访问的设备数据时特别有用。在需要访问命名约定可能因设备而异的数据时也很有用。
  • 要使用这些扩展,您可以实施自己的任务,也可以使用提供的任务Send Notification to DriverSubscribe in Driver

对象#

对象是作为参数传递的结构。

事件#

名称 类型 描述
name 字符串 事件的名称。将用作结果调用中的标识符。
isEnabled 布尔值 事件是否已启用并准备就绪可供使用?默认 false
properties Property[] 要与事件链接的属性列表

属性#

名称 类型 描述
name 字符串 属性的名称。将用作结果调用中的标识符。
deviceId 字符串 唯一标识符
deviceType 字符串 服务器已知的属性的数据类型。必须使用此异常流程驱动程序支持的数据类型中的一种。
dataType 字符串 MES/系统已知/使用的值的数据类型。

RegisterHandler#

名称 类型 描述
event Event 要注册的事件(完整信息)

UnregisterHandler#

名称 类型 描述
event Event 要注销的事件(至少必须提供name属性)

方法#

注册事件#

通知异常流程驱动程序在特定事件发生时引发该事件。

void connect.iot.driver.database.registerEvent(data: RegisterHandler)

Note

事件将发布到侦听器connect.iot.driver.database.event并附加事件名称。示例: connect.iot.driver.database.event.CustomEvent

示例#

{
    type:"connect.iot.driver.database.registerEvent",
    content: {
        name: "CustomEvent",
        isEnabled: true,
        extendedData: {
         table: tableName,
         argument: "ColumnName",
         pollingInterval: 1000,
         triggerType: "OnNewRows",
         trigger: "RowNumber",
         resultDataFormat: "AllNew",
      processingTimeout: 3000,
         maxRetries: 3,
         maxRowsToProcess: 2,
         orderByColumn: "ColumnName",
         orderByType: "DESC",
         processingMode: "FireAndForget",
         ignoreInitialValues: true,
         rawResultQuery: ""
     },
        properties: {
            name: "PropertyName",
            deviceId: "PropertyID",
            dataType: "String",
            deviceType: "NVARCHAR",
            extendedData: {
                columnName: "ColumnName"
            }
        }
    }
}

注销事件#

通知异常流程驱动程序在发生特定事件时停止引发事件。

void connect.iot.driver.database.unregisterEvent(data: UnregisterHandler)

示例#

{
  type:"connect.iot.driver.database.registerEvent",
    content: {
        name: "CustomEvent",
    }
}

发送命令#

向要执行的驱动程序发送命令

void connect.iot.driver.database.executeCommand(data: ExecuteCommandHandler)

示例#

{
    type: "connect.iot.driver.database.executeCommand",
    content: {
        command: {
            name: "SelectCustomCommand",
            deviceId: "SelectCustomCommandID",
            extendedData: {
                type: "Select",
                argument: "Table01",
                operation: "None",
                resultType: "ArrayOfResults"
            },
            parameters: [
                {
                    name: "ParamName", deviceId: "ParamID", dataType: "String", deviceType: "NVARCHAR",      extendedData: { type: "ParameterValue", columnName: "ColumnName", operation: "None" }
                }
            ]
        },
        parameters: { "ParamName": "Value"}
    }
}