Chèn đơn giản bằng tham số
Dự án của bạn sẽ cần tham chiếu đến assembly sau:Npgsql
. Nếu tham chiếu này không hiển thị trong Visual Studio , sau đó:
- duyệt đến thư mục cài đặt của trình kết nối
- Thực thi:
GACInstall.exe
- Khởi động lại Visual Studio .
Bảng mẫu
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;
Mã mẫu
Đảm bảo sử dụng các chỉ thị sau:
using Npgsql;
using NpgsqlTypes;
Nhập mã nguồn sau vào phương thức của bạn:
// 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();
Suy nghĩ về hiệu suất
Bài đăng ban đầu không đề cập đến các yêu cầu về hiệu suất. Nó được yêu cầu rằng giải pháp phải:
- chèn bằng
DataTable
- chèn dữ liệu mà không sử dụng vòng lặp
Nếu bạn đang chèn một lượng lớn dữ liệu, thì tôi khuyên bạn nên xem xét các tùy chọn hiệu suất của mình. The Postgres tài liệu gợi ý rằng bạn:
- Tắt tính năng tự động gửi
- Sử dụng
COPY
lệnh - Xóa các chỉ mục
- Xóa các ràng buộc về khóa ngoại
- v.v.
Để biết thêm thông tin về cách tối ưu hóa chèn Postgres, vui lòng xem tại:
- PostgresSql. org:Chèn dữ liệu
- PostgresSql.org :Chèn + Mẹo Hiệu suất
- StackOverflow:Cách tăng tốc hiệu suất chèn trong PostgreSQL
Ngoài ra, có rất nhiều yếu tố khác có thể ảnh hưởng đến hiệu suất của hệ thống. Để có phần giới thiệu cấp cao, hãy xem:
- ADO.NET SQL Server nút cổ chai
- Bài đăng này phác thảo các chiến lược chung (tức là không phải SqlServer) để tối ưu hóa hiệu suất.
Các tùy chọn khác
- Trình kết nối .NET có hỗ trợ Postgres
Copy
lệnh?- Nếu không, bạn có thể tải xuống mã nguồn
cho
Npgsql
trình kết nối và thêmBulkCopy()
của riêng bạn phương pháp. Trước tiên, hãy nhớ xem lại thỏa thuận cấp phép của mã nguồn.
- Nếu không, bạn có thể tải xuống mã nguồn
cho
- Kiểm tra xem liệu Postgres hỗ trợ Tham số giá trị bảng .
- Cách tiếp cận này cho phép bạn chuyển một bảng vào một
Postgres
chức năng này sau đó có thể chèn dữ liệu trực tiếp vào đích.
- Cách tiếp cận này cho phép bạn chuyển một bảng vào một
- Mua một Postgres Trình kết nối .NET từ một nhà cung cấp có tính năng bắt buộc.
Tài liệu tham khảo bổ sung
- Trình kết nối Postgres .NET - miễn phí & nguồn mở