Windows中ODBC配置
McObject ODBC 安装对话框可用于配置本地或远程连接的数据源名称(DSN)。
安装对话框的外观如下图所示:

连接到本地数据库
若要连接到当前计算机上的数据库,请输入在服务器应用程序中传递给 engine.open() 或 mco_db_open_dev() 函数调用的数据库名称、可选的描述,并指定服务器位于本机(localhost)以及它正在监听的端口(例如 5001)。下面的示例指定了 SDK 示例 samples\native\sql\tpc 和 odbc\samples\tpcodbc 所使用的 tpcdb 数据库:

点击“下一步”会弹出以下屏幕,用于指定这是本地连接还是远程连接。当然,要创建本地连接,SmartEDB 数据库必须在共享内存(而非常规内存)中创建,以便多个应用程序(至少包括 SmartESQL 应用程序和 ODBC 驱动程序)能够访问。所以点击上面的单选按钮,输入要连接的数据库名称,然后点击“完成”以完成 DSN 定义。
下面的屏幕显示了连接到 TPC 示例数据库的规格。

要从 SmartESQL ODBC 应用程序连接到数据库(例如参见 odbc\samples\tpcodbc.c),请将数据库名称指定为 ODBC 函数 SQLConnect() 的第二个参数。例如:
SQLRETURN SQL_API SQLConnect( SQLHDBC hDbc,
SQLCHAR *dsnName,
SQLSMALLINT nameLength1,
SQLCHAR *userName,
SQLSMALLINT nameLength2,
SQLCHAR *authentication,
SQLSMALLINT nameLength3 )
nameLength1 参数应为 dsnName 参数的长度或 SQL_NTS。由于 SmartESQL 使用嵌入式数据库且没有“用户”的概念,因此 nameLength1 之后的参数将被忽略。 请注意,dsnName 参数与传递给 SmartESQL API 函数 engine.open() 或 SmartEDB API 函数 mco_db_open_dev() 的名称相同。因此,对于 TPC 示例,数据库的打开方式如下:
engine.open("tpcdb", tpcdb_get_dictionary(),DATABASE_SIZE,PAGE_SIZE,MAP_ADDRESS);
因此,SQLConnect() 调用是:
SQLConnect( hDbc, “tpcdb”, SQL_NTS, 0, 0, 0, 0);
现在,要运行 SDK 示例程序 tpc 和 tpcodbc,首先按如下方式启动 tpc:
tpc -clients 1 -tpc 100000
tpc 程序作为数据库服务器,在共享内存中创建内存数据库,并运行 100,000 次“TPC”测试。当测试完成后,等待(不要按回车键)将 tpc 进程(及其数据库)保留在内存中。现在 ODBC 驱动程序可以访问 tpcdb 数据库。按照以下方式启动 tpcodbc 客户端程序:
tpcodbc -tpc 100000 -db tpcdb
此命令行指示 ODBC 客户端程序运行 100,000 次“TPC”测试,并将显示类似于 tpc 的结果,因为它们都访问本地计算机上的同一数据库。不同之处仅仅在于 tpc 通过 SmartESQL API 直接访问数据库,而 tpcodbc 则通过 ODBC 驱动程序访问。
请注意,将上述命令复制粘贴到控制台窗口可能会引入细微错误。在某些情况下,会向命令行传递一个不可打印的 ASCII 符号,导致 tpc 示例无法正确启动。因此,tpcodbc 无法连接到数据库并抛出错误。所以我们建议手动输入命令行。
连接到远程数据库
要连接到远程数据库,请按照上述说明在 McObject ODBC 设置对话框中输入名称和描述。然后输入托管数据库的系统的 IP 地址,后面跟一个冒号 (“:”) 和 SmartESQL 服务器进程正在监听的端口号。
下面的示例指定了由 SDK 示例 samples\native\sql\tpc 和 samples\native\sql\tpcodbc 使用的 tpcdb 数据库,这些示例托管在 IP 地址为 207.2.78.232 的计算机上,该计算机在 6100 端口上监听:

与远程数据库的连接是通过 xSQL 实用程序完成的,该实用程序充当数据库服务器的角色。 为了演示远程连接,在将创建数据库的主机上启动应用程序。假设主机的 IP 地址为 207.2.78.232,并再次使用 SDK 示例程序 tpc 和 tpcodbc,首先按如下方式启动 tpc:
tpc -clients 1 -tpc 100000
tpc 示例通过以下函数调用创建数据库:
engine.open("tpcdb", tpcdb_get_dictionary(),DATABASE_SIZE,PAGE_SIZE,MAP_ADDRESS);
与上述本地连接示例一样,名为 tpcdb 的数据库将被置于共享内存中,程序将运行 100,000 次“TPC”测试。测试完成后请等待(不要按回车键),以将 tpc 进程(及其数据库)保留在内存中。
接下来,在同一台计算机上启动 xSQL,它将为内存数据库提供远程访问:
xsql tpcdb:6100
此命令启动 xSQL,指示其打开 tpcdb 数据库,并在 6100 端口监听远程进程想要连接到数据库的请求。 最后,在网络中的另一台计算机上,按如下方式启动 tpcodbc 客户端程序:
tpcodbc -tpc 100000 -db 207.2.78.232:6100
此命令行指示程序运行 100,000 次“TPC”测试,打开 ODBC 数据源名称 207.2.78.232:6100,这当然是主机上运行并监听 6100 端口的 xSQL 进程。tpcodbc 中的 C 源代码按如下方式建立 ODBC 连接:
database = argv[i]; // extract the data source name from the command line
SQLAllocEnv(&hEnv); // allocate the environment handle
SQLAllocConnect(hEnv, &hDbc); // allocate the connection handle
// connect to the data source (McObject ODBC driver)
SQLConnect(hDbc, database, SQL_NTS, NULL, 0, NULL, 0);
现在,tpcodbc 将会显示结果,不过由于网络子系统在处理 ODBC 驱动程序与 SmartESQL 远程服务器之间的数据传输时存在延迟,其速度会比 tpc 慢一些。(如果应用程序似乎卡住了,可能建议通过命令行参数减少测试次数,例如:“-tpc 100”。)
连接属性
可以从连接字符串中提取连接属性。支持以下属性:
- DRIVER:SmartEDB驱动名
- DSN:DSN 记录
- SERVER :要连接的 RSQL 服务器的地址(多个地址以逗号分隔)
- SQL_N_REPLICAS:通过分布式 SQL 引擎(DistributedSqlEngine)建立的连接中的副本数量(对应于调用 DistributedSqlEngine::open() C++ API 时的 nReplicas 参数)
- SQL_CONNECT_ATTEMPTS:连接尝试的次数(与调用 RemoteSqlEngineopen() C++ API 时的 maxConnectAttempts 参数相对应)
- SQL_CONNECT_TIMEOUT:服务器连接超时(与调用 RemoteSqlEngineopen() C++ API 时的 connectTimeout 参数相对应)
- SQL_READ_TIMEOUT :服务器响应超时(与调用 RemoteSqlEngineopen() C++ API 时的 readTimeout 参数相对应)
- DATABASE:在连接到共享内存数据库时的数据库名称
当使用 DSN 属性时,所有连接数据均取自 DSN 记录。然而,如果分别指定了 SERVER、SQL_N_REPLICAS、SQL_CONNECT_ATTEMPTS 和 DATABASE 属性,那么它们的值会覆盖 DSN 的值。
如果未使用 DSN 属性,则对于远程(RSQL)连接,必须指定 DRIVER 或 SERVER,并且必须指定 DATABASE 属性以建立共享内存数据库连接。
对于 x32 系统,驱动程序名称(DRIVER)为“McObject SmartEDB 驱动程序”,而对于 x64 系统则是“McObject SmartEDB 64 位驱动程序”。odbcad32 工具会反映这些名称。
(注:此处的“SmartEDB”翻译为“SmartEDB”并不准确,因为“SmartEDB”是“McObject”的产品名称,而“SmartEDB”并非常见的名称。如果您希望保持原文的准确性
以下是段 C# 代码片段,展示了如何指定属性:
// Manually specify the driver and two servers addresses (distributed RSQL connection)
String connectionString = "Driver={McObject SmartEDB driver};SERVER=localhost:6001,localhost:6002;";
// Get most of data source attributes from DSN 'xsql_dsn' but override the SERVER attribute
//String connectionString = "DSN=xsql_dsn;SERVER=localhost:6001;";
// Get all data source attributes from DSN 'xsql_dsn'
//String connectionString = "DSN=xsql_dsn";
System.Data.Odbc.OdbcConnection dbconn;
dbconn = new System.Data.Odbc.OdbcConnection(connectionString);