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 | 枚举 | OnNewRowsOnRowChanged | OnNewRows | 触发器类型。 “OnNewRows”:将在检测到新行时引发事件。 “OnRowChanged”:将在触发查询结果发生更改时引发事件。 “无”:不执行任何操作 |
| trigger | 枚举 | RowNumberCountField | Count | 要使用的触发器。 “行号”:将使用行号函数来检测新的更改。 “计数”:将使用行计数来检测新的更改。 “字段”:将监控特定字段是否有新的更改。 “无”:不执行任何操作。 |
| resultDataFormat | 枚举 | SingleRowAllNew | SingleRow | 事件发生时传递结果的方式。 “SingleRow”:即使检测到多行,也只会在每个事件中返回一行。 “AllNew”:将返回检测到的所有行 |
| processingMode | 枚举 | FireAndForgetContinueOnProcessingConfirmation | 结果的处理模式类型。 “FireAndForget”:事件将被触发,且不会等待处理确认。 “ContinueOnProcessingConfirmation”:事件将等待确认回复(此事件的命令类型为“ConfirmDataProcessing”),然后才会使用新数据引发更多事件。 | |
| processingTimeout | 整数 | 60000 | 处理模式为“ContinueOnProcessingConfirmation”的事件等待确认的超时时间(以毫秒为单位)。超时后,事件将被丢弃 | |
| maxRetries | 整数 | 3 | 处理模式为“ContinueOnProcessingConfirmation”的事件到期前的最大重试次数 | |
| maxRowsToProcess | 整数 | 0 | 每个批处理结果要处理的最大行数(0表示全部) | |
| orderByColumn | 字符串 | 用于排序的列 | ||
| orderByType | 枚举 | ASCDESC | 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)如下:
它将检索Column02的所有新值(在事件属性上指定)。请注意,maxRowsToProcess设置为2,因此如果结果超过2行,事件将被引发多次,每个事件只返回2行。此外,这是一个FireAndForget事件,这意味着引发事件后,无需任何回复即可继续轮询。
结果示例:
示例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)如下:
在这种情况下,Column01和Column02值(作为SingleRow)都将在事件上发送(因为它在事件属性配置中指定)。
引发事件后,驱动程序将等待确认回复(processingMode: "ContinueOnProcessingConfirmation")。要回复事件,我们需要执行ConfirmationDataProcessing类型的命令。如果在配置的(processingTimeout: 3000)时间内未收到回复,则事件将被再次发送(直到达到maxRetries中定义的最大次数)。之后,事件数据将丢失,轮询过程将再次启动。
如果ignoreInitialValues设置为false且相应表中存在值,则会立即触发事件。
结果示例:
示例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)如下:
在这种情况下,Column01和Column02值(作为SingleRow)都将在事件上发送(因为它在事件属性配置中指定)。
结果示例:
命令#
命令是将在数据库上执行的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或用于插入命令类型的列InsertParameterQuery:用于过滤列的查询(命令类型Select、Update、Delete、Execute或Raw)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
- 示例:如果将columnName设置为
-
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),将执行的查询如下所示:
由于该命令的resultType被定义为ArrayOfResults,因此查询结果将以数组的形式返回:
示例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,我们将执行以下查询:
驱动程序扩展#
此异常流程驱动程序提供了一组扩展,允许自定义执行独立于关联的驱动程序定义的操作。这意味着您可以使用自定义项执行命令,甚至注册/侦听事件,而无需对其进行描述。
- 这在访问共享的设备数据或者由于过于复杂而无法使用常规机制访问的设备数据时特别有用。在需要访问命名约定可能因设备而异的数据时也很有用。
- 要使用这些扩展,您可以实施自己的任务,也可以使用提供的任务
Send Notification to Driver和Subscribe 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)
示例#
发送命令#
向要执行的驱动程序发送命令
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"}
}
}