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

修正Firebird Net Provider 1.7“偏移和长度已超出数组界限”BUG(提供下载)

阅读更多

 

        在笔者的《修正Firebird Net Provider 1.7中文路径BUG(提供下载)》一文中,笔者基于从Firebird官方网站下载的最新源码,修正了Firebird Net Provider 1.7连接嵌入式版本的中文路径BUG,但最近在将系统切换到Server版本时,却遇到了“偏移和长度已超出数组界限”的错误。如下:

 

仔细分析“堆栈跟踪”详细信息,发现.NET调用调试信息最上两行已经提示了异常发生的位置,如下:
 

System.Buffer.BlockCopy(Array src, Int32 srcOffset, Array dst, Int32 dstOffset, Int32 count) +0
FirebirdSql.Data.Gds.GdsDatabase.DatabaseInfo(Byte[] items, Byte[] buffer, Int32 bufferLength) +176

 
从该信息中我们可以看出,是FirebirdSql.Data.Gds.GdsDatabase.DatabaseInfo函数调用System.Buffer.BlockCopy时发生了越界异常。
那我们打开FirebirdSql.Data.Gds.GdsDatabase的源文件,找到DatabaseInfo函数的实现部分:

private void DatabaseInfo(byte[] items, byte[] buffer, int bufferLength)
{
       lock (this)
       {
              try
              {
                     // see src/remote/protocol.h for packet definition (p_info struct)             
                     this.Send.Write(IscCodes.op_info_database);      //     operation
                     this.Send.Write(this.handle);                       //     db_handle
                     this.Send.Write(0);                                           //     incarnation
                     this.Send.WriteBuffer(items, items.Length); //     items
                     this.Send.Write(bufferLength);                           //     result buffer length
                     this.Send.Flush();
                     GdsResponse r = this.ReadGenericResponse();
                     Buffer.BlockCopy(r.Data, 0, buffer, 0, bufferLength); //此行抛出了异常
              }
              catch (IOException)
              {
                     throw new IscException(IscCodes.isc_network_error);
              }
       }
}

 
那我们来看看抛出异常的这行代码,Buffer.BlockCopy函数,是.NET环境提供的平台函数,其参数说明如下:
public static void BlockCopy(
   Array src, //源缓冲区。
   int srcOffset, //src 的字节偏移量。
   Array dst, //目标缓冲区。
   int dstOffset, //dst 的字节偏移量。
   int count//要复制的字节数。
);
根据异常提示,我们可以初步断定,是count参数的值超过了源缓冲区的数组长度,那么,我们很容易就能找出原因:bufferLength超出了r.Data的长度,那既然参数中两个偏移量都是0,那么我们可以使用r.Data.Length来代替bufferLength,以避免bufferLength与r.Data长度不匹配的问题。
即,将此语句更改为Buffer.BlockCopy(r.Data, 0, buffer, 0, r.Data.Length);
修改完毕,编译执行,问题顺利解决。
注意:升级该dll时,请删除系统assambly目录中的FirebirdSql.Data.Firebird全局库。
该修正版本可以到这里下载:
 
 
 
 
分享到:
评论

相关推荐

    Firebird DDEX Provider 2.0.4

    总的来说,Firebird DDEX Provider 2.0.4 提供了一个强大的开发环境,使得Firebird数据库的开发和管理变得更加高效。通过Visual Studio的数据工具,开发者可以充分利用IDE的功能,同时享受到Firebird数据库的高性能...

    Firebird.Net Provider v2.5.1

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

    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

    .Net Provider for Firebird

    Firebird .Net Provider for NetFramework 4.0 full free

    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 / ...

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

    在Java开发中,Spring和Hibernate是两个非常重要的框架,Spring提供了全面的结构化和依赖注入功能,而Hibernate则是一个强大的对象关系映射(ORM)工具,使得Java开发者可以方便地操作数据库。本文将详细介绍如何在...

    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 位),以“管理员”...

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

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

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

    Firebird与C#的连接及嵌入式开发需要经过下载和安装Firebird数据库管理系统,创建数据库,编写C#程序连接Firebird数据库,并下载Firebird嵌入式版本文档和数据库文件。只有通过这些步骤,才能实现Firebird与C#的连接...

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

    Firebird 的 DDEX 数据提供程序提供对 Visual Studio 项目中 Firebird 数据库的访问。 支持许多 Visual Studio 和 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 Maestro 简单汉化版

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

    FireBird数据库

    - **备份与恢复**:FireBird提供`gbak`工具进行数据库备份和恢复,保证数据安全。 4. **附加资源** - **firebird.msg**:包含错误消息的文本文件,用于错误报告。 - **IDPLicense.txt, IPLicense.txt**:分别...

    Firebird Maestro 绿色版

    5. **icudt30.dll, icuuc30.dll, icuin30.dll**: 这些是Unicode和国际化支持的库文件,由ICU(International Components for Unicode)提供,确保Firebird Maestro能正确处理各种语言和字符集,实现全球化支持。...

    FirebirdSql.Data.FirebirdClient.5.11.0

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

    C#连接firebird嵌入版数据库实例

    在本例中,我们看到有一个名为"NETProvider-2.5.2"的文件,这很可能是Firebird .NET数据提供程序的安装包或库文件。请确保正确安装并将其添加为项目的引用,以便C#应用程序能够访问Firebird的数据库功能。 在Visual...

    Firebird_ODBC driver

    Firebird是一个开源的关系型数据库管理系统,它提供了高性能、可扩展性和稳定性,广泛应用于各种操作系统环境,包括Windows、Linux和Unix等。 ODBC(Open Database Connectivity)是一种数据访问接口,允许应用程序...

    firebird maestro图形操作工具

    《Firebird Maestro:图形化数据库管理利器》 Firebird Maestro是一款专为Firebird数据库设计的高效图形操作工具,它的出现使得数据库管理变得更加直观、便捷,尤其对于那些不熟悉命令行操作的用户来说,更是一种...

    FireBird2.5.2.26540_0_Win32数据库包(含管理工具FireBird Maestro.v12.10.0.1)

    Firebird提供良好的并发性,高效的执行,强大的语言支持存储过程和触发器。Firebird脱胎于Borland公司的开源版数据库Interbase6.0,是一个完全非商业化的产品,用C和C++开发。 本安装包包含: Firebird-2.5.2.26540...

Global site tag (gtag.js) - Google Analytics