6

如何以编程方式创建 Firebird 数据库文件?

我已经使用 SQLite (C# .NET, System.Data.SQLite) 编写了代码......决定尝试 Firebird。

要安装 Firebird:Windows 7 -> Visual Studio 2013 -> 文件 -> 新建 -> 项目等 ---------- 然后工具 -> 库包管理器 -> 管理 NuGet 包 -> 搜索“firebird " -> Firebird ADO.NET 数据提供者 -> 安装(按钮)。

导致 a) 参考 -> FirebirdSql.Data.FirebirdClient,和 b) FirebirdSql.Data.FirebirdClient.5.8.0 子目录 ... 带有 Firebird .dll 的。

要创建 Firebird 数据库文件,我尝试过(摘自另一个 StackOverflow 帖子):

int pageSize = 4096;
bool forcedWrites = true;
bool overwrite = false;
var connectionString = new FbConnectionStringBuilder
{
    Database = stPathFilename,
    ServerType = FbServerType.Embedded,
    UserID = "SYSDBA",
    Password = "masterkey",
    ClientLibrary = "fbclient.dll"
}.ToString();
FbConnection.CreateDatabase(connectionString, pageSize, forcedWrites, overwrite);

我以为这是标准的,除了 stPathFilename。但是,此代码通过异常...抱怨 fbclient.dll。

然后我尝试了

    ClientLibrary = "FirebirdSql.Data.FirebirdClient.dll" 

...位于我的调试子目录中。

这会引发异常......“无法在 DLL 'FirebirdSql.Data.FirebirdClient.dll 中找到名为 'isc_create_database' 的入口点”。

如何以编程方式创建 Firebird 数据库文件?

4

1 回答 1

7

你错过了一个关键点,Firebird ADO.net 提供程序不像System.Data.SQLite:它不是一个 Firebird 数据库引擎,它只是一个连接到 Firebird 服务器的客户端,默认情况下通过 Firebird TCP/IP 的纯 C# 实现有线协议,或者使用本机客户端或嵌入式“服务器”(直接与进程内数据库引擎对话的本机客户端 API)。

第一个选项没有依赖项,但第二个和第三个选项具有您需要自己提供的本机依赖项(它不是 FirebirdSql.Data.FirebirdClient 的一部分)。

对于本机,您需要fbclient.dll,对于 Firebird Embedded,您需要 Firebird Embedded:对于 Firebird 2.5 及更早版本:fbembed.dll和依赖项,对于 Firebird 3 fbclient.dll+plugins\engine12.dll和依赖项。

您的代码本身没有什么问题,但要让它运行,您需要执行以下操作来嵌入 Firebird:

  1. 下载最新的 Firebird 3 zip 套件(对于 32 位或 AnyCPU 应用程序使用 32 位,对于 64 位应用程序使用 64 位)。

    在撰写本文时,最新版本是 Firebird 3.0.1。您可以从Firebird 3 下载页面获取它,在 Win32 或 Win64 下查找“用于手动/自定义安装的 Zip 套件” 。

  2. 将其解压缩到一个文件夹中(例如D:\Temp\fb3embedded
  3. 您可以保留所有文件,但可以删除大部分文件,因为 Firebird Embedded 不需要这些文件(zipkit 也是完整的 Firebird 服务器)。您应该保留以下内容:
    • intl文件夹和所有内容(字符集和排序规则支持所必需的)
    • plugins\engine12.dll(数据库引擎本身,其中的其他文件plugins可能会被删除,但这可能会限制某些功能)
    • fbclient.dll(嵌入式引擎的主要入口点)
    • firebird.msg(包含错误信息)
    • icu*(字符集和排序规则支持所必需的)
    • 如果尚未安装msvcp100.dll,您可能需要保留(但通常在最新的 Windows 系统上)msvcr100.dll

从技术上讲,您也可以删除intl,但这会限制字符集支持。

在您的代码中,而不是ClientLibrary = "fbclient.dll"指定ClientLibrary = @"D:\Temp\fb3embedded\fbclient.dll",它将起作用。对于已部署的应用程序,您还可以将 Firebird Embedded 放在应用程序文件夹中并使用相对路径。

对于 Firebird 2.5 及更早版本,说明类似,但您下载该版本的 Embedded zip 工具包,将其解压缩到一个文件夹中,然后指向该文件夹ClientLibrary中的fbembed.dll(而不是fbclient.dll)。

请注意,FbConnection.CreateDatabase如果数据库已经存在并且您指定overwritefalse.

于 2017-03-18T09:03:17.863 回答