質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

13911閲覧

VB DataTableを使った一括Insertについて

giwagiwagiwa

総合スコア34

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2019/06/03 10:16

VBフォームアプリケーションで
PostgresのDBをコピーするプログラムを作成しています。

サーバAにあるPostgresのデータをサーバBのPostgresにコピーしたいです。
サーバAとサーバBは通信できず、クライアントのアプリケーションを中継してデータの同期を行う仕組みです。
クライアントからはサーバAもサーバBも通信可能です。
DBの定義はDataTableの列名とイコールになっています。

[サーバA] ⇔ [クライアント] ⇔ [サーバB]

サーバAからデータを取得し、DataTableにセットし、
サーバBへDataTableの情報で一括Insertできないかと考えています。

件数が10万~30万ほどになるのでDataTableをforで回すのは現実的でないと考えました。。。
DataTableに入れた後、データの編集は行いません。

SQLServer等ではDataTabeで一括Insertができる記事を見つけたのですが
Postgresでも可能なのでしょうか。

同じようなことをしてる方がいらっしゃったら教えていただきたいです

Npgsqlを使用しています

VB

1 'Postgres用データ取得 2 Private Function Get_DbData_postgres(Sql) 3Dim DataBase As String = "" 4 Dim User As String = "" 5 Dim Password As String = "" 6 Dim IpAddress As String = "" 7 Dim Port As String = "5432" 8 Dim PgCon As New NpgsqlConnection("Database=" + DataBase + ";port=" + Port + ";Server=" + IpAddress + ";User Id=" + User + ";Password=" + Password + ";") 9 10 11 Using PgCon 12 PgCon.Open() 13 Dim cmd As NpgsqlCommand = New NpgsqlCommand("SELECT * FROM TABLE_NAME", PgCon) 14 Dim da As NpgsqlDataAdapter = New NpgsqlDataAdapter(cmd) 15 Dim dt As DataTable = New DataTable() 16 da.Fill(dt) 17 18 PgCon.Close() 19 Return dt 20 End Using 21 End Function 22 'Postgres用データ更新 23 Private Function Insert_DbData_postgres(dt As DataTable, TableName As String) 24 Dim SQL As New System.Text.StringBuilder 25 Dim User As String = "" 26 Dim Password As String = "" 27 Dim IpAddress As String = "" 28 Dim Port As String = "5432" 29 Dim PgCon As New NpgsqlConnection("Database=" + DataBase + ";port=" + Port + ";Server=" + IpAddress + ";User Id=" + User + ";Password=" + Password + ";") 30 31 32 Using PgCon 33 SQL.AppendLine("INSERT INTO ") 34 SQL.AppendLine(TableName) 35 SQL.AppendLine(" VALUES(") 36 /* 37     * 38     *DataTableを使って一括Insertしたい。。。。。 39 * 40 */ 41 42 43 PgCon.Open() 44 Dim cmd As NpgsqlCommand = New NpgsqlCommand(SQL.ToString, PgCon) 45 cmd.ExecuteNonQuery() 46 PgCon.Close() 47 Return dt 48 End Using 49 End Function

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Npgsql に SqlClient と 100% 同じ機能があるのかどうか、機能があっても「件数が10万~30万」に適切に対応できるかどうかわかりませんが、DataTable と DataAdapter を使って以下の記事のことができるそうなので紹介しておきます。

DataAdapter を使用したバッチ操作の実行
https://docs.microsoft.com/ja-jp/dotnet/framework/data/adonet/performing-batch-operations-using-dataadapters

基本的にどういう仕組みかと言うと、以下の記事の「図 1 DataSet 内の更新イメージ」と「図 2 DataAdapter によるSQL 自動発行のイメージ」のあたりを見てもらうと分かると思います。

DB 設計者のための明解 ADO.NET 第 1 回
https://docs.microsoft.com/ja-jp/previous-versions/cc482903(v=msdn.10)

UpdateBatchSize プロパティがデフォルトの 1(バッチ更新無効)の場合は、上の記事の図2で INSERT、UPDATE、DELETE の各操作を 1 操作ずつサーバーに送信します。

UpdateBatchSize プロパティが 0 または 2 以上の場合はバッチ処理が行われるということだそうです。詳しくは上の前者の記事を読んでください。

投稿2019/06/04 01:28

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問