spanner/api/Spanner.Samples/UsePgNumericAsyncPostgres.cs (78 lines of code) (raw):

// Copyright 2022 Google Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // [START spanner_postgresql_numeric_datatype] using Google.Cloud.Spanner.Admin.Database.V1; using Google.Cloud.Spanner.Common.V1; using Google.Cloud.Spanner.Data; using Google.Cloud.Spanner.V1; using System; using System.Collections.Generic; using System.Threading.Tasks; public class UsePgNumericAsyncPostgresSample { public async Task<List<Venue>> UsePgNumericAsyncPostgres(string projectId, string instanceId, string databaseId) { DatabaseAdminClient databaseAdminClient = await DatabaseAdminClient.CreateAsync(); // Create a table that includes a column with data type NUMERIC. As the database has been // created with the PostgreSQL dialect, the data type that is used will be the PostgreSQL // NUMERIC data type. var ddlStatement = @"CREATE TABLE Venues( " + "VenueId bigint NOT NULL PRIMARY KEY, " + "Name varchar(1024) NOT NULL, " + "Revenues numeric)"; DatabaseName databaseName = DatabaseName.FromProjectInstanceDatabase(projectId, instanceId, databaseId); // Create UpdateDatabaseRequest to create the table. var updateDatabaseRequest = new UpdateDatabaseDdlRequest { DatabaseAsDatabaseName = databaseName, Statements = { ddlStatement } }; var updateOperation = await databaseAdminClient.UpdateDatabaseDdlAsync(updateDatabaseRequest); // Wait until the operation has finished. Console.WriteLine("Waiting for the table to be created."); var updateResponse = await updateOperation.PollUntilCompletedAsync(); if (updateResponse.IsFaulted) { Console.WriteLine($"Error while creating Venues table : {updateResponse.Exception}"); throw updateResponse.Exception; } Console.WriteLine("Created Venues table."); string connectionString = $"Data Source=projects/{projectId}/instances/{instanceId}/databases/{databaseId}"; using var connection = new SpannerConnection(connectionString); await connection.OpenAsync(); var batchCommand = connection.CreateBatchDmlCommand(); // Insert a venue. batchCommand.Add("INSERT INTO Venues (VenueId, Name, Revenues) " + "VALUES ($1, $2, $3)", new SpannerParameterCollection { { "p1", SpannerDbType.Int64, 1 }, { "p2", SpannerDbType.String, "Venue 1" }, { "p3", SpannerDbType.PgNumeric, PgNumeric.Parse("3150.25") } }); // Insert a Venue with a NaN (Not a Number) value for the Revenues column. batchCommand.Add("INSERT INTO Venues (VenueId, Name, Revenues) " + "VALUES ($1, $2, $3)", new SpannerParameterCollection { { "p1", SpannerDbType.Int64, 2 }, { "p2", SpannerDbType.String, "Venue 2" }, { "p3", SpannerDbType.PgNumeric, PgNumeric.NaN } // We can also use PgNumeric.Parse("NaN"). }); // Insert a Venue with a NULL value for the Revenues column. batchCommand.Add("INSERT INTO Venues (VenueId, Name, Revenues) " + "VALUES ($1, $2, $3)", new SpannerParameterCollection { { "p1", SpannerDbType.Int64, 3 }, { "p2", SpannerDbType.String, "Venue 3" }, { "p3", SpannerDbType.PgNumeric, DBNull.Value } // We can use null as well. }); var count = await batchCommand.ExecuteNonQueryAsync(); // Get all Venues and inspect the Revenues values. var command = connection.CreateSelectCommand("Select * FROM Venues"); using var reader = await command.ExecuteReaderAsync(); List<Venue> result = new List<Venue>(); while (await reader.ReadAsync()) { result.Add(new Venue { Id = reader.GetFieldValue<long>("venueid"), Name = reader.GetFieldValue<string>("name"), // PgNumeric can have DBNull values, so check for DBNull. Revenue = reader.IsDBNull(reader.GetOrdinal("revenues")) ? null : reader.GetFieldValue<PgNumeric?>("revenues") }); } return result; } public struct Venue { public long Id { get; set; } public string Name { get; set; } public PgNumeric? Revenue { get; set; } } } // [END spanner_postgresql_numeric_datatype]