11#nullable enable
22using System ;
3- using System . Collections ;
43using System . Collections . Generic ;
54using System . Data ;
6- using System . Reflection ;
5+ using System . Text . Json ;
76using System . Threading . Tasks ;
87using Newtonsoft . Json ;
98using Npgsql ;
@@ -57,9 +56,9 @@ public class AllTypesRecord
5756 public class DatabaseWorkloadsMore
5857 {
5958
60- public static async Task < DataTable > AllTypesNativeExample ( NpgsqlConnection conn )
59+ public static async Task ProvisionAllTypes ( NpgsqlConnection conn )
6160 {
62- Console . WriteLine ( "Running AllTypesNativeExample " ) ;
61+ Console . WriteLine ( "Running ProvisionAllTypes " ) ;
6362
6463 // Submit DDL, create database schema.
6564 await using ( var cmd = new NpgsqlCommand ( "DROP TABLE IF EXISTS testdrive.example" , conn ) )
@@ -169,6 +168,15 @@ INSERT INTO testdrive.example (
169168 cmd . ExecuteNonQuery ( ) ;
170169 }
171170
171+ }
172+
173+ public static async Task < DataTable > AllTypesNativeExample ( NpgsqlConnection conn )
174+ {
175+ Console . WriteLine ( "Running AllTypesNativeExample" ) ;
176+
177+ // Provision data.
178+ await ProvisionAllTypes ( conn ) ;
179+
172180 // Query back data.
173181 await using ( var cmd = new NpgsqlCommand ( "SELECT * FROM testdrive.example" , conn ) )
174182 await using ( var reader = cmd . ExecuteReader ( ) )
@@ -182,6 +190,69 @@ INSERT INTO testdrive.example (
182190
183191 }
184192
193+ public static async Task < JsonDocument > ObjectJsonDocumentExample ( NpgsqlConnection conn )
194+ {
195+ Console . WriteLine ( "Running ObjectJsonDocumentExample" ) ;
196+
197+ // Provision data.
198+ await ProvisionAllTypes ( conn ) ;
199+
200+ // This test uses the central DDL, but a blank slate to focus on the test case at hand.
201+ await using ( var cmd = new NpgsqlCommand ( "DELETE FROM testdrive.example" , conn ) )
202+ {
203+ cmd . ExecuteNonQuery ( ) ;
204+ }
205+
206+ await using ( var cmd = new NpgsqlCommand ( """
207+ INSERT INTO testdrive.example (
208+ "object"
209+ ) VALUES (
210+ @object
211+ )
212+ """ , conn ) )
213+ {
214+ cmd . Parameters . AddWithValue ( "object" , NpgsqlDbType . Json , JsonDocument . Parse ( """{"foo":"bar"}""" ) ) ;
215+ cmd . ExecuteNonQuery ( ) ;
216+ }
217+
218+ // Flush data.
219+ await using ( var cmd = new NpgsqlCommand ( "REFRESH TABLE testdrive.example" , conn ) )
220+ {
221+ cmd . ExecuteNonQuery ( ) ;
222+ }
223+
224+ // Query back data.
225+ await using ( var cmd = new NpgsqlCommand ( "SELECT * FROM testdrive.example" , conn ) )
226+ await using ( var reader = cmd . ExecuteReader ( ) )
227+ {
228+ reader . Read ( ) ;
229+ var obj = reader . GetFieldValue < JsonDocument > ( "object" ) ;
230+ Console . WriteLine ( obj ) ;
231+ return obj ;
232+ }
233+ }
234+
235+ public static async Task < List < JsonDocument > > ArrayJsonDocumentExample ( NpgsqlConnection conn )
236+ {
237+ Console . WriteLine ( "Running ArrayJsonDocumentExample" ) ;
238+
239+ // Provision data.
240+ await ProvisionAllTypes ( conn ) ;
241+
242+ // Query back data.
243+ await using ( var cmd = new NpgsqlCommand ( "SELECT * FROM testdrive.example" , conn ) )
244+ await using ( var reader = cmd . ExecuteReader ( ) )
245+ {
246+ reader . Read ( ) ;
247+ // TODO: System.InvalidCastException: Reading as 'System.Text.Json.JsonDocument' or [1]
248+ // is not supported for fields having DataTypeName 'character varying[]'.
249+ // [1] `System.Collections.Generic.List`1[[System.Text.Json.JsonDocument]`
250+ var obj = reader . GetFieldValue < List < JsonDocument > > ( "array" ) ;
251+ Console . WriteLine ( obj ) ;
252+ return obj ;
253+ }
254+ }
255+
185256 public static async Task ProvisionPoco ( NpgsqlConnection conn )
186257 {
187258 /***
0 commit comments