以前提到的一个项目使用到了ASP.NET 1.1+Firebird embedded数据库,数据库使用了2.0.1,数据连接适配器使用了Firebird Net Provider 1.7 RC3。
但最近将程序加入嵌入式Web服务器之后,却出现了无法连接数据库的问题,经过排查,发现,以前使用IIS做Web服务时,路径中没有中文;而当使用中文路径存放整个执行程序时,就会无法连接数据库的问题,且只有使用嵌入式服务器时才会出现。
为了缩小问题的排查范围,我将同一项目组的一个Delphi项目配置为嵌入式数据库,并放入中文目录中,测试没有问题,于是可以基本排除嵌入式数据库版本问题。于是我到网上搜索Firebird Net Provider的相关内容,发现,确实有人提到了此问题,但不知道是不是被解决了。与此同时,我发现了Firebird Net Provider 1.7 RC4,眼前一亮,说不定,这个版本已经解决了整个问题。
一阵折腾,拿下了最新的RC4,安装、运行…心又凉了半截――外甥打灯笼,照旧。看了看发布时间,2006年,看来,还真是没人管这事。不过值得庆幸的是,这次的错误提示比较精确了,提示是那个路径找不到…等等!数据库文件路径后面咋少了仨字符?难道是因为中文的存在,被截掉了?希望再次燃烧起来,因为,刚刚下载驱动的时候,也看到了源码的下载链接。
看来这次得自己动手丰衣足食了。又一阵折腾,下载下来这个工程的源码,解压、编…咦?貌似是NANT的工程,看来只能用文本编辑器来修改代码。不过还好,平时用的东西杂,家什设备齐全,逐步跟踪,最终发现了问题所在:
在将连接字符串connectionString解析成database字符串时,使用了length属性来返回字符串的长度。将其传给数据库引擎的相关函数。但.NET中这个length默认是字长度,而嵌入式Firebird引擎是非托管代码,需要的是字节长度,由此造成了字符串被截断的错误。
经过跟踪发现,具体的BUG在FirebirdSql.Data.Embedded\FesDatabase.cs文件中,FesDatabase类的Attach函数,将database字符串以及其长度传递给嵌入式数据库的非托管dll,其关键代码如下:
FbClient.isc_attach_database(
statusVector,
(short)database.Length, //问题在这
database,
ref dbHandle,
(short)dpb.Length,
dpb.ToArray());
代码中, (short)database.Length用来计算字符串的长度,而.NET默认环境将中英文全部视为Unicode编码,因此该属性得到的是字符串的字长,而并非字节长度。但.NET并没有直接提供获取字节长度的代码,只能手动创建函数:
//获取字符串真实长度(中文为2字节,英文为1字节)
private int getTrueLength(string str)
...{
int lenTotal = 0;
int n = str.Length;
string strWord = "";
int asc;
for(int i=0;i<n;i++)
...{
strWord = str.Substring(i,1);
asc = Convert.ToChar(strWord);
if ( asc < 0 || asc > 127 )
lenTotal = lenTotal + 2;
else
lenTotal = lenTotal + 1;
}
return lenTotal;
}
并将有问题代码改为:
FbClient.isc_attach_database(
statusVector,
(short)getTrueLength(database),
database,
ref dbHandle,
(short)dpb.Length,
dpb.ToArray());
保存、编译、运行,问题解决。
注意事项:
1、 对于计算字节长度的函数,网上还有另一种解决方法,就是使用GB2312编码来转换,但由于编码的针对性,这个方法会有潜在的错误,不建议使用。
2、 如果你的驱动文件是安装版本,请在替换原有文件之前,删除系统assembly目录中的索引,以免系统缓存的存在使修改无效。
分享到:
相关推荐
"Firebird DDEX Provider 2.0.4" 是一个专为Visual Studio设计的数据开发工具扩展,它使得在Visual Studio环境中与Firebird数据库进行交互变得更加便捷。Firebird DDEX(Data Design and Development Extension)...
Firebird.Net Provider v2.5.1 是一个专门为.NET Framework设计的数据提供者,它使得开发者能够方便地在.NET应用程序中连接并操作Firebird数据库。Firebird数据库是一个开源的关系型数据库管理系统,以其高度的稳定...
Firebird .Net Provider for NetFramework 4.0 full free
Firebird .NET Data Provider 用于.Net C# 针对 firebird 2.0 和 firebird 2.5 版本的数据库. 两个dll 文件. 下载后去掉 ver2.0 或2.5 初始解压密码123654
Firebird .NET Provider,简称firebird-NETProvider,是一个专门用于C#开发的数据库访问组件,它使得C#程序员能够方便地与Firebird数据库进行交互。Firebird是一种开放源代码的关系型数据库管理系统,以其高性能、...
这个美观(基于GUI)的实用程序将安装用于Firebird数据库管理系统的.NET Provider,包括DDEX Provider(与Microsoft Visual Studio 2010集成)。 运行此安装程序的要求:(1)Windows操作系统。 不适用于* NIX / ...
Delphi2009连接火鸟Firebird数据库的示例源代码及操作Firebird数据库的中文参考资料.是嵌入版,不需要服务器,可以直接发布. 注意:发布的时候要带上dbxdrivers.ini和dbxconnections.ini两个配制文件, 这两个文件一般...
对于Firebird Embedded,你只需要提供数据库文件的路径: ```xml <property name="driverClassName" value="org.firebirdsql.jdbc.FBDriver"/> <property name="url" value="jdbc:firebirdsql:localhost/3050:/...
总之,Firebird Maestro的简单汉化版为中文用户提供了一个更友好的操作环境,帮助他们更高效地管理和维护Firebird数据库。不过,用户需意识到,这仅是初步汉化,可能会存在不完善之处,因此在实际使用中需灵活应对...
Firebird 的 DDEX 数据提供程序提供对 Visual Studio 项目中 Firebird 数据库的访问。 支持许多 Visual Studio 和 Firebird 版本。 该提供程序还提供了使用实体框架的机会。 但是为此,Firebird 服务器的版本应为 ...
该项目使用 ADO.NET 技术提供到 Firebird 数据库的连接和命令。 使用的内容是“FirebirdSql.Data.FirebirdClient.dll”,需要Framework 4.5.2。 在测试示例之前,根据 Office 体系结构(32/64 位),以“管理员”...
本资源合集提供了全面的中文参考资料和编程指南,旨在帮助中文用户更好地理解和掌握这款强大的数据库系统。 《火鸟Firebird数据库的中文参考资料.doc》可能涵盖了以下几个核心知识点: 1. **Firebird基础**:介绍...
FirebirdSql.Data.FirebirdClient.5.11.0 是一个专门为 .NET 开发者设计的数据提供程序,它使得能够方便地与 Firebird 数据库进行交互。Firebird 是一款开源的关系型数据库管理系统,以其高性能、稳定性及跨平台特性...
readme-firebird-通过odbc-delphi 使用ado可以访问.txt odbc 文件名 odbcfb.dll 2010-04-18 是 Firebird_ODBC_2.0.0.148_win32.exe 安装的 -------------------------------------------------------- delphi ...
原生 的联连提供了直接调用Firebird的API函数库(fbclient.dll/.so)进行调用的能力。 物理限制: Firebird支持非常巨大的数据库,数据库可以分成多个物理文件。每个文件的大小依赖于操作系统的限制。当前一个数据库...
C#操作firebird数据库,解决了中文路径等诸多问题
flamerobin是一个开源的Firebird数据库管理工具,提供了图形化的界面,方便用户管理Firebird数据库。在安装完成后,需要使用flamerobin创建所需的数据库,例如创建一个名为STUDENT的数据库。 其次,需要在VS2010...
firebird.jar firebird.jar firebird.jar
Firebird Maestro是一款高效且直观的数据库管理工具,专为Firebird数据库系统设计。这款绿色版7.12.0.1版本意味着它无需安装,用户可以直接运行,减少了对计算机系统的干扰,便于携带和在不同环境中使用。以下是关于...
你可以从Firebird官网或NuGet包管理器下载并安装最新版本的Firebird .NET Data Provider。 2. **Firebird数据库引擎**:确保在你的系统上已经安装了Firebird 2.5.8版本的数据库引擎,这通常包括所需的DLL文件,例如...