2016-11-02 18 views
0

VBAを使用して のブック内のデータからテーブルにレコードを挿入したいのですが、挿入に問題はありませんが、問題は重複しています。VBAを使用してExcelからDB2データベースにレコードを挿入する方法

レコードがデータベース内に存在しない場合にのみ、Excelのレコードを挿入するにはどうすればよいですか?

これは私の現在のものです。

さらに、更新されたレコードや別のモジュールが必要なレコードを持つことができますか?

Sub Button1_Click() 

    Dim conn As New ADODB.Connection 
    Dim iRowNo As Integer 
    Dim sequipid, stype, sname As String 

    With Sheets("Sheet1") 

     'Open a connection to SQL Server 
     conn.Open "Driver={IBM DB2 ODBC DRIVER};Database=XXXX;Hostname=192.168.XXX.XX;Port=50000;Protocol=TCPIP;Uid=" & "XXXX" & ";Pwd=" & "XXXXXX" & ";CurrentSchema=LYNX;" 

     'Skip the header row 
     iRowNo = 2 

     'Loop until empty cell in CustomerId 
     Do Until .Cells(iRowNo, 1) = "" 
      sequipid = .Cells(iRowNo, 1) 
      stype = .Cells(iRowNo, 2) 
      sname = .Cells(iRowNo, 3) 

      'Generate and execute sql statement to import the excel rows to SQL Server table 
      conn.Execute "INSERT INTO OH_TEST_TABLE (EQUIPID, TYPE, NAME) VALUES ('" & sequipid & "','" & stype & "','" & sname & "')" 

      iRowNo = iRowNo + 1 
     Loop 

     MsgBox "RECORD UPDATED" 

     conn.Close 
     Set conn = Nothing 

    End With 

End Sub 
+0

最も簡単な(そして最も堅牢な)方法は、データベースに適切な一意制約を追加することです。バックエンドでデータの整合性を維持するためにクライアントコードが責任を負うべきではありません。 – Comintern

+0

最初にデータベースに現在の 'EQUIPID'を問い合わせます。存在すれば更新を実行し、そうでなければ挿入を実行します。 –

+0

@TimWilliamsので、基本的にconn.executeの後に ""&equipid& "'が存在する(oh_test_tableから1を選択するとequipid ='"&equipid& "')、次にoh_test_tableなどを更新してください – OVO

答えて

0

あなたがDB2上にある私は、あなたが(どちらか更新するには、このようなMERGE文を使用するか、または挿入することができますが、この

conn.Execute "INSERT INTO OH_TEST_TABLE (EQUIPID, TYPE, NAME) select '" & sequipid & "','" & stype & "','" & sname & "' from SYSIBM.SYSDUMMY1 where not exists (select * from OH_TEST_TABLE where EQUIPID='" & sequipid & "')" 

またはこの

conn.Execute "INSERT INTO OH_TEST_TABLE (EQUIPID, TYPE, NAME) select * from (values ('" & sequipid & "','" & stype & "','" & sname & "')) tmp(a,b,c) where not exists (select * from OH_TEST_TABLE where EQUIPID='" & sequipid & "')" 
0

のようなあなたのクエリを変更することができiSeriesのDB2の最新版では、

merge into oh_test_table oh1 
using (select * from oh_test_table where equipid='"& sequipid &"') oh2 
on oh1.equipid = oh2.equipid 
when matched then update set 
    type = '"& stype &"', 
    name = '"& sname &"' 
when not matched then insert 
    (equipid, type, name) values ('" & sequipid & "','" & stype & "','" & sname & "') 

わかりやすくするために、私は複数の行にまたがって表示しましたが、余分なVBAフォーマットは必要ありません。

関連する問題