- 概述
- 加密
- 数据库
- Java
- Python
- 网页 API
最佳实践
数据库活动的最佳实践,涵盖 SQL Server、Oracle、MySql 和其他数据库的连接字符串、存储过程和故障排除。
将存储过程与 Oracle 参考光标 一起使用
在 Oracle 中使用存储过程时,请确保“参考光标”已与 Oracle.ManagedDataAccess.Types.OracleRefCursor 变量正确绑定。
为此,您需要确保参数的数量及其类型与“运行查询”活动的“参数”属性中的设置相符。
您可以使用“调用代码”活动获取光标的内容,也可以将其作为输入参数传递给另一个数据库查询。以下是用于将光标内容转换为数据表的调用代码示例:
Oracle.ManagedDataAccess.Client.OracleDataReader reader2 = myRefCursor.GetDataReader();
dt = new DataTable();
dt.Load(reader2);
Oracle.ManagedDataAccess.Client.OracleDataReader reader2 = myRefCursor.GetDataReader();
dt = new DataTable();
dt.Load(reader2);
您应该在用完光标后将其丢弃。您可以使用“调用代码”活动 (myRefCursor.Dispose),使用“系统”活动包中的“调用方法”活动或通过您运行的 SQL 命令来执行此操作。
运行带参数的存储程序
运行查询和运行命令活动可以调用存储过程,而不是简单的 SQL 语句。当过程返回结果集时,使用“运行查询” ,当过程未返回结果集时,使用“运行命令” 。
要调用存储过程:
- 将“命令类型”属性设置为“存储过程” 。
- 在“SQL”字段中输入过程名称,不使用
EXEC或CALL包装器。 - “参数”集合中为每个过程参数添加一个条目。
每个参数条目都具有以下属性:
- 名称。
- 方向(
In、Out或In/Out)。 - A 类型。
- 值。
系统将在调用后读回Out和In/Out值。如何解释参数名称和顺序取决于数据库提供程序,因此以下部分的指南因数据库而异。
| 数据库 | 提供程序 | 如何调用 | 参数绑定 |
|---|---|---|---|
| Microsoft SQL Server | Microsoft.Data.SqlClient | 命令类型=存储过程, SQL = 过程名称 | 按名称 ( @name );顺序无关紧要 |
| Oracle | Oracle.ManagedDataAccess.Client | 命令类型=存储过程, SQL = 过程名称 | 按位置;按过程的声明顺序添加参数 |
| MySQL/MiraDB | 开放式数据库连接 (ODBC) | 命令类型=文本, SQL = CALL procedure_name(?, ?) | 位置?占位符 |
| PostgreSQL | ODBC | 命令类型= “文本” 、 SELECT * FROM function_name(?)或CALL procedure_name(?) | 位置?占位符 |
| SQLite | Microsoft.Data.Sqlite | 不适用 | SQLite 没有存储过程 |
Microsoft SQL Server
SQL Server 按名称绑定参数,因此参数条目名称必须与过程的@前缀参数匹配,并且其顺序无关紧要。当您将进入方向设置为Out时,将返回输出参数。
CREATE PROCEDURE dbo.usp_CountCustomers @Country NVARCHAR(5), @Total INT OUTPUT AS
BEGIN
SET NOCOUNT ON;
SELECT @Total = COUNT(*) FROM dbo.customer WHERE country = @Country;
END;
CREATE PROCEDURE dbo.usp_CountCustomers @Country NVARCHAR(5), @Total INT OUTPUT AS
BEGIN
SET NOCOUNT ON;
SELECT @Total = COUNT(*) FROM dbo.customer WHERE country = @Country;
END;
使用“命令类型” = “存储过程”且SQL = dbo.usp_CountCustomers配置“运行命令” ,然后添加以下参数:
| 名称 | 方向 | 类型 | 值 |
|---|---|---|---|
@Country | 输入 | String | US |
@Total | 输出 | Int32 | — |
运行结束后, @Total会保存计数。对于返回行的过程,请改用“运行查询” ;结果可在“数据表”输出中找到。
Oracle
Oracle 按位置绑定参数,而不是按名称绑定参数,因此您必须按照过程声明参数的顺序添加参数条目。过程通过OUT SYS_REFCURSOR参数返回结果集;声明具有OracleRefCursor类型和Out方向的条目,行将在“运行查询”的“数据表”输出中返回。另请参阅将存储过程与 Oracle 参考光标一起使用。
CREATE OR REPLACE PROCEDURE get_customers(p_country IN VARCHAR2, p_cursor OUT SYS_REFCURSOR) AS
BEGIN
OPEN p_cursor FOR SELECT id, name FROM customer WHERE country = p_country ORDER BY id;
END;
CREATE OR REPLACE PROCEDURE get_customers(p_country IN VARCHAR2, p_cursor OUT SYS_REFCURSOR) AS
BEGIN
OPEN p_cursor FOR SELECT id, name FROM customer WHERE country = p_country ORDER BY id;
END;
使用“命令类型” = “存储过程”且SQL = get_customers配置“运行查询” ,然后按声明顺序添加参数:
| 名称 | 方向 | 类型 | 值 |
|---|---|---|---|
p_country | 输入 | String | US |
p_cursor | 输出 | OracleRefCursor | — |
Oracle 按位置绑定参数。如果参数条目与过程声明的顺序不同,那么系统会将值分配给错误的参数,并且调用会失败或返回空输出。
MySQL 和 MySQL
当您通过 ODBC 连接到 MySQL 或 MySQL 时,请使用文本命令类型和使用位置?占位符的CALL语句调用过程。“运行查询”的“数据表”输出中返回过程内部的SELECT 。
CREATE PROCEDURE list_customers(IN p_country VARCHAR(5))
BEGIN
SELECT id, name FROM customer WHERE country = p_country ORDER BY id;
END
CREATE PROCEDURE list_customers(IN p_country VARCHAR(5))
BEGIN
SELECT id, name FROM customer WHERE country = p_country ORDER BY id;
END
使用“命令类型”= “文本”和“SQL 查询” = CALL list_customers(?)配置“运行查询” ,然后为占位符添加一个In参数。
对于带有OUT参数的 MySQL 过程,请从返回的结果集中读取值或使用CALL procedure_name(?, @out); SELECT @out;模式,因为OUT值并不总是通过 ODBC 映射回参数条目。
PostgreSQL
PostgreSQL 公开了两种例程:使用SELECT调用的函数和使用CALL调用的过程。通过 ODBC 连接时,请使用带有位置?占位符的文本命令类型。对返回行的函数使用“运行查询” 。
CREATE FUNCTION get_customers_by_country(p_country text)
RETURNS TABLE(id int, name text) LANGUAGE sql AS $$
SELECT id, name FROM customer WHERE country = p_country ORDER BY id;
$$;
CREATE FUNCTION get_customers_by_country(p_country text)
RETURNS TABLE(id int, name text) LANGUAGE sql AS $$
SELECT id, name FROM customer WHERE country = p_country ORDER BY id;
$$;
使用“命令类型”= “文本”和“SQL 查询” = SELECT * FROM get_customers_by_country(?)配置“运行查询” ,然后添加一个In参数。要调用使用CREATE PROCEDURE创建的过程,请改用CALL procedure_name(?) 。
SQLite
SQLite 不支持存储过程。使用参数化的“运行查询”和“运行命令”语句将逻辑保留在工作流中,或定义可重用视图。
不同数据库系统的连接字符串
本指南提供了“连接到数据库”活动的示例连接字符串,使您能够使用原生驱动程序和 ODBC 驱动程序连接到各种数据库。它包括以下内容的连接字符串示例:
- Microsoft SQL Server(包括 Microsoft Entra ID 身份验证)
- Oracle
- PostgreSQL
- MySQL
- 亚马逊 Aurora
- Microsoft Access
- SAP HANA
- IBM DB2
- SQLite
示例后面是常见连接错误的故障排除部分。遵循最佳实践,以确保安全高效的数据库连接。
Microsoft SQL Server
使用 Microsoft.Data.SqlClient 时,Microsoft SQL Server 的常见连接字符串格式。
SQL Server 和 ODBC 身份验证
-
使用 SQL Server 身份验证:
Data Source=SERVER_NAME;Initial Catalog=DATABASE_NAME;User ID=USERNAME;Password=<your-password>; -
使用特定端口:
Data Source=SERVER_NAME,PORT_NUMBER;Initial Catalog=DATABASE_NAME;User ID=USERNAME;Password=<your-password>; -
使用 ODBC 驱动程序:
Driver={ODBC Driver 18 for SQL Server};Server=SERVER_NAME;Database=DATABASE_NAME;Uid=USERNAME;Pwd=<your-password>;Encrypt=yes;TrustServerCertificate=no;
默认情况下,这些活动与Encrypt=True连接。除非添加TrustServerCertificate=True (仅测试或开发)或安装受信任的证书,否则使用自签名证书或不受信任的证书与服务器的连接将失败。为了获得可预测的行为,请显式设置两个关键字,例如Encrypt=True;TrustServerCertificate=False; 。
Microsoft Entra ID 身份验证
-
使用密码身份验证(已 Microsoft 弃用,且与多因素身份验证 (MFA) 不兼容;首选交互式、服务主体或托管身份):
Server=tcp:SERVER.database.windows.net,1433;Initial Catalog=DATABASE_NAME;Authentication=Active Directory Password;User [email protected];Password=<your-password>;Encrypt=True; -
使用服务主体身份验证(用于 Unattended Robot):
Server=tcp:SERVER.database.windows.net,1433;Initial Catalog=DATABASE_NAME;Authentication=Active Directory Service Principal;User ID=APP_CLIENT_ID;Password=<your-client-secret>;Encrypt=True; -
使用托管身份身份验证(对于系统分配的身份,省略
User ID;对于用户分配的身份,请将其设置为身份的客户端 ID):Server=tcp:SERVER.database.windows.net,1433;Initial Catalog=DATABASE_NAME;Authentication=Active Directory Managed Identity;User ID=USER_ASSIGNED_MI_CLIENT_ID;Encrypt=True; -
使用集成身份验证(使用集成 Windows 身份验证与联合本地 Active Directory 身份):
Server=tcp:SERVER.database.windows.net,1433;Initial Catalog=DATABASE_NAME;Authentication=Active Directory Integrated;Encrypt=True; -
使用交互式身份验证(打开带有 MFA 提示词的浏览器;仅适用于有人值守或开发,不适用于无人值守机器人):
Server=tcp:SERVER.database.windows.net,1433;Initial Catalog=DATABASE_NAME;Authentication=Active Directory Interactive;User [email protected];Encrypt=True;
对于 ODBC 驱动程序,等效的关键字值不包含空格: ActiveDirectoryPassword 、 ActiveDirectoryServicePrincipal 、 ActiveDirectoryMsi (托管身份)、 ActiveDirectoryIntegrated和ActiveDirectoryInteractive 。ActiveDirectoryInteractive仅适用于 Windows 。
如果相同的工作流同时在机器人和开发计算机上运行,请使用Authentication=Active Directory Default 。它使用DefaultAzureCredential ,会尝试环境变量、工作负载身份和托管身份,然后返回到开发者工具凭据。
您可以在Microsoft 官方文档中了解有关连接字符串语法的更多信息,并在Microsoft Entra 身份验证文档中了解有关 Microsoft Entra 身份验证的更多信息。
Excel 文件
Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=C:\full\path\to\the\sampleFile.xlsx;
Oracle 托管数据访问
Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=XEPDB1)));User Id=system;Password=<your-password>;
您也可以使用 Easy Connect 缩写形式: Data Source=//HOST_NAME:1521/SERVICE_NAME;User Id=USERNAME;Password=<your-password>; 。
有关更多信息,请参阅Oracle Data Provider for .NET 文档。
MySql ODBC 8.3 Unicode 驱动程序
Driver={MySQL ODBC 8.3 Unicode Driver};Server=SERVER_NAME;Database=DATABASE_NAME;User=USERNAME;Password=<your-password>;Option=3;
您可以通过此处的官方 MySQL 文档页面了解更多信息。
MySql ODBC 8.3 ANSI 驱动程序
Driver={MySQL ODBC 8.3 ANSI Driver};Server=SERVER_NAME;Database=DATABASE_NAME;User=USERNAME;Password=<your-password>;Option=3;
将驱动程序名称中的版本替换为计算机上安装的 MySQL 连接器/ODBC 版本(例如MySQL ODBC 9.4 Unicode Driver );名称必须与已注册的驱动程序完全匹配。优先使用 Unicode 驱动程序,而非 ANSI 驱动程序,以避免损坏非 ASCII 数据。旧版Option=3标志是可选的,在典型使用情况下不是必需的。
PostgreSQL
Driver={PostgreSQL Unicode};Server=SERVER_NAME;Port=5432;Database=DATABASE_NAME;Uid=USERNAME;Pwd=<your-password>;
仅将 ANSI 变体Driver={PostgreSQL ANSI};…用于旧版单字节编码;首选对 UTF-8 数据库使用 Unicode 驱动程序。添加sslmode=require; (小写)以强制执行 TLS。
Driver={...}名称必须与在运行机器人的计算机上注册的驱动程序匹配。根据安装程序的不同,64 位 psqlODBC 驱动程序将注册为PostgreSQL Unicode或PostgreSQL Unicode(x64) (以及 ANSI 等效项)。如果名称与已注册的驱动程序不匹配,连接将失败,并显示“未找到数据源名称”。
请验证在 64 位 ODBC 数据源管理器中注册的确切名称 ( C:\Windows\System32\odbcad32.exe )。
您可以通过psqlODBC 文档了解更多信息。
Amazon Aurora(兼容 MySQL)
Amazon Aurora MySQL 兼容版使用 MySQL 传输协议,因此您可以使用 MySQL 连接器/ODBC 驱动程序进行连接。Aurora 集群(写入器)端点上的点Server :
Driver={MySQL ODBC 9.4 Unicode Driver};Server=CLUSTER.cluster-xxxx.REGION.rds.amazonaws.com;Port=3306;Database=DATABASE_NAME;User=USERNAME;Password=<your-password>;
Oracle 自主数据库 (CP/ADW) 带有电子夹
要连接到 Oracle 自主数据库(自主事务处理或自主数据仓库):
- 从 Oracle Cloud Insights 站点下载实例电子包 (
Wallet_DBNAME.zip)。 - 将电子包存档中的所有文件提取到机器人计算机上的文件夹中。
- 将
TNS_ADMIN环境变量设置为该文件夹。 - 将电子包的
sqlnet.ora中的WALLET_LOCATION目录编辑到同一文件夹。电子包附带?/network/admin占位符,您必须替换该占位符,因为单独使用TNS_ADMIN是不够的。
使用自动登录电子包 ( cwallet.sso ) 时,不需要电子包密码。否则,请提供电子包密码,以便驱动程序可以打开受密码保护的ewallet.p12 。
然后使用tnsnames.ora中的服务别名( DBNAME_high 、 DBNAME_medium或DBNAME_low ,加上事务处理数据库的DBNAME_tp和DBNAME_tpurgent ):
Data Source=DBNAME_low;User Id=USERNAME;Password=<your-password>;
前提是自主数据库实例配置为允许 TLS 连接,您也可以在没有电子包的情况下使用单向 TLS 连接。仅为相互 TLS (mTLS) 配置的实例仍需要电子包。
您可以通过Oracle ODP.NET 配置文档了解更多信息。
Microsoft Access
使用 ODBC 驱动程序:
Driver={Microsoft Access Driver (*.mdb, *.accdb)};Dbq=C:\full\path\to\database.accdb;Uid=Admin;Pwd=;
使用 OLE DB 提供程序( System.Data.OleDb ,仅在 Windows 上可用):
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\full\path\to\database.accdb;Persist Security Info=False;
对于受密码保护的文件,请将Jet OLEDB:Database Password=<your-password>;附加到 OLE DB 字符串。
ODBC 驱动程序和 ACE OLE DB 提供程序都来自 Microsoft Access 数据库引擎可再发行组件,其架构(x86 或 x64)必须与机器人和项目架构匹配。不匹配会导致“未在本地计算机上注册提供程序”其返回类型。
SAP HANA
Driver={HDBODBC};ServerNode=HOST_NAME:3NN15;UID=USERNAME;PWD=<your-password>;
将HDBODBC用于 64 位机器人( HDBODBC32仅适用于 32 位流程)。对于单容器数据库或第一个租户,端口为3NN15 ,其中NN是两位数的实例编号 — 例如, 30015表示实例00 , 30515表示实例05
对于多租户数据库容器 (MDC) 系统,通过系统数据库端口3NN13进行连接,并为租户命名,这是 SAP 建议的格式:
Driver={HDBODBC};ServerNode=HOST_NAME:30013;DATABASENAME=TENANT_DB;UID=USERNAME;PWD=<your-password>;
对于 SAP HANA Cloud(相对于本地部署 SAP HANA),主机是端口443上的 UUID 样式端点,并且连接始终为加密状态。为 SAP HANA 客户端 2.5 及更低版本显式设置encrypt=TRUE ;较新的客户端在端口443上进行推断。3NN15端口方案仅适用于本地系统。
IBM DB2
Driver={IBM DB2 ODBC DRIVER};Database=DATABASE_NAME;Hostname=HOST_NAME;Port=50000;Protocol=TCPIP;Uid=USERNAME;Pwd=<your-password>;
注册的驱动程序名称可以是特定于安装的,对于多个 Db2 副本,该名称可以是IBM DB2 ODBC DRIVER - DB2COPY1 。在 Windows 的 ODBC 数据源管理器或 Linux 的odbcinst.ini中验证确切名称。端口50000是常见的默认端口,但实际端口由SVCENAME每个实例设置。
SQLite
数据库活动使用Microsoft.Data.Sqlite 。提供数据库文件的路径:
Data Source=C:\full\path\to\database.db;
可选关键字包括Mode=ReadOnly (或ReadWrite / ReadWriteCreate )、 Foreign Keys=True用于强制执行引用完整性)和Cache=Shared 。Version=3关键字在此处无效 — 它属于较旧的 System.Data.SQLite 提供程序,会导致错误。
您可以通过Microsoft.Data.Sqlite 文档了解更多信息。
JDBC
数据库活动在.NET 上运行,不直接使用 JDBC 驱动程序。要访问通常通过 JDBC 访问的数据库,请在本指南中将其 ODBC 驱动程序与该数据库的 ODBC 连接字符串一起使用,或使用数据库供应商的.NET 或 ADO.NET 驱动程序在编码工作流中实施连接。
排除常见连接问题
未找到数据源名称(错误 IM002)
ERROR [IM002] [Microsoft][ODBC Driver Manager] Data source name not found, and no default driver specified
Driver={...}中命名的 ODBC 驱动程序未安装,或者使用不同的名称或架构注册。如要解决此问题,请执行以下操作:
- 安装匹配的 ODBC 驱动程序。
- 确认驱动程序显示在与机器人架构匹配的 ODBC 数据源管理器中。Administrator 分为单独的 32 位和 64 位。
- 将 Administrator 提供的确切驱动程序名称复制到
Driver={...}中。名称通常特定于版本或安装(例如PostgreSQL Unicode(x64)、MySQL ODBC 9.4 Unicode Driver或IBM DB2 ODBC DRIVER - DB2COPY1)。
无法加载驱动程序(错误 IM003)
ERROR [IM003] Specified driver could not be loaded due to system error 1114
系统错误 1114 表示找到了驱动程序库,但其初始化例程失败,通常是缺少依赖项 (例如所需的 Runtime),或者架构或版本不匹配。这在 Oracle即时客户端 ( SQORA32.dll ) 和 IBM Db2 ( DB2CLIO.DLL ) 中很常见。如要解决此问题,请执行以下操作:
- 确保驱动程序架构与 Runtime 匹配。
- 安装驱动程序所需的所有必备程序。
- 重新安装或更新驱动程序。
驱动程序架构和平台支持
安装与项目的 Runtime 架构匹配的数据库驱动程序。Windows 项目作为 64 位进程运行,需要 64 位 ODBC 或 OLE DB 驱动程序。Windows 旧版项目作为 32 位进程运行,需要 32 位驱动程序。
OLE DB( System.Data.OleDb ,用于 Access 和 Excel)仅在 Windows 上可用。ODBC 适用于 Windows 机器人,而当计算机上安装了 unixODBC 2.3.1 或更高版本以及目标驱动程序时,ODBC 也适用于 Linux 或 macOS 机器人。
安装驱动程序后,请重新启动 Studio 或机器人,以便它检测驱动程序。
- 将存储过程与 Oracle 参考光标 一起使用
- 运行带参数的存储程序
- Microsoft SQL Server
- Oracle
- MySQL 和 MySQL
- PostgreSQL
- SQLite
- 不同数据库系统的连接字符串
- Microsoft SQL Server
- Excel 文件
- Oracle 托管数据访问
- MySql ODBC 8.3 Unicode 驱动程序
- MySql ODBC 8.3 ANSI 驱动程序
- PostgreSQL
- Amazon Aurora(兼容 MySQL)
- Oracle 自主数据库 (CP/ADW) 带有电子夹
- Microsoft Access
- SAP HANA
- IBM DB2
- SQLite
- JDBC
- 排除常见连接问题
- 未找到数据源名称(错误 IM002)
- 无法加载驱动程序(错误 IM003)
- 驱动程序架构和平台支持