`
zhmocean
  • 浏览: 202442 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

修正Firebird Net Provider 1.7中文路径BUG(提供下载)

阅读更多
        以前提到的一个项目使用到了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目录中的索引,以免系统缓存的存在使修改无效。
后记:已编译完成的DLL文件我已经放在:http://www.qihangsoft.net/download/Firebird_NET_Provider_1.7_fix_nose.rar,你可以免费下载使用。
 
分享到:
评论

相关推荐

    Firebird DDEX Provider 2.0.4

    "Firebird DDEX Provider 2.0.4" 是一个专为Visual Studio设计的数据开发工具扩展,它使得在Visual Studio环境中与Firebird数据库进行交互变得更加便捷。Firebird DDEX(Data Design and Development Extension)...

    Firebird.Net Provider v2.5.1

    Firebird.Net Provider v2.5.1 是一个专门为.NET Framework设计的数据提供者,它使得开发者能够方便地在.NET应用程序中连接并操作Firebird数据库。Firebird数据库是一个开源的关系型数据库管理系统,以其高度的稳定...

    .Net Provider for Firebird

    Firebird .Net Provider for NetFramework 4.0 full free

    Firebird .NET Data Provider 用于.Net 针对 firebird 2.0 和 firebird 2.5

    Firebird .NET Data Provider 用于.Net C# 针对 firebird 2.0 和 firebird 2.5 版本的数据库. 两个dll 文件. 下载后去掉 ver2.0 或2.5 初始解压密码123654

    firebird-NETProvider

    Firebird .NET Provider,简称firebird-NETProvider,是一个专门用于C#开发的数据库访问组件,它使得C#程序员能够方便地与Firebird数据库进行交互。Firebird是一种开放源代码的关系型数据库管理系统,以其高性能、...

    Firebird .NET Provider Installer:适用于Visual Studio的Firebird数据库.NET Provider安装程序-开源

    这个美观(基于GUI)的实用程序将安装用于Firebird数据库管理系统的.NET Provider,包括DDEX Provider(与Microsoft Visual Studio 2010集成)。 运行此安装程序的要求:(1)Windows操作系统。 不适用于* NIX / ...

    Delphi2009连接火鸟Firebird数据库的源代码及Firebird中文参考资料

    Delphi2009连接火鸟Firebird数据库的示例源代码及操作Firebird数据库的中文参考资料.是嵌入版,不需要服务器,可以直接发布. 注意:发布的时候要带上dbxdrivers.ini和dbxconnections.ini两个配制文件, 这两个文件一般...

    firebird embedded 嵌入式——Spring hibernate 集成连接配置

    对于Firebird Embedded,你只需要提供数据库文件的路径: ```xml &lt;property name="driverClassName" value="org.firebirdsql.jdbc.FBDriver"/&gt; &lt;property name="url" value="jdbc:firebirdsql:localhost/3050:/...

    Firebird Maestro 简单汉化版

    总之,Firebird Maestro的简单汉化版为中文用户提供了一个更友好的操作环境,帮助他们更高效地管理和维护Firebird数据库。不过,用户需意识到,这仅是初步汉化,可能会存在不完善之处,因此在实际使用中需灵活应对...

    Firebird DDEX Provider for Visual Studio:这是用于 Visual Studio 的完整 Firebird DDEX 提供程序。-开源

    Firebird 的 DDEX 数据提供程序提供对 Visual Studio 项目中 Firebird 数据库的访问。 支持许多 Visual Studio 和 Firebird 版本。 该提供程序还提供了使用实体框架的机会。 但是为此,Firebird 服务器的版本应为 ...

    Firebird Net Provider For VBA&VB6:用于 VBA 和 VB6 的 Firebird ADO.NET 提供程序-开源

    该项目使用 ADO.NET 技术提供到 Firebird 数据库的连接和命令。 使用的内容是“FirebirdSql.Data.FirebirdClient.dll”,需要Framework 4.5.2。 在测试示例之前,根据 Office 体系结构(32/64 位),以“管理员”...

    火鸟Firebird数据库的中文参考资料及编程指南合集

    本资源合集提供了全面的中文参考资料和编程指南,旨在帮助中文用户更好地理解和掌握这款强大的数据库系统。 《火鸟Firebird数据库的中文参考资料.doc》可能涵盖了以下几个核心知识点: 1. **Firebird基础**:介绍...

    FirebirdSql.Data.FirebirdClient.5.11.0

    FirebirdSql.Data.FirebirdClient.5.11.0 是一个专门为 .NET 开发者设计的数据提供程序,它使得能够方便地与 Firebird 数据库进行交互。Firebird 是一款开源的关系型数据库管理系统,以其高性能、稳定性及跨平台特性...

    firebird ODBC 驱动绿色版 ado连接firebird fdb数据库

    readme-firebird-通过odbc-delphi 使用ado可以访问.txt odbc 文件名 odbcfb.dll 2010-04-18 是 Firebird_ODBC_2.0.0.148_win32.exe 安装的 -------------------------------------------------------- delphi ...

    Firebird数据库中文版

    原生 的联连提供了直接调用Firebird的API函数库(fbclient.dll/.so)进行调用的能力。 物理限制: Firebird支持非常巨大的数据库,数据库可以分成多个物理文件。每个文件的大小依赖于操作系统的限制。当前一个数据库...

    FirebirdSql.Data.FirebirdClient.dll

    C#操作firebird数据库,解决了中文路径等诸多问题

    Firebird与C#的连接及嵌入式开发

    flamerobin是一个开源的Firebird数据库管理工具,提供了图形化的界面,方便用户管理Firebird数据库。在安装完成后,需要使用flamerobin创建所需的数据库,例如创建一个名为STUDENT的数据库。 其次,需要在VS2010...

    firebird.jar firebird.jar

    firebird.jar firebird.jar firebird.jar

    Firebird Maestro 绿色版

    Firebird Maestro是一款高效且直观的数据库管理工具,专为Firebird数据库系统设计。这款绿色版7.12.0.1版本意味着它无需安装,用户可以直接运行,减少了对计算机系统的干扰,便于携带和在不同环境中使用。以下是关于...

    C#如何访问firebird2.5.8嵌入式小型数据库

    你可以从Firebird官网或NuGet包管理器下载并安装最新版本的Firebird .NET Data Provider。 2. **Firebird数据库引擎**:确保在你的系统上已经安装了Firebird 2.5.8版本的数据库引擎,这通常包括所需的DLL文件,例如...

Global site tag (gtag.js) - Google Analytics