From a62ee5bfe792127609e4efd973ec44ecdc5e6dfd Mon Sep 17 00:00:00 2001 From: "Dailey, Alaric" Date: Tue, 20 Oct 2026 08:40:07 -0500 Subject: [PATCH] Return byte array type for OCTETS fields --- .../FbDataReaderTests.cs | 18 ++++++++++++++++++ .../Common/DbField.cs | 6 ++++++ 2 files changed, 24 insertions(+) diff --git a/src/FirebirdSql.Data.FirebirdClient.Tests/FbDataReaderTests.cs b/src/FirebirdSql.Data.FirebirdClient.Tests/FbDataReaderTests.cs index c87c804bc..b195f882a 100644 --- a/src/FirebirdSql.Data.FirebirdClient.Tests/FbDataReaderTests.cs +++ b/src/FirebirdSql.Data.FirebirdClient.Tests/FbDataReaderTests.cs @@ -535,4 +535,22 @@ public async Task GetFieldValueTest() await transaction.RollbackAsync(); } } + + [Test] + public async Task GetFieldTypeMatchesGetValueForOctetsTest() + { + // IDataRecord.GetFieldType: "the type of Object that would be returned from GetValue." + await using (var command = new FbCommand("select cast('ab' as varchar(10) character set octets), cast('ab' as char(4) character set octets) from rdb$database", Connection)) + { + await using (var reader = await command.ExecuteReaderAsync()) + { + Assert.IsTrue(await reader.ReadAsync()); + for (var i = 0; i < reader.FieldCount; i++) + { + Assert.AreEqual(typeof(byte[]), reader.GetValue(i).GetType()); + Assert.AreEqual(typeof(byte[]), reader.GetFieldType(i)); + } + } + } + } } diff --git a/src/FirebirdSql.Data.FirebirdClient/Common/DbField.cs b/src/FirebirdSql.Data.FirebirdClient/Common/DbField.cs index 3be89be74..3579216a7 100644 --- a/src/FirebirdSql.Data.FirebirdClient/Common/DbField.cs +++ b/src/FirebirdSql.Data.FirebirdClient/Common/DbField.cs @@ -549,6 +549,12 @@ public void FixNull() public Type GetSystemType() { + // SetValue stores CHAR and VARCHAR in the OCTETS character set as byte[], so that is the type GetValue returns. + if ((SqlType == IscCodes.SQL_TEXT || SqlType == IscCodes.SQL_VARYING) && (Charset?.IsOctetsCharset ?? false) && DbDataType != DbDataType.Guid) + { + return typeof(byte[]); + } + return TypeHelper.GetTypeFromDbDataType(DbDataType); }