Sisipkan Sederhana Menggunakan Parameter
Proyek Anda perlu mereferensikan Majelis berikut:Npgsql
. Jika referensi ini tidak terlihat dalam Visual Studio , maka:
- jelajahi folder instalasi konektor
- Jalankan:
GACInstall.exe
- Mulai ulang Visual Studio .
Tabel Contoh
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;
Contoh Kode
Pastikan untuk menggunakan arahan berikut:
using Npgsql;
using NpgsqlTypes;
Masukkan kode sumber berikut ke dalam metode Anda:
// 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();
Pemikiran Tentang Kinerja
Posting asli tidak menyebutkan persyaratan kinerja. Diminta agar solusinya harus:
- masukkan menggunakan
DataTable
- memasukkan data tanpa menggunakan loop
Jika Anda memasukkan sejumlah besar data, maka saya sarankan Anda melihat opsi kinerja Anda. Postgres dokumentasi menyarankan agar Anda:
- Nonaktifkan Autocommit
- Gunakan
COPY
perintah - Hapus indeks
- Hapus Batasan Kunci Asing
- dst.
Untuk informasi lebih lanjut tentang mengoptimalkan sisipan Postgres, silakan lihat:
- PostgresSql. org:Memasukkan Data
- PostgresSql.org :Sisipkan + Kiat Kinerja
- StackOverflow:Cara mempercepat kinerja penyisipan di PostgreSQL
Juga, ada banyak faktor lain yang dapat memengaruhi kinerja sistem. Untuk pengenalan tingkat tinggi, lihat:
- ADO.NET SQL Server Performance bottleneck
- Postingan ini menguraikan strategi umum (yaitu non-SqlServer) untuk mengoptimalkan kinerja.
Opsi Lain
- Apakah konektor .NET mendukung Postgres
Copy
perintah?- Jika tidak, Anda dapat mengunduh kode sumber
untuk
Npgsql
konektor dan tambahkanBulkCopy()
Anda sendiri metode. Pastikan untuk meninjau perjanjian lisensi kode sumber terlebih dahulu.
- Jika tidak, Anda dapat mengunduh kode sumber
untuk
- Periksa untuk melihat apakah Postgres mendukung Parameter Nilai Tabel .
- Pendekatan ini memungkinkan Anda memasukkan tabel ke dalam
Postgres
fungsi yang kemudian dapat memasukkan data langsung ke tujuan.
- Pendekatan ini memungkinkan Anda memasukkan tabel ke dalam
- Beli Postgres Konektor .NET dari vendor yang menyertakan fitur yang diperlukan.
Referensi Tambahan
- Postgres .NET Connector - gratis &sumber terbuka