@@ -62,6 +62,59 @@ public void MappedAppender_ValidatesTypeMatching()
6262 reader . GetDateTime ( 3 ) . Should ( ) . Be ( new DateTime ( 1985 , 5 , 20 ) ) ;
6363 }
6464
65+ // Example entity with a binary column
66+ public class FileEntry
67+ {
68+ public int Id { get ; set ; }
69+ public byte [ ] Data { get ; set ; } = Array . Empty < byte > ( ) ;
70+ }
71+
72+ public class FileEntryMap : DuckDBAppenderMap < FileEntry >
73+ {
74+ public FileEntryMap ( )
75+ {
76+ Map ( f => f . Id ) ;
77+ Map ( f => f . Data ) ;
78+ }
79+ }
80+
81+ [ Fact ]
82+ public void MappedAppender_SupportsByteArray ( )
83+ {
84+ Command . CommandText = "CREATE TABLE file_entry(id INTEGER, data BLOB);" ;
85+ Command . ExecuteNonQuery ( ) ;
86+
87+ var entries = new [ ]
88+ {
89+ new FileEntry { Id = 1 , Data = new byte [ ] { 1 , 2 , 3 } } ,
90+ new FileEntry { Id = 2 , Data = new byte [ ] { 10 , 20 , 30 , 40 } } ,
91+ } ;
92+
93+ using ( var appender = Connection . CreateAppender < FileEntry , FileEntryMap > ( "file_entry" ) )
94+ {
95+ appender . AppendRecords ( entries ) ;
96+ }
97+
98+ Command . CommandText = "SELECT id, data FROM file_entry ORDER BY id" ;
99+ using var reader = Command . ExecuteReader ( ) ;
100+
101+ reader . Read ( ) . Should ( ) . BeTrue ( ) ;
102+ reader . GetInt32 ( 0 ) . Should ( ) . Be ( 1 ) ;
103+ ReadBlob ( reader , 1 ) . Should ( ) . Equal ( 1 , 2 , 3 ) ;
104+
105+ reader . Read ( ) . Should ( ) . BeTrue ( ) ;
106+ reader . GetInt32 ( 0 ) . Should ( ) . Be ( 2 ) ;
107+ ReadBlob ( reader , 1 ) . Should ( ) . Equal ( 10 , 20 , 30 , 40 ) ;
108+
109+ static byte [ ] ReadBlob ( System . Data . Common . DbDataReader reader , int ordinal )
110+ {
111+ using var stream = reader . GetStream ( ordinal ) ;
112+ using var memory = new MemoryStream ( ) ;
113+ stream . CopyTo ( memory ) ;
114+ return memory . ToArray ( ) ;
115+ }
116+ }
117+
65118 // Example with type mismatch - should throw
66119 public class WrongTypeMap : DuckDBAppenderMap < Person >
67120 {
0 commit comments