可以更改环境变量的设置或创建新的变量来增加应用程序的灵活性。您可以在运行时 定义环境,而不是假定特定的环境配置。 该选项可以通过以下方式使您的应用程序受益: GBase 8s ESQL/C 编程指南 南大通用数据技术股份有限公司 - 33 - 应用程序变得较少以来预定义的环境。 用户可以在应用程序中输入他们的用户名和密码。 用户可以在同一计算机上运行的不同网络参数的两个应用程序。 相同的应用程序可以使用不同配置在客户机上运行。 以下 GBase 8s ESQL/C 库函数可用于设置和检索环境变量。 ifx_putenv() 修改或移除现有的环境变量或创建变量。 ifx_getenv() 检索环境变量的值。 重要: ifx_putenv() 函数设置 InetLogin 结构中的环境变量的值,ifx_getenv() 函数 检索来自 InetLogin 环境变量的值。 建议您使用这些函数设置和检索 InetLogin 字段值。 这些函数仅影响当前进程的本地变量。ifx_putenv() 函数不会更改命令级别环境。这 些函数操作仅对 GBase 8s ESQL/C 运行时库可访问的数据结构进行操作, 而不是操作系统 为进程创建的环境段。 当当前进程终止时, 环境恢复到调用进程的级别 (在大多数情况下, 操作系统级别)。 该过程不能直接将修改的环境传递给 _spawn() 、 _exec() 或 system() 创建的任何 新进程。这些新进程不接收 ifx_putenv() 添加的任何新的变量。然而,可以使用以下方法 将环境变量传递给新的进程。 当前进程使用 GBase 8s ESQL/C ifx_putenv() 函数创建环境变量。 当前进程使用 C putenv() 函数将环境变量放入操作系统环境中。 当前进程开始新的进程。 新进程使用 C getenv() 函数检索来自系统环境变量段的环境变量。 新进程使用 GBase 8s ESQL/C ifx_getenv() 函数将变量检索到运行时的环境段中。 环境变量指南 对于环境变量™,请遵循以下守则: 如果计划使用 ifx_putenv() 设置任何 GBase 8s 环境变量,则在调用任何其他 GBase 8s ESQL/C 库例程(包括 ifx_getenv())或任何 SQL 语句之前,将应用程序设置为所有这 些变量。 首次调用其他 GBase 8s ESQL/C 库函数或 SQL 语句需要初始化 GLS 语言环境。 此初始化加载并冻结 CLIENT_LOCALE 、 DB_LOCALE 和 DATE 、 TIME和 DATETIME 格式值的值。 如果 Setnet32 将注册表中 GBase 8s 环境变量设置为非空值, 那么 ifx_putenv() 函数 不会将此变量的在值更改为空字符串。 如果为 ifx_putenv() 函数调用中的环境变量指定一个空字符串,GBase 8s ESQL/C 将 GBase 8s ESQL/C 编程指南 南大通用数据技术股份有限公司 - 34 - 从运行时环境段清除环境变量的任何值集。然后为此环境变量注册可用于应用程序的值。 不要在命名行中使用 setenv 或使用 C putenv() 函数更改环境变量,因为在应用程序 执行开始后,对操作系统环境段的更改对 ESQL 客户端接口 DLL 没有影响。 而是使用 ifx_putenv() 更改运行时环境段中的环境变量。 要在不影响环境表的情况下更改 ifx_getenv() 的返回值,使用 _strdup() 或 strcpy() 创建此字符串的副本。 限制: 不要将指针释放到 ifx_getenv() 返回的环境条目中。 另外, 不要将 ifx_putenv() 指针指向局部变量。然后退出声明变量的函数。 InetLogin 结构 Windows™ 环境中的 GBase 8s ESQL/C 客户端应用程序可以使用 InetLogin 结构 动态设置应用程序所需的配置信息。 重要: GBase 8s 仅支持与早期版本兼容的 InetLogin 结构。对于新开发,建议您 改用 ifx_getenv() 和 ifx_putenv() 函数。 InetLogin 结构的字段 InetLogin 结构是 login.h 头文件声明的全局 C 结构。 要在 GBase 8s ESQL/C 程序中使用此结果, 必须在您的源文件 (.ec) 中包含 login.h。 提示: 因为 login.h 不包含 GBase 8s ESQL/C 语句,可以使用 C #include 或 GBase 8s ESQL/C include 指令包含此文件。 下表在 InetLogin 结构中定义此字段。 表 1. InetLogin 结构的字段 Inetlogin 字段 数据类型 意义 InfxServer char[19] 指定 GBASEDBTSERVER 环境变量的值 (缺省 数据库服务器) DbPath char[129] 指定 DBPATH 环境变量的值 DbDate char[6] 指定 DBDATE 环境变量的值 DbMoney char[19] 指定 DBMONEY 环境变量的值 DbTime char[81] 指定 DBTIME 环境变量的值 DbTemp char[81] 指定 DBTEMP 环境变量的值 GBase 8s ESQL/C 编程指南 南大通用数据技术股份有限公司 - 35 - DbLang char[19] 指定 DBLANG 环境变量的值 DbAnsiWarn char[1] 指定 DBANSIWARN 环境变量的值 GBase 8s Dir char[255] 指定 GBASEDBTDIR 环境变量的值 Client_Loc char * 指定 CLIENT_LOCALE 环境变量的值 DB_Loc char * 指定 DB_LOCALE 环境变量的值 CollChar char[3] 指定 COLLCHAR 环境变量的值 Lang char[81] 指定 LANG 环境变量的值 for the database locale Lc_Collate char[81] 指定 LC_COLLATE 环境变量的值 for the database locale Lc_CType char[81] 为数据库本地环境指定 LC_CTYPE 环境变量 的值 Lc_Monetary char[81] 为数据库本地环境指定 LC_MONETARY 环境变量的值 Lc_Numeric char[81] 为数据库本地环境指定 LC_NUMERIC 环境变 量的值 Lc_Time char[81] 为数据库本地环境指定 LC_TIME 环境变量的 值 ConRetry char[4] 指定环境变量 GBASEDBTCONRETRY 的值 ConTime char[4] 指定环境变量 GBASEDBTCONTIME 的值 DelimIdent char[4] 指定环境变量 DELIMIDENT 的值 Host char[19] 指定 HOST 网络参数的值 User char[19] 指定 USER 网络参数的值 Pass char[19] 指定 PASSWORD 网络参数的值 AskPassAtConne char[2] 指示 sqlauth() 在连接时是否请求密码;包含是 或否的值。如果首字符是 Y 或 y 那么请设置 GBase 8s ESQL/C 编程指南 南大通用数据技术股份有限公司 - 36 - ct AskPassAtConnect Service char[19] 指定 SERVICE 网络参数的值 Protocol char[19] 指定 PROTOCOL 网络参数的值 Options char[20] 保留备用 GBase 8s SqlHosts char[255] 指定 GBASEDBTSQLHOSTS 环境变量的值 FetBuffSize char[6] 指定 FET_BUF_SIZE 环境变量的值 CC8BitLevel char[2] 指定 CC8BITLEVEL 环境变量的值 EsqlMF char[2] 指定 ESQLMF 环境变量的值 GlDate char[129] 指定 GL_DATE 环境变量的值 GlDateTime char[129] 指定 GL_DATETIME 环境变量的值 DbAlsBc char[2] 指定 DBALSBC 环境变量的值 DbApiCode char[24] 指定 DBAPICODE 环境变量的值 DbAsciiBc char[2] 指定 DBASCIIBC 环境变量的值 DbCentury char[2] 指定 DBCENTURY 环境变量的值 DbCodeset char[24] 指定 DBCODESET 环境变量的值 DbConnect char[2] 指定 DBCONNECT 环境变量的值 DbCsConv char[9] 指定 DBCSCONV 环境变量的值 DbCsOverride char[2] 指定 DBCSOVERRIDE 环境变量的值 DbCsWidth char[12] 指定 DBCSWIDTH 环境变量的值 DbFltMsk char[4] 指定 DBFLTMASK 环境变量的值 DbMoneyScale char[6] 指定 DBMONEYSCALE 环境变量的值 DbSS2 char[5] 指定 DBSS2 环境变量的值 GBase 8s ESQL/C 编程指南 南大通用数据技术股份有限公司 - 37 - DbSS3 char[5] 指定 DBSS3 环境变量的值 OptoFC char[2] 不使用 OptMSG char[2] 不使用 InetLogin 结构中的所有字段, 除了 DbAnsiWarn 、 Client_Loc 和 DB_Loc , 都是 char 数据类型,并且都是空终止字符串。Client_Loc 和 DB_Loc 字段是字符指 针,GBase 8s ESQL/C 程序必须分配数据空间。 InetLogin 字段值 当应用程序执行 SQL 语句或需要配置信息的 GBase 8s ESQL/C 库函数之前必须设 置 InetLogin 值。 建议您使用 ifx_putenv() 和 ifx_getenv() 函数通过环境变量设置并检索 InetLogin 字段值,但是可以直接设置 InetLogin 字段值。 下图显示了客户端应用程序可能用于从最终用户获取网络参数的对话框。此应用程序 将使用用户输入的账户信息,并在 InetLogin 结构中设置适当的网络值。 图: 用户输入登录参数的对话框 下图显示在 InetLogin 结构中设置登录值的代码段。 应用程序通过对话框 (同 图 1 中一样)从最终用户获取这些值。 图: 提示用户输入 InetLogin 值的代码 strcpy(InetLogin.InfxServer, "mainsrvr"); ⋮ case IDOK: *szDlgString = '\0'; GetDlgItemText (hdlg, IDC_HOST, szDlgString, cbSzDlgMax); strcpy(InetLogin.Host, szDlgString); *szDlgString = '\0'; GetDlgItemText (hdlg, IDC_USER, szDlgString, cbSzDlgMax); strcpy(InetLogin.User, szDlgString); GBase 8s ESQL/C 编程指南 南大通用数据技术股份有限公司 - 38 - 在上图中,如果用户输入主机信息,则该代码将 mainsrvr 数据库服务器的 InetLogin.Host 和 InetLogin.User 字段设置用户指定的主机名和用户名的名称。如果 没有输入主机信息,那么 GBase 8s ESQL/C 使用 mainsrvr 数据库服务器的子项中的 HOST 和 USER 注册表值。 提示: 如何设置 InetLogin 字段的另一示例, 请参阅 %GBASEDBTDIR%\demo\ilogin 目录下的 ILOGIN 演示程序。 配置值的优先级 当 Windows™ 环境中的客户端应用程序需要配置参数时,GBase 8s ESQL/C 从以下位置 获得这些参数: InetLogin 结构 如果应用程序使用 InetLogin 结构,GBase 8s ESQL/C 首先检查此结构中的配置信息。 (要为此应用程序设置环境变量的值,ifx_putenv() 函数更改 InetLogin 字段的值。) 注册表的 GBASEDBT 子项 如果应用程序尚未在 InetLogin 中设置所需的配置信息,那么 GBase 8s ESQL/C 会在其 注册表信息的副本中检查此选项。 不必在 InetLogin 结构中定义所有值。 应用程序使用在注册表中使用在 InetLogin 中找 不到的任何值的配置信息。如果未设置相应的注册表值,应用程序将使用其缺省值。 重要: 应用程序首次需要配置信息时,GBase 8s ESQL/C 从注册表中读取此信息,并将其 存储在内存中。有关后续对注册表信息的引用,GBase 8s ESQL/C 访问此内存中的副本, 并且不会重新读取注册表。 如果您希望应用程序在运行时用户提供用户名和密码,或者如果应用程序具有与注册表中 一般值不同的配置信息,则配置信息的这种层级结构很有价值。例如,假设应用程序将 InetLogin 的 ConRetry 字段设置为 2 ,但是没有设置 ConTime 字段,如下列代码 段所示: strcpy(InetLogin.ConRetry, "2"); EXEC SQL connect to 'accnts'; 当 GBase 8s ESQL/C 建立到 accnts 数据库的连接时,它会尝试建立两次(而不是缺省值 一次),但是它仍然使用 15 秒的连接时间(内存中副本的默认值注册表信息)。如果 Setnet32 已更改连接值,那么GBase 8s ESQL/C 使用以更改的注册表值而非缺省值。 提示: 使用 Setnet32 实用程序定义注册表中的配置信息。