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 100000tpc 程序作为数据库服务器,在共享内存中创建内存数据库,并运行 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 100000tpc 示例通过以下函数调用创建数据库:
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);