消除连接字符串的硬编码

时间:2015-01-23 16:43:57

标签: c++ connection-string ado

我已经制作了可以对数据库执行常规操作的GUI(加载现有数据,修改或添加新条目)。使用原始C++WinAPI中创建GUI。

问题出在连接字符串中。它是硬编码的,因此它强制用户将数据库保存在GUI所在的同一文件夹中。以下是C++中使用ADO

的示例
static wchar_t *bstrConnect= L"Provider=Microsoft.ACE.OLEDB.12.0;\
                                 Data Source = .\\MyDatabase.accdb";

我希望允许用户在数据库所在的位置有自由选择,但我不知道如何修改应用程序/连接字符串来执行此操作。

我试图在这里搜索示例,并在网上搜索但没有成功。也许我是一名初学者并且自学成才与此有关。

问题:

是否有示例/教程/文档能够向我展示处理此类“场景”的正确原则?

3 个答案:

答案 0 :(得分:1)

您可能需要将.\\MyDatabase.accdb部分连接字符串替换为该数据库文件的完整路径。目前它是一条相对路径。

换句话说,您需要使用可用的字符串格式化/连接函数在运行时构建连接字符串。

答案 1 :(得分:1)

我要做的就像 wallyk 之前建议的那样,将其保存到某种配置文件中,然后在需要时读取。

例如,最简单的方法可能是使用包含以下内容的标准.INI文件:

[Database]
File=".\MyDatabase.accdb"

这类文件可以与WinApi函数WritePrivateProfileStringGetPrivateProfileString一起使用。

当然它可以是任何类型的文件,只需要它就像简单或复杂一样。或者你甚至可以在注册表中保存这些数据。另一个问题是在哪里保存它,这可能是另一个完整的讨论(这里已经解决了很多问题)。简而言之,这个想法是将它存储在可以在运行时读取而不是硬编码的地方。

就代码而言,这意味着,在程序需要连接字符串的每个地方,而不是读取硬编码常量,您将调用将返回它的函数。该函数反过来将构建它(封装所有逻辑以从配置文件中获取它),执行以下操作:

  1. 使用GetPrivateProfileString(或使用其他内容的相应函数/库)读取配置文件。
  2. 如果系统失败,系统可能会回退到默认文件或只是抛出错误并向用户报告。
  3. 将其与硬编码的提供程序参数连接,或者在可能的选择列表中选择它(我会硬编码,因为您经常使用固定的数据库引擎,不同的引擎需要不同的连接参数,以及如果您知道如何在我看来构建它,那么将整个字符串存储在文件中是不必要的,所以让我们不要打开另一个失败点。)
  4. 从两个数据片段构建最终字符串。此处还可以包含其他参数,可以从配置读取或硬编码或作为功能参数接收,视情况而定。

答案 2 :(得分:0)

您的应用程序不必使用硬编码。设计配置策略并实施它。

例如,在当前用户的主目录,用户的配置子目录,用户的组配置目录,系统配置目录中查找一个,和/或显示默认配置列表。