连接数据源 (ODBC)

在分配环境和连接句柄并设置连接属性后,应用程序将连接到数据源或驱动程序。有三种可用于连接的函数:

  • SQLConnect

  • SQLDriverConnect

  • SQLBrowseConnect

有关建立与数据源的连接的详细信息,包括可用的不同连接字符串选项,请参阅将连接字符串关键字用于 SQL Server Native Client

SQLConnect

SQLConnect 是最简单的连接函数。它接受三个参数:数据源名称、用户 ID 和密码。在这三个参数包含连接到数据库所需的所有信息后,使用 SQLConnect。为此,使用 SQLDataSources 生成数据源的列表;提示用户输入数据源、用户 ID 和密码;然后调用 SQLConnect

SQLConnect 假定数据源名称、用户 ID 和密码足以连接到数据源,并且 ODBC 数据源包含 ODBC 驱动程序建立连接所需的所有其他信息。与 SQLDriverConnectSQLBrowseConnect 不同,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

SQLBrowseConnectSQLDriverConnect 类似,均使用连接字符串。但是,通过使用 SQLBrowseConnect,应用程序可以在运行时使用数据源反复构造完整的连接字符串。这允许应用程序执行以下两种操作:

  • 生成自己的对话框以提示输入此信息,因此保留对其用户界面的控制。

  • 浏览系统以找到可由特定的驱动程序使用的数据源,这可能要执行若干步骤。

    例如,用户可能要首先浏览网络以找到服务器,然后在选择某一服务器后,浏览该服务器以找到驱动程序可访问的数据库。

SQLBrowseConnect 完成成功连接后,它返回一个连接字符串,该字符串可用于对 SQLDriverConnect 的后续调用。

SQL Server Native Client ODBC 驱动程序始终对成功的 SQLConnectSQLDriverConnectSQLBrowseConnect 返回 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 的其他消息进行操作。

验证连接状态

SQL Server 2000 和更高版本中 SQL_ATTR_CONNECTION_DEAD 和 SQL_COPT_SS_CONNECTION_DEAD 的行为不同于早期版本中的行为。在 SQL Server 2000 和更高版本中,SQL_ATTR_CONNECTION_DEAD 返回连接的最近状态,而该状态可能不是当前连接状态。但是,SQL_COPT_SS_CONNECTION_DEAD 始终查询网络库以获得连接的当前状态。

为了区别这些行为,在 SQL Server 2000 和更高版本的包含文件中向 SQL_COPT_SS_CONNECTION_DEAD 提供了一个新值。如果使用 SQL Server 版本 7.0 驱动程序运行应用程序,则使用此属性的这些应用程序(使用 SQL Server 2000 和更高版本头生成)将返回一个错误(HY092,属性/选项标识符无效)。我们建议应用程序应在调用 SQLGetConnectAttr 前检查所使用的驱动程序的版本,然后使用 SQL_ATTR_CONNECTION_DEAD 来代替 SQL_COPT_SS_CONNECTION_DEAD(如果应用程序正在 SQL Server 7.0 驱动程序上运行)。

请参阅

概念