{"id":25174762,"url":"https://github.com/uzbekdev1/NpgsqlBulkCopy","last_synced_at":"2025-10-24T09:31:47.615Z","repository":{"id":19911408,"uuid":"23177038","full_name":"uzbekdev1/NpgsqlBulkCopy","owner":"uzbekdev1","description":"Npgsql Bulk Copy","archived":false,"fork":false,"pushed_at":"2024-10-31T17:46:09.000Z","size":8797,"stargazers_count":9,"open_issues_count":2,"forks_count":10,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-02-06T07:38:32.841Z","etag":null,"topics":["bulk-loader","c-plus-plus","c-sharp","postgresql"],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/uzbekdev1.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2014-08-21T06:41:54.000Z","updated_at":"2024-10-31T17:52:24.000Z","dependencies_parsed_at":"2022-08-25T01:40:44.037Z","dependency_job_id":null,"html_url":"https://github.com/uzbekdev1/NpgsqlBulkCopy","commit_stats":null,"previous_names":["elyor0529/npgsqlbulkcopy"],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/uzbekdev1%2FNpgsqlBulkCopy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/uzbekdev1%2FNpgsqlBulkCopy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/uzbekdev1%2FNpgsqlBulkCopy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/uzbekdev1%2FNpgsqlBulkCopy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/uzbekdev1","download_url":"https://codeload.github.com/uzbekdev1/NpgsqlBulkCopy/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":237946057,"owners_count":19391853,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bulk-loader","c-plus-plus","c-sharp","postgresql"],"created_at":"2025-02-09T12:21:08.864Z","updated_at":"2025-10-24T09:31:44.821Z","avatar_url":"https://github.com/uzbekdev1.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"NpgsqlBulkCopy\n==============\n\nNpgsql Bulk Copy\n\n\nI simple demostration:\n\nScripts:\n```\n-- Database: northwind\n\n-- DROP DATABASE northwind;\n\nCREATE DATABASE northwind\n  WITH OWNER = postgres\n       ENCODING = 'UTF8'\n       TABLESPACE = pg_default\n       LC_COLLATE = 'English_United States.1252'\n       LC_CTYPE = 'English_United States.1252'\n       CONNECTION LIMIT = -1;\n\t   \n-- Table: employees\n\n-- DROP TABLE employees;\n\nCREATE TABLE employees\n(\n  \"EmployeeID\" smallint NOT NULL,\n  \"LastName\" character varying(20) NOT NULL,\n  \"FirstName\" character varying(10) NOT NULL,\n  \"Title\" character varying(30),\n  \"TitleOfCourtesy\" character varying(25),\n  \"BirthDate\" date,\n  \"HireDate\" date,\n  \"Address\" character varying(60),\n  \"City\" character varying(15),\n  \"Region\" character varying(15),\n  \"PostalCode\" character varying(10),\n  \"Country\" character varying(15),\n  \"HomePhone\" character varying(24),\n  \"Extension\" character varying(4),\n  \"Photo\" bytea,\n  \"Notes\" text,\n  \"ReportsTo\" smallint,\n  \"PhotoPath\" character varying(255),\n  CONSTRAINT pk_employees PRIMARY KEY (\"EmployeeID\")\n)\nWITH (\n  OIDS=FALSE\n);\nALTER TABLE employees\n  OWNER TO postgres;\n\n```\n\nConfig file:\n\nBulkCopyConfig.xml\n```\n\u003cBulkCopy\u003e\n  \u003cMajorVersion\u003e9\u003c/MajorVersion\u003e \n  \u003cConnection\u003e\n    \u003cHost\u003e127.0.0.1\u003c/Host\u003e\n    \u003cPort\u003e5432\u003c/Port\u003e\n    \u003cUserName\u003enorthwind\u003c/UserName\u003e\n    \u003cUserName\u003epostgres\u003c/UserName\u003e\n    \u003cPassword\u003eweb@1234\u003c/Password\u003e\n  \u003c/Connection\u003e\n\u003c/BulkCopy\u003e\n```\n\nSource:\n\n\n   ```     static unsafe void Main(string[] args)\n        {\n            var model = BulkCopyFactory.GetModel();\n            var columnData = String.Join(\",\", new[]\n                    {\n                        \"EmployeeID\",\n                        \"LastName\",\n                        \"FirstName\",\n                        \"Title\",\n                        \"BirthDate\",\n                        \"Address\"\n                    }.Select(s =\u003e String.Format(\"\\\"{0}\\\"\", s)));\n            var tableName = \"\\\"public\\\".\\\"employees\\\"\";\n            var batchSize = 10000;\n            var recordSize = 10000000;\n\n            PQNativeApi.LoadDLLDirectory(model.MajorVersion);\n\n            switch (model.MajorVersion)\n            {\n                case PgVersions.PG8x:\n                    {\n                        PQ8xNativeApi.openLocaleConn(model.Connection.Database.AsPointer(), model.Connection.UserName.AsPointer(), model.Connection.Password.AsPointer());\n                        PQ8xNativeApi.setColumns(columnData.AsPointer());\n                        PQ8xNativeApi.setTableName(tableName.AsPointer());\n                        PQ8xNativeApi.setBatchSize(batchSize);\n\n                        for (var i = 0; i \u003c recordSize; i++)\n                        {\n                            var row = String.Join(\",\", new object[]\n                            {\n                                i + 1,\n                                \"'Elyor'\",\n                                \"'Laipov'\",\n                                \"'Software Developer'\",\n                                \"now()\",\n                                \"'Uzbekistan,Bukhara,Shofirkan'\"\n                            });\n\n                            PQ8xNativeApi.addRow(row.AsPointer());\n                        }\n\n                        PQ8xNativeApi.runBulkCopy();\n                        PQ8xNativeApi.closeConn();\n                        PQ8xNativeApi.cleanUp();\n\n                    }\n                    break;\n                case PgVersions.PQ9x:\n                    {\n                        PQ9xNativeApi.openLocaleConn(model.Connection.Database.AsPointer(), model.Connection.UserName.AsPointer(), model.Connection.Password.AsPointer());\n                        PQ9xNativeApi.setColumns(columnData.AsPointer());\n                        PQ9xNativeApi.setTableName(tableName.AsPointer());\n                        PQ9xNativeApi.setBatchSize(batchSize);\n\n                        for (var i = 0; i \u003c recordSize; i++)\n                        {\n                            var row = String.Join(\",\", new object[]\n                            {\n                                i + 1,\n                                \"'Elyor'\",\n                                \"'Laipov'\",\n                                \"'Software Developer'\",\n                                \"now()\",\n                                \"'Uzbekistan,Bukhara,Shofirkan'\"\n                            });\n\n                            PQ9xNativeApi.addRow(row.AsPointer());\n                        }\n\n                        PQ9xNativeApi.runBulkCopy();\n                        PQ9xNativeApi.closeConn();\n                        PQ9xNativeApi.cleanUp();\n\n                    }\n                    break;\n            }\n\n\n            Console.WriteLine(\"Bulk copy successfully\");\n            Console.ReadKey();\n        }\n        ```\n        \nPerformance:\n\nBatch size:10.000 , Rows -\u003e 10.000.000 records to load time ~5.8 min\nBatch size: 100.000 ,Rows-\u003e 10.000.000 records to load time ~5.9 min\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fuzbekdev1%2FNpgsqlBulkCopy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fuzbekdev1%2FNpgsqlBulkCopy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fuzbekdev1%2FNpgsqlBulkCopy/lists"}