@@ -114,7 +114,7 @@ INSERT INTO testdrive.example (
114114 timestamp_notz,
115115 ip,
116116 ""array"",
117- -- ""object"",
117+ ""object"",
118118 geopoint,
119119 -- geoshape,
120120 float_vector
@@ -133,7 +133,7 @@ INSERT INTO testdrive.example (
133133 @timestamp_notz,
134134 @ip,
135135 @array,
136- -- @object,
136+ @object,
137137 @geopoint,
138138 -- @egoshape,
139139 @float_vector
@@ -157,6 +157,7 @@ INSERT INTO testdrive.example (
157157 cmd . Parameters . AddWithValue ( "array" , new List < string > { "foo" , "bar" } ) ;
158158 // FIXME: System.NotSupportedException: Cannot resolve 'hstore' to a fully qualified datatype name. The datatype was not found in the current database info.
159159 // cmd.Parameters.AddWithValue("object", new Dictionary<string, string>(){{"foo", "bar"}});
160+ cmd . Parameters . AddWithValue ( "object" , @"{""foo"": ""bar""}" ) ;
160161 cmd . Parameters . AddWithValue ( "geopoint" , new List < double > { 85.43 , 66.23 } ) ;
161162 // FIXME: Npgsql.PostgresException : XX000: line 38:9: no viable alternative at input 'VALUES
162163 // cmd.Parameters.AddWithValue("geoshape", "POLYGON ((5 5, 10 5, 10 10, 5 10, 5 5))");
@@ -183,6 +184,66 @@ INSERT INTO testdrive.example (
183184
184185 }
185186
187+ public static async Task < DataTable > ContainerTypesExample ( NpgsqlConnection conn )
188+ {
189+ Console . WriteLine ( "Running AllTypesExample" ) ;
190+
191+ // Submit DDL, create database schema.
192+ await using ( var cmd = new NpgsqlCommand ( "DROP TABLE IF EXISTS testdrive.container" , conn ) )
193+ {
194+ cmd . ExecuteNonQuery ( ) ;
195+ }
196+
197+ await using ( var cmd = new NpgsqlCommand ( @"
198+ CREATE TABLE testdrive.container (
199+ -- Container types
200+ ""array"" ARRAY(STRING),
201+ ""object"" OBJECT(DYNAMIC)
202+ );
203+ " , conn ) )
204+ {
205+ cmd . ExecuteNonQuery ( ) ;
206+ }
207+
208+ // Insert single data point.
209+ await using ( var cmd = new NpgsqlCommand ( @"
210+ INSERT INTO testdrive.container (
211+ ""array"",
212+ ""object""
213+ ) VALUES (
214+ @array,
215+ @object
216+ );
217+ " , conn ) )
218+ {
219+ Console . WriteLine ( cmd ) ;
220+ // FIXME: While doing conversations with ARRAY types works natively,
221+ // it doesn't work for OBJECT types.
222+ // Yet, they can be submitted as STRING in JSON format.
223+ cmd . Parameters . AddWithValue ( "array" , new List < string > { "foo" , "bar" } ) ;
224+ cmd . Parameters . AddWithValue ( "object" , @"{""foo"": ""bar""}" ) ;
225+ cmd . ExecuteNonQuery ( ) ;
226+ }
227+
228+ // Flush data.
229+ await using ( var cmd = new NpgsqlCommand ( "REFRESH TABLE testdrive.container" , conn ) )
230+ {
231+ cmd . ExecuteNonQuery ( ) ;
232+ }
233+
234+ // Query back data.
235+ await using ( var cmd = new NpgsqlCommand ( "SELECT * FROM testdrive.container" , conn ) )
236+ await using ( var reader = cmd . ExecuteReader ( ) )
237+ {
238+ var dataTable = new DataTable ( ) ;
239+ dataTable . Load ( reader ) ;
240+ var payload = JsonConvert . SerializeObject ( dataTable ) ;
241+ Console . WriteLine ( payload ) ;
242+ return ( DataTable ) dataTable ;
243+ }
244+
245+ }
246+
186247 }
187248
188249}
0 commit comments