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

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

ただいまの
回答率

87.36%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 7,665

score 34

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を使用しています

    'Postgres用データ取得
    Private Function Get_DbData_postgres(Sql)
Dim DataBase As String = ""
        Dim User As String = ""
        Dim Password As String = ""
        Dim IpAddress As String = ""
        Dim Port As String = "5432"
        Dim PgCon As New NpgsqlConnection("Database=" + DataBase + ";port=" + Port + ";Server=" + IpAddress + ";User Id=" + User + ";Password=" + Password + ";")


        Using PgCon
            PgCon.Open()
            Dim cmd As NpgsqlCommand = New NpgsqlCommand("SELECT * FROM TABLE_NAME", PgCon)
            Dim da As NpgsqlDataAdapter = New NpgsqlDataAdapter(cmd)
            Dim dt As DataTable = New DataTable()
            da.Fill(dt)

            PgCon.Close()
            Return dt
        End Using
    End Function
    'Postgres用データ更新
    Private Function Insert_DbData_postgres(dt As DataTable, TableName As String)
        Dim SQL As New System.Text.StringBuilder
        Dim User As String = ""
        Dim Password As String = ""
        Dim IpAddress As String = ""
        Dim Port As String = "5432"
        Dim PgCon As New NpgsqlConnection("Database=" + DataBase + ";port=" + Port + ";Server=" + IpAddress + ";User Id=" + User + ";Password=" + Password + ";")


        Using PgCon
        SQL.AppendLine("INSERT INTO ")
        SQL.AppendLine(TableName)
        SQL.AppendLine(" VALUES(")
        /*
     *
     *DataTableを使って一括Insertしたい。。。。。
         *
         */


            PgCon.Open()
            Dim cmd As NpgsqlCommand = New NpgsqlCommand(SQL.ToString, PgCon)
            cmd.ExecuteNonQuery()
            PgCon.Close()
            Return dt
        End Using
    End Function
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

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 以上の場合はバッチ処理が行われるということだそうです。詳しくは上の前者の記事を読んでください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.36%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る