C#.NET Q&A

Datatable to Access db에 넣고 있는데 .3000개 정도 돌리는데 너무 오래걸려요.. 악마성 평점: 없음 조회: 133
안녕하세요... 현재 기능은 동작 되고 있는데요. 

속도가 너무 느려서 조언 좀 받고자 합니다..

물론 코드가 VB.NET 이지만 방식이라도 조언 해주시면 .... 감사하겠습니다. ㅠㅠ

현재 OLEDB를 사용해서 구현 했는데 

  테이블 로우가 3,000개 정도되고
 
  한 줄씩 반복 하면서 기존에 있는 건지 없는건지 확인 후 
 
  한 줄씩 INSERT INTO 하거나 UPDATE SET 합니다..

  뭔가 비효율적인 것 같은데 아무리 검색 해봐도 ... 저의 한계인가봅니다.. ㅠㅠ

  도와주세요..

※ vConn(pulbic으로 선언되어있음)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
For i As Integer = 0 To dt.Rows.Count - 1
 
    Dim myCmd As OleDbCommand
    Dim result As DataTable = New DataTable
 
    '// IIF(만약 i로우의 "가가가" 필드의 값이 null이면!, " ", 값이 있으면 "가가가" 값 넣어줌)
    sSQL_AAA = IIf(IsDBNull(dt.Rows(i).Item("가가가")), " ", dt.Rows(i).Item("가가가"))
    sSQL_BBB = IIf(IsDBNull(dt.Rows(i).Item("나나나")), " ", dt.Rows(i).Item("나나나"))
 
    vSQL_AAA = " AND [가가가] = '" & Replace(sSQL_AAA, "'""''"& "'"
    vSQL_BBB = " AND [나나나] = '" & Replace(sSQL_BBB, "'""''"& "'"
 
    Dim sql As String = Nothing
    sql = "SELECT * "
    sql = sql & "FROM [가나다] "
    sql = sql & "WHERE ID > 0  " & vSQL_AAA & vSQL_BBB 
 
 
    Dim cmd As OleDbCommand = New OleDbCommand(sql, vConn)
    '     ▼▼ Data Adapter를 사용해 Data Table을 만들고 Query 된 Result를 Count 하여 기존 Data가 있는지 Check 
    Dim adapter As OleDbDataAdapter = New OleDbDataAdapter(cmd)
    adapter.Fill(result)
 
    '    ▼▼  만약 조회가 안 됐다면 ?  새 항목
    If result.Rows.Count = 0 Then   ' 약 row가 3,000개 정도임.
        ' is it insert
        sql = "INSERT INTO 가나다 (가가가, 나나나, 다다다, 라라라, 마마마, 바바바, 사사사 ) " &
        "values('" & strAAA & "','" + strBBB + "','" + strCCC + "','" + strDDD + "','" + strEEE + "','" + strFFF + "','" + strGGG + "');"
 
        'Debug.Print(sql)
        myCmd = New OleDbCommand(sql, vConn)
        check = myCmd.ExecuteNonQuery()
        nCnt_insert += 1
 
    Else '◀◀ 기존 데이터와 덮어쓰기 해야 한다면
 
        sql = "UPDATE 가나다 SET "
        sql = sql & "가가가 ='" & strAAA & "', "
        sql = sql & "나나나 ='" & strBBB & "', "
        sql = sql & "다다다 ='" & strCCC & "', "
        sql = sql & "라라라 ='" & strDDD & "', "
        sql = sql & "마마마 ='" & strEEE & "', "
        sql = sql & "바바바 ='" & strFFF & "', "
        sql = sql & "사사사 ='" & strGGG & "' "
        sql = sql & " WHERE ID = " & result.Rows(0)(0).ToString()
        Debug.Print(sql)
 
        myCmd = New OleDbCommand(sql, vConn)
        check = myCmd.ExecuteNonQuery()
        nCnt_update += 1
    End If
 
Next
cs

태그 : #질문 Access Datatable OLEDB#질문 to
작성자 정보
악마성
Level 5
 [EXP.5/16]

메일:  비공개

글등록 +12 36 덧글등록 +3 9
자기소개
안뇽하세요~ VB.NET을 위주로 하고 있는 사람 입니다.
글 공유하기 |
  tweet facebook
2018-11-30 오전 11:06:28
나도한마디
사용자
제스            [2018-11-30]
Level 23
 [EXP.30/50]
Bulk를 이용해서 해보세요 14000천줄 10초도 안돼서 다들어갑니다.
사용자
악마성            [2018-11-30]
Level 5
 [EXP.5/16]
감사합니다! Bulk insert 관련해서 내용 찾아보겠습니다!
사용자
구니구니            [2018-11-30]
Level 23
 [EXP.16/50]
테이블이 있다면, DB화가 되어있나요?
쿼리로 짜시면 훨씬 편하실거같네요.
사용자
나부렁이            [2018-11-30]
Level 1
 [EXP.3/16]
.NET 에서 Bulkcopy 라는게 있습니다.
MS-SQL은 2005 버전부터 Oracle 은 어느 버전인지 잘모르겠구요. MySQL도 bulkcopy 를 지원합니다.
MySQL은 직접DB에 넣는 방식이 아닌 한번 파일로 데이터를 만들어서 파일에 있는 데이터를 저장소(DB)에 넣어줍니다.

Access DB 의 bulkcopy 지원은 모르겠네요.....^^;

제스님의 답변 처럼 Bulkcopy를 이용하면 14000줄 정도는 1~2초면 넣을 수 있습니다.
근데 Bulkcopy는 새로운 데이터를 Insert 시킬때만.......사용하시구요.
Insert, update 가 동시에 일어나야 한다면....
MS-SQL 기준으로 Merge(Insert, Update, Delete)문을 사용하시면 됩니다. (Access 지원은 찾아보셔야 될거같습니다.)

알려드린 Merge 문도 사실 한줄씩 읽기 때문에 속도면에서는 아쉬울 수 있습니다.
유용한 팁을 알려드리면 MS-SQL 기준입니다.
14,000건의 데이터는 Bulkcopy 로 한번에 넣으시고....Merge 문으로 Table to Table 로 쿼리 만들어서 사용하시면 안정성(무결성)과 속도 두마리 한꺼번에 만족하실 수 있습니다.
실제 제가 사용하는 방법입니다.(최소 1억건 레코드)
사용자
악마성            [2018-11-30]
Level 5
 [EXP.5/16]
정말 다양한 방법이 있었네요.....
저는 테이블 내용에 있는 걸 올려야 하니까 .. 반복해서 insert / update
하는 줄 알았는뎁.. 정말 감사합니다.!
일단 Merge문 지원여부 부터 확인 해봐야겠네요!!
사용자
훈스남훈남조으다            [2018-11-30]
Level 39
 [EXP.76/80]
https://social.msdn.microsoft.com/Forums/en-US/1256c0c0-f836-4a5c-8772-c3001839d052/bulk-insert-in-ms-access?forum=adodotnetdataproviders

3000건이면 얼마 안되는 데이터양인데요
for안에서 매번 db커넥션을 맺는게 문제일꺼같은데요!!
로직을 다시 구성해보시는게 빠를꺼같네요
사용자
몬난아            [2018-12-03]
Level 71
 [EXP.180/250]
bulk시에는 기존데이터를 모두 지우고 insert하는 프로세스가 맞을것 같고
merge는 access db에서는 지원하지 않을것 같은데.. 아마도..
지원된다면 기본적으로 merge문이 맞습니다.

해당프로세스 같은경우 키값이 중요한지 중요하지 않은지를 판단해서
delete * from tbl 이후에 bulk insert가 가장 효율적이여 보입니다.
태그로 엮인글
[C#.NET Q&A] Form Size에 맞게 Font Size 증가시키기 도와 주세요.[1]  악마성
[C#.NET Q&A] access violation 오류 / *.map파일 만드는법 질문이요[1]+1 
[C#.NET Q&A] C# UI가 있는 dll 관련 질문 드려요[1]  Dragonite
[C#.NET Q&A] TCP사용도중 문제가 생겼습니다.. 도움을 주실분 계신가요? 파일첨부 Beoms
[C#.NET Q&A] Excel to DataTable 한글 문제 ㅠ 하루종일 시달리는중[4]  코토초
[C#.NET Q&A] C#질문 초보개발자입니다. 도움이 필요합니다.. 두개의 datatable 합치기..  Butters
[C#.NET Q&A] access db 날짜별 데이터 검색 질문드립니다.[2]+3  제스
[C#.NET Q&A] 최상위 폴더 내의 하위 폴더내의 파일 내용을 전부 읽고싶습니다  엘리엇
[C#.NET Q&A] DataTable internal index is corrupted: '5' 에러[1]  아이디뭐하지
[WPF Q&A] 크리스탈리포트이용하여 출력할시 가로출력이안되는현상[1]  꼬부기1
글리스트
c# PC <-> 시리얼포트 통신에 대해 질문드립니다.[2]+1  엘리엇
액세스에 만든 테이블에 넣은 값을 검색하고 싶은데 어떻게 하나요?[1]  호우
텍스트박스 소수점 표현은 어떻게 하나요??ㅠㅠ[1]+1  whwocnd
서버 컴퓨터로의 파일 전송... 방법[1]  수원프로그래머
winform 새 폼을 열 때 검은화면이 깜빡 거리고 사라지는 현상?[3]  Mr황
try catch를 씌워놨는데 왜 프로그램이 멈추나요?[1] 파일첨부 Tube
wpf 공부 방법??  Tube
ascx 에서 Oracle.ManagedDataAccess 사용 하기   Belbo
현재시간을 유닉스 시간으로 구하려면 ..[1]  엿장수
c# window form 질문있습니다.. ㅜㅜ[2]  연호랑
 ★현재글->   Datatable to Access db에 넣고 있는데 .3000개 정도 돌리는데 너무 오래걸려요.. [5]+2  악마성
[윈폼]폼과 일반스레드 분리  왕초보자
sql 접속시도시간 줄이는 방법 없나요??[2]+2  tokhi
숫자 합치려고 하는데   bemangroc
랜덤으로 저장된 배열값을 호출하는 방법이 궁금합니다.[1]+4  합금방패
윈폼 메일 발송관련[1]+1  비베씨샾
일정시간 컴퓨터에 마우스나 키보드 입력이 없으면 종료시키는 프로그램을 만들고싶은데요 고수님들 도와주세요ㅜㅜ[2]  초보적인실수
[C# WPF] 특정 프로세스의 메모리 사용률 질문입니다. 파일첨부 pixoneerr
디버그 모드와 릴리즈 모드의 차이??[3]+1  Tube
[c#, wpf] 메모리 누수(Memory Leak) 관련하여 질문드립니다.[2] 파일첨부 Tube
c# 코딩으로 우편번호 파일을 sqlite 테이블로 입력하려면[2]+1  엿장수