连接数据源 (ODBC)
在分配环境和连接句柄并设置连接属性后,应用程序将连接到数据源或驱动程序。 有三种可用于连接的函数:
SQLConnect
SQLDriverConnect
SQLBrowseConnect
有关建立与数据源的连接的详细信息,包括可用的不同连接字符串选项,请参阅将连接字符串关键字用于 SQL Server Native Client。
SQLConnect
SQLConnect 是最简单的连接函数。 它接受三个参数:数据源名称、用户 ID 和密码。 在这三个参数包含连接到数据库所需的所有信息后,使用 SQLConnect。 为此,使用 SQLDataSources 生成数据源的列表;提示用户输入数据源、用户 ID 和密码;然后调用 SQLConnect。
SQLConnect 假定数据源名称、用户 ID 和密码足以连接到数据源,并且 ODBC 数据源包含 ODBC 驱动程序建立连接所需的所有其他信息。 与 SQLDriverConnect 和 SQLBrowseConnect 不同,SQLConnect 不使用连接字符串。
SQLDriverConnect
在要求比数据源名称、用户 ID 和密码更多的信息时,使用 SQLDriverConnect。 针对 SQLDriverConnect 的参数之一是包含特定于驱动程序的信息的连接字符串。 您可能出于以下原因使用 SQLDriverConnect 而非 SQLConnect:
在连接时指定特定于驱动程序的信息。
请求驱动程序提示用户输入连接信息。
不使用 ODBC 数据源进行连接。
SQLDriverConnect 连接字符串包含一系列关键字值对,它们指定 ODBC 驱动程序支持的所有连接信息。 每个驱动程序都支持标准 ODBC 关键字(DSN、FILEDSN、DRIVER、UID、PWD 和 SAVEFILE),以及用于驱动程序支持的所有连接信息的特定于驱动程序的关键字。 SQLDriverConnect 可用于在没有数据源的情况下进行连接。 例如,设计为建立与 SQL Server 的实例的“无 DSN”连接的应用程序可使用某一连接字符串调用 SQLDriverConnect,该连接字符串定义登录 ID、密码、网络库、要连接到的服务器名称以及要使用的默认数据库。
在使用 SQLDriverConnect 时,有两个选项可用于提示用户输入所需的连接信息:
应用程序对话框
您可以创建一个应用程序对话框,该对话框将提示输入连接信息,然后通过 NULL 窗口句柄以及设置为 SQL_DRIVER_NOPROMPT 的 DriverCompletion 调用 SQLDriverConnect。 这些参数设置将禁止 ODBC 驱动程序打开自己的对话框。 在对应用程序的用户界面进行控制非常重要时,使用此方法。
驱动程序对话框
您可以对应用程序进行编码,以便将有效的窗口句柄传递到 SQLDriverConnect,并且将 DriverCompletion 参数设置为 SQL_DRIVER_COMPLETE、SQL_DRIVER_PROMPT 或 SQL_DRIVER_COMPLETE_REQUIRED。 驱动程序然后生成一个对话框,以便提示用户输入连接信息。 此方法可以简化应用程序代码。
SQLBrowseConnect
SQLBrowseConnect 与 SQLDriverConnect 类似,均使用连接字符串。 但是,通过使用 SQLBrowseConnect,应用程序可以在运行时使用数据源反复构造完整的连接字符串。 这允许应用程序执行以下两种操作:
生成自己的对话框以提示输入此信息,因此保留对其用户界面的控制。
浏览系统以找到可由特定的驱动程序使用的数据源,这可能要执行若干步骤。
例如,用户可能要首先浏览网络以找到服务器,然后在选择某一服务器后,浏览该服务器以找到驱动程序可访问的数据库。
在 SQLBrowseConnect 完成成功连接后,它返回一个连接字符串,该字符串可用于对 SQLDriverConnect 的后续调用。
SQL Server Native Client ODBC 驱动程序始终对成功的 SQLConnect、SQLDriverConnect 或 SQLBrowseConnect 返回 SQL_SUCCESS_WITH_INFO。 在某一 ODBC 应用程序获取 SQL_SUCCESS_WITH_INFO 后调用 SQLGetDiagRec 时,可能会收到以下消息:
5701
指示 SQL Server 将用户的上下文置于在数据源中定义的默认数据库中,或者置于为在连接中使用的登录 ID 定义的默认数据库中(如果数据源没有默认数据库)。5703
指示要在服务器上使用的语言。
以下示例显示系统管理员对成功的连接返回的消息:
szSqlState = "01000", *pfNativeError = 5701,
szErrorMsg="[Microsoft][SQL Server Native Client][SQL Server]
Changed database context to 'pubs'."
szSqlState = "01000", *pfNativeError = 5703,
szErrorMsg="[Microsoft][SQL Server Native Client][SQL Server]
Changed language setting to 'us_english'."
您可以忽略消息 5701 和 5703;它们仅供参考。 但是,不应忽视 SQL_SUCCESS_WITH_INFO 返回代码,因为可能返回并非 5701 或 5703 的其他消息。 例如,如果驱动程序连接到的服务器运行具有过时目录存储过程的某一 SQL Server 实例,则在 SQL_SUCCESS_WITH_INFO 后通过 SQLGetDiagRec 返回的错误之一是:
SqlState: 01000
pfNative: 0
szErrorMsg: "[Microsoft][SQL Server Native Client]The ODBC
catalog stored procedures installed on server
my65server are version 06.50.0193; version 07.00.0205
or later is required to ensure proper operation.
Please contact your system administrator."
应用程序针对 SQL Server 连接的错误处理功能应调用 SQLGetDiagRec,直到它返回 SQL_NO_DATA。 然后,它应该对消息中所含 pfNative 代码不是 5701 或 5703 的其他消息进行操作。