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:
- przejdź do folderu instalacyjnego oprogramowania sprzęgającego
- Wykonaj:
GACInstall.exe
- 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:
- wstaw za pomocą
DataTable
- 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:
- PostgresSql. org:wstawianie danych
- PostgresSql.org :wstawka + wskazówki dotyczące skuteczności
- StackOverflow:Jak przyspieszyć wydajność wstawiania w PostgreSQL
Ponadto istnieje wiele innych czynników, które mogą wpływać na wydajność systemu. Aby uzyskać ogólne wprowadzenie, spójrz na:
- Wąskie gardło wydajności ADO.NET SQL Server
- Ten wpis przedstawia ogólne (tj. inne niż SqlServer) strategie optymalizacji wydajności.
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łasneBulkCopy()
metoda. Pamiętaj, aby najpierw zapoznać się z umową licencyjną kodu źródłowego.
- Jeśli nie, możesz pobrać kod źródłowy
dla
- 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.
- To podejście pozwala przekazać tabelę do
- Kup Postgres Złącze .NET od dostawcy, które zawiera wymaganą funkcję.
Dodatkowe odniesienia
- Postgres .NET Connector - bezpłatnie &open source