public void Bug219NpgsqlCopyInConcurrentUsage() { try { // Create temporary test tables ExecuteNonQuery(@"CREATE TABLE Bug219_table1 ( id integer, name character varying(100) ) WITH ( OIDS=FALSE );"); ExecuteNonQuery(@"CREATE TABLE Bug219_table2 ( id integer, null1 integer, name character varying(100), null2 integer, description character varying(1000), null3 integer ) WITH ( OIDS=FALSE );"); using (var connection1 = new NpgsqlConnection(ConnectionString)) using (var connection2 = new NpgsqlConnection(ConnectionString)) { connection1.Open(); connection2.Open(); var copy1 = new NpgsqlCopyIn("COPY Bug219_table1 FROM STDIN;", connection1); var copy2 = new NpgsqlCopyIn("COPY Bug219_table2 FROM STDIN;", connection2); copy1.Start(); copy2.Start(); NpgsqlCopySerializer cs1 = new NpgsqlCopySerializer(connection1); //NpgsqlCopySerializer cs2 = new NpgsqlCopySerializer(connection2); for (int index = 0; index < 10; index++) { cs1.AddInt32(index); cs1.AddString(string.Format("Index {0} ", index)); cs1.EndRow(); /*cs2.AddInt32(index); cs2.AddNull(); cs2.AddString(string.Format("Index {0} ", index)); cs2.AddNull(); cs2.AddString("jjjjj"); cs2.AddNull(); cs2.EndRow();*/ } cs1.Close(); //Exception //cs2.Close(); copy1.End(); copy2.End(); } } catch (Exception) { throw; } finally { ExecuteNonQuery(@"DROP TABLE IF EXISTS Bug219_table1"); ExecuteNonQuery(@"DROP TABLE IF EXISTS Bug219_table2"); } }
// Serializer success test public static void CopyInWithSerializer() { NpgsqlCopySerializer sink = new NpgsqlCopySerializer( conn ); String q = "COPY copy2(field_int4, field_int8, field_text, field_timestamp, field_bool) FROM STDIN"; cin = new NpgsqlCopyIn( q, conn ); cin.Start(); if(! cin.IsActive) { throw new Exception("Copy started inactive"); } sink.AddInt32(-13); sink.AddNull(); sink.AddString("First row"); sink.AddDateTime(new DateTime( 2020, 12, 22, 23, 33, 45, 765 )); sink.AddBool(true); sink.EndRow(); sink.AddNull(); sink.AddNull(); sink.AddString("Second row"); sink.Close(); Console.Out.WriteLine("Copy through serializer ok"); }
protected void InsertDataToDbBulkMethod(DataTable table) { List<string> columns_names = new List<string>(); for (int i = 0; i < table.Columns.Count; i++) columns_names.Add(table.Columns[i].ColumnName); string sql = string.Format("COPY {0}({1}) FROM STDIN", table.TableName, string.Join(",", columns_names.ToArray())); _cmd = CreateCommand(sql); _cmd.CommandType = CommandType.Text; var serializer = new NpgsqlCopySerializer(_conn as NpgsqlConnection); NpgsqlCopyIn copyIn = new NpgsqlCopyIn((_cmd as NpgsqlCommand), (_conn as NpgsqlConnection), serializer.ToStream); try { copyIn.Start(); foreach (DataRow dr in table.Rows) { for (int i = 0; i < table.Columns.Count; i++) AddValueToSerializer(serializer, dr[i]); serializer.EndRow(); serializer.Flush(); } copyIn.End(); serializer.Close(); } catch (Exception e) { try { copyIn.Cancel("Exception has occured!"); } catch (NpgsqlException ex) { if (ex.BaseMessage.Contains("Exception has occured!")) throw new Exception(string.Format("Copy was uncanceled. exception1: {0};exception2: {1}", e.Message, ex.Message)); } } }