PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Wstaw całą wartość DataTable bulk do tabeli postgreSQL

Proste wstawianie przy użyciu parametrów

Twój projekt będzie musiał odwoływać się do następującego zestawu:Npgsql . Jeśli to odniesienie nie jest widoczne w Visual Studio , a następnie:

  1. przejdź do folderu instalacyjnego oprogramowania sprzęgającego
  2. Wykonaj:GACInstall.exe
  3. Uruchom ponownie Program Visual Studio .

Przykładowa tabela

CREATE TABLE "OrderHistory"
(
  "OrderId" bigint NOT NULL,
  "TotalAmount" bigint,
  CONSTRAINT "OrderIdPk" PRIMARY KEY ("OrderId")
)
WITH (
  OIDS=FALSE
);
ALTER TABLE "OrderHistory"
  OWNER TO postgres;
GRANT ALL ON TABLE "OrderHistory" TO postgres;
GRANT ALL ON TABLE "OrderHistory" TO public;
ALTER TABLE "OrderHistory" ALTER COLUMN "OrderId" SET (n_distinct=1);

GRANT SELECT("OrderId"), UPDATE("OrderId"), INSERT("OrderId"), REFERENCES("OrderId") ON "OrderHistory" TO public;
GRANT SELECT("TotalAmount"), UPDATE("TotalAmount"), INSERT("TotalAmount"), REFERENCES("TotalAmount") ON "OrderHistory" TO public;

Przykładowy kod

Upewnij się, że używasz następujących dyrektyw:

using Npgsql;
using NpgsqlTypes;

Wprowadź następujący kod źródłowy do swojej metody:

// Make sure that the user has the INSERT privilege for the OrderHistory table.
NpgsqlConnection connection = new NpgsqlConnection("PORT=5432;TIMEOUT=15;POOLING=True;MINPOOLSIZE=1;MAXPOOLSIZE=20;COMMANDTIMEOUT=20;COMPATIBLE=2.2.4.3;DATABASE=test;HOST=127.0.0.1;PASSWORD=test;USER ID=test");

connection.Open();

DataSet dataSet = new DataSet();

NpgsqlDataAdapter dataAdapter = new NpgsqlDataAdapter("select * from OrderHistory where OrderId=-1", connection);
dataAdapter.InsertCommand = new NpgsqlCommand("insert into OrderHistory(OrderId, TotalAmount) " +
                        " values (:a, :b)", connection);
dataAdapter.InsertCommand.Parameters.Add(new NpgsqlParameter("a", NpgsqlDbType.Bigint));
dataAdapter.InsertCommand.Parameters.Add(new NpgsqlParameter("b", NpgsqlDbType.Bigint));
dataAdapter.InsertCommand.Parameters[0].Direction = ParameterDirection.Input;
dataAdapter.InsertCommand.Parameters[1].Direction = ParameterDirection.Input;
dataAdapter.InsertCommand.Parameters[0].SourceColumn = "OrderId";
dataAdapter.InsertCommand.Parameters[1].SourceColumn = "TotalAmount";

dataAdapter.Fill(dataSet);

DataTable newOrders = dataSet.Tables[0];
DataRow newOrder = newOrders.NewRow();
newOrder["OrderId"] = 20;
newOrder["TotalAmount"] = 20.0;

newOrders.Rows.Add(newOrder);
DataSet ds2 = dataSet.GetChanges();
dataAdapter.Update(ds2);
dataSet.Merge(ds2);
dataSet.AcceptChanges();

connection.Close();

Myśli o wydajności

Pierwotny wpis nie wspominał o wymaganiach dotyczących wydajności. Poproszono, aby rozwiązanie:

  1. wstaw za pomocą DataTable
  2. wstaw dane bez użycia pętli

Jeśli wstawiasz znaczne ilości danych, sugeruję, abyś przyjrzał się swoim opcjom wydajności. Postgres dokumentacja sugeruje, że:

  • Wyłącz automatyczne zatwierdzanie
  • Użyj COPY polecenie
  • Usuń indeksy
  • Usuń ograniczenia klucza obcego
  • itd.

Aby uzyskać więcej informacji na temat optymalizacji wkładek Postgres, spójrz na:

Ponadto istnieje wiele innych czynników, które mogą wpływać na wydajność systemu. Aby uzyskać ogólne wprowadzenie, spójrz na:

Inne opcje

  • Czy łącznik .NET obsługuje Postgres? Copy polecenie?
    • Jeśli nie, możesz pobrać kod źródłowy dla Npgsql łącznik i dodaj własne BulkCopy() metoda. Pamiętaj, aby najpierw zapoznać się z umową licencyjną kodu źródłowego.
  • Sprawdź, czy Postgres obsługuje parametry wartości tabeli .
    • To podejście pozwala przekazać tabelę do Postgres funkcja, która może następnie wstawić dane bezpośrednio do miejsca docelowego.
  • Kup Postgres Złącze .NET od dostawcy, które zawiera wymaganą funkcję.

Dodatkowe odniesienia



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak śledzić postęp zapytań w PostgreSQL?

  2. Apache Cayenne / PostgreSQL:zbyt wiele klientów już wystąpiło błąd

  3. Co dzieje się z duplikatami podczas wstawiania wielu wierszy?

  4. GeoDjango w systemie Windows:Nie można znaleźć biblioteki GDAL / OSError:[WinError 126] Nie można znaleźć określonego modułu

  5. Postgres nie rozpoznaje tabeli temp w funkcji