1

Konu: SQLBulkCopy Yeni Versiyon

Merhaba arkadaslar ;
daha once kullananlar bilir Cetin Ustad'in  SbcOle.dll i ile VFP tarafindan SQL Server'a toplu olarak kayit aktarabiliyorduk.
Gecenlerde sozkonusu DLL bende calismayinca konuyu tartistik , hatanin bir kisminin VFP SP2 den kaynaklandigini (bug) gorduk daha sonra source kodlarda yapmis oldugu kucuk bir degisiklik ile SP2 ilede calisir duruma getirdik ama hazir eselemisken akla gelen bazi ek ozellikler ile daha kullanisli hale nasil getirilir derken bugunku anlatacagim versiyon cikti.

oncelikle paylasimi ve emegi icin ustada cok tesekkur...banada anlatmak ve dagitmak kaldi smile

bu arada daha adi SbcOle.Dll olan dosyamizin adi artik SbcHelper.Dll ve bu Dll i oncelikle makinamizda register etmemiz gerekiyor
bunun icin oncelikle SbcHelper.Dll , SbcHelper.Tlb,SbcHelper.Pdb,Messages.XML ve diger XML (SbcHelper.Zip icinde) dosyalarini proje klasorumuz roota yada bir alt klasore kopyalamamiz isimiz kolaylastiracak

-DOS Command prompta cikip
cd "C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319"

uygulamamizin ve ilgili dosyalarin D:\SqlBulkCopyTest gibi bir klasorde oldugunu farzedersek komut satirimiz asagidaki olacaktir.

C:\Windows\Microsoft.NET\Framework\v4.0.30319>regasm "D:\SqlBulkCopyTest\SbcHelper.dll" /codebase

Successfully Registered mesajini aldigimizda artik kullanima gecebiliriz.

NOT : /codebase e ek olarak /s eklersek ekrana mesaj vermeden bu islemi yapmis oluruz . Eger VFP uzerinden bu dll in register edilip edilmedigi,var olup olmadigi ve register edilmesi gerektigi durumlarda /s kullanirsak kullaniciya hissettirmeden bu kayit islemini yapabiliriz.

Not : SbcOle.dll icin >= v2.0 yeterli idi

Simdi gelelim nasil kullanacagimiza ;

1-) asagida WithXML() ve WithOutXML() ile 2 ornek var benim ve ustadin onerisi WithOutXML() kullanilmasi diger yol kaafanizi biraz karistirabilir

2-) Daha once kullananlar yada ornek kodlara bakanlar bilir

Visual Fox Pro
Local o As "cbNetCOM.cbSBC"

    o = Createobject("cbNetCOM.cbSBC")


satirlarimiz vardi simdi burada ufak bir degisiklil var cbSBC sonuna X geldi ve asagidaki gibi oldu

Visual Fox Pro
Local o As "cbNetCOM.cbSBCx"

    o = Createobject("cbNetCOM.cbSBCx")

3-) Diger satirlari yorumlamaya devam edelim

Visual Fox Pro
Local lcSourceConn, lcTargetConn

satirindan anlasilacagi uzere kaynak VFP dosyalarimizin pathini ve
SqlServer Baglanti cumlemizi yaziyoruz.

4-) Daha sonra

Visual Fox Pro
o.AddBulkInfo( m.lcSourceConn, m.lcTargetConn,'Orders','Orders')


ile kaynak dosya adi 'Orders' olan tablomuzun kayitlarini karsidaki 'Orders' tablosuna gidecegini belirtiyoruz
NOT : Sadece tablo adlari verirsek tum kolonlar kopyalanir asagidai ornek gorecegiz istersek belirli kolonlara ait bilgileride yollayabiliriz

5-) Ve son olarak

Visual Fox Pro
x=Createobject("SBCEvents",o,0,.Null.)

    Eventhandler(o,x)
 
    o.DoBulkLoad()


satirlari ile kopyalama islemini baslatmis bulunuyoruz, ola la! eger hersey yolunda ise SbcEvents

Visual Fox Pro
? state, tablename, Message, m.percent

ile ekrana yazdirilan mesajlari gormeye basliyoruz

Visual Fox Pro
STATE TABLENAME            MESSAGE                            SECONDS

    1 Orders               Rows to copy 832                    0.0200
    1 Orders               Reading from source...              0.0210
    1 Orders               Read 0 - 832 from source...         0.0230
    2 Orders               Writing to server...                0.0230
    4 Orders               Bulk loading completed.             0.0700
    1 Customers            Rows to copy 94                     0.0740
    1 OrderDetails         Rows to copy 2156                   0.0740
    1 Customers            Reading from source...              0.0740
    1 OrderDetails         Reading from source...              0.0750
    1 Customers            Read 0 - 94 from source...          0.0770
    1 OrderDetails         Read 0 - 2156 from source...        0.0780
    2 Customers            Writing to server...                0.0780
    2 OrderDetails         Writing to server...                0.0780
    4 Customers            Bulk loading completed.             0.0850
    3 OrderDetails         Copied 1000 rows                    0.0920
    3 OrderDetails         Copied 2000 rows                    0.1090
    4 OrderDetails         Bulk loading completed.             0.1170
    6                      Upload of all tables are completed. 0.1190

NOT : Define Class SBCEvents As Session OlePublic satiri altindaki

IMPLEMENTS IcbSBCEvents IN "C:\USERS\CETIN\DOCUMENTS\VISUAL STUDIO 2010\PROJECTS\SBCHELPER\SBCHELPER\BIN\RELEASE\SBCHELPER.TLB"

satiri kendimize uygun hale getiriyoruz

IMPLEMENTS IcbSBCEvents IN "D:\SqlBulkCopyTest\SBCHELPER.TLB"

NOT :

Visual Fox Pro
? state, tablename, Message, m.percent


kisminda wait wind nowait yada kendi progressbar vs kodunuzu da kullanabilirsiniz

6-) Diger o.AddBulkInfo( ... ile baslayan satirlar ne is yapar birazda ondan bahsedelim

Visual Fox Pro
o.AddBulkInfo( 'Provider=VFPOLEDB;Data Source='+ _samples +'data\testdata.dbc', m.lcTargetConn,;

        'Customer','Customers',;
        'Cust_Id,Company,Contact,Country',;
        'CustomerID,CompanyName,ContactName,country')


burada Source direkt burda tanimlaniyor Target ayni ve 'Customer' tablosunun kayitlari 'Customers' tablosuna
Cust_ID -> CustomerID , Company -> CompanyName , Contact->ContactName ve Country->country alanlarina eslenerel gonderiliyor


diger bir ornek;

Visual Fox Pro
o.AddBulkInfo( 'Provider=VFPOLEDB;Data Source=d:\temp\SampleTextFiles', ;

        m.lcTargetConn, ;
        'compDoubled', 'PersonData',;
        "Category,Activity,PersonId,FirstName,MidName,LastName,Email",;
        "Category,Activity,PersonId,FirstName,MidName,LastName,Email")


burada da yukaridakine benzer bir ornek 'compDoubled' tablosunun kayitlari 'PersonData' tablosuna kopyalaniyor
NOT : Bu tip yani sadece belirli kolon kopyalamalarinda target ta  yani sql serverdaki tabloda ilgili kolonlarin NULL kabul ediyor olmasi gerekiyor DLL kabul edip etmedigine bakmiyor

ve son ornek ;

Visual Fox Pro
o.AddBulkInfo( 'Provider=VFPOLEDB;Data Source=d:\temp\SampleTextFiles', ;

        m.lcTargetConn, ;
        'compDoubled2', 'PersonData2',;
        "Category,Activity,PersonId,FirstName,MidName,LastName,Email,rcno",;
        "Category,Activity,PersonId,FirstName,MidName,LastName,Email,recno",;
        10000, 100000, 10000, 0)


burada yine isimleri farkli 2 tablo arasinda ki kopyalama islemi ve ayrica son rcno ve recno field lari da farkli dikkat ederseniz farkli.
Ayrica AddBulkInfo nun diger parametreleri kullanilmis yani default degerler kullanilmiyor

Bu kadar anlattiktan sonra dosyalarin indirme linkinide verelim smile

Gerekli Dosyalar https://dl.dropbox.com/u/15538129/SQLBulkCopy_New.rar

1.500.00 kayitli ornek tablo https://dl.dropbox.com/u/15538129/CompDoubled.zip ve ona ait SQL Server de Tablo yaratma scripti

Gorsel Video : http://screencast.com/t/g4uTnyuws

SQL
CREATE TABLE PersonData 

  (
    [Id] int identity PRIMARY KEY,
    [Category] varchar(50),
    [Activity] varchar(50) DEFAULT 'NullOlmasin',
    [PersonId] varchar(50),
    [FirstName] varchar(50),
    [MidName] varchar(50),
    [LastName] varchar(50),
    [email] varchar(50)
  )

umarim anlasilir bir anlatim olmustur,gule gule kullanin....

Ornek SbcTest.prg Kodları

Visual Fox Pro
Set Safety Off

Clear All
Create Table progressInfo (state i, tablename c(20), Message c(100), Percent n(6,2), Seconds Y)
Use
 
Clear
WithOutXML()
*WithXML()
 
Procedure WithOutXML
    Local o As "cbNetCOM.cbSBCx"
    o = Createobject("cbNetCOM.cbSBCx")
 
    ** Set up parameters
    Local lcSourceConn, lcTargetConn
    lcSourceConn = 'Provider=VFPOLEDB;Data Source='+ _samples +'Northwind\Northwind.dbc'
    lcTargetConn = 'server=.\sqlexpress;Trusted_connection=yes;Database=NWTest'
 
    o.AddBulkInfo( m.lcSourceConn, m.lcTargetConn,'Orders','Orders')
    o.AddBulkInfo( m.lcSourceConn, m.lcTargetConn,'OrderDetails','OrderDetails')
    o.AddBulkInfo( 'Provider=VFPOLEDB;Data Source='+ _samples +'data\testdata.dbc', m.lcTargetConn,;
        'Customer','Customers',;
        'Cust_Id,Company,Contact,Country',;
        'CustomerID,CompanyName,ContactName,country')
    o.AddBulkInfo( 'Provider=VFPOLEDB;Data Source=d:\temp\SampleTextFiles', ;
        m.lcTargetConn, ;
        'compDoubled', 'PersonData',;
        "Category,Activity,PersonId,FirstName,MidName,LastName,Email",;
        "Category,Activity,PersonId,FirstName,MidName,LastName,Email")
    o.AddBulkInfo( 'Provider=VFPOLEDB;Data Source=d:\temp\SampleTextFiles', ;
        m.lcTargetConn, ;
        'compDoubled2', 'PersonData2',;
        "Category,Activity,PersonId,FirstName,MidName,LastName,Email,rcno",;
        "Category,Activity,PersonId,FirstName,MidName,LastName,Email,recno",;
        10000, 100000, 10000, 0)
 
    x=Createobject("SBCEvents",o,0,.Null.)
    Eventhandler(o,x)
 
    o.DoBulkLoad()
Endproc
 
Procedure WithXML
    Local o As "cbNetCOM.cbSBCx"
    o = Createobject("cbNetCOM.cbSBCx")
 
    x=Createobject("SBCEvents",o,0,.Null.)
    Eventhandler(o,x)
 
    Local lcXML
    lcXML = GetTableList()
    o.DoBulkLoad_2(m.lcXML)
Endproc
 
Procedure GetTableList
    Local lcSourceConn, lcTargetConn
    lcSourceConn = 'Provider=VFPOLEDB;Data Source='+ _samples +'Northwind\Northwind.dbc'
    lcTargetConn = 'server=.\sqlexpress;Trusted_connection=yes;Database=NWTest'
 
    Create Cursor bi (sourceCon m, targetCon m, ;
        sourceTable m, targetTable m, ;
        sourceColumns m, targetColumns m, ;
        odometer i, readatonce i,batchsize i,bulkcopytimeout i)
 
 
    Insert Into bi ;
        (sourceCon, targetCon, sourceTable, targetTable, sourceColumns, targetColumns,Odometer, readatonce, batchsize, bulkcopytimeout) ;
        values (;
        m.lcSourceConn, m.lcTargetConn,'Orders','Orders','','',1000,10000,500,0)
 
    Insert Into bi ;
        (sourceCon, targetCon, sourceTable, targetTable, sourceColumns, targetColumns,Odometer, readatonce, batchsize, bulkcopytimeout) ;
        values (;
        m.lcSourceConn, m.lcTargetConn,'OrderDetails','OrderDetails','','',1000,10000,500,0)
 
    Insert Into bi ;
        (sourceCon, targetCon, sourceTable, targetTable, sourceColumns, targetColumns,Odometer, readatonce, batchsize, bulkcopytimeout) ;
        values (;
        m.lcSourceConn, m.lcTargetConn,'Customers','Customers','','', 1000,10000,500,0)
 
    Cursortoxml('bi','cXML',2,0,0,'1')
    Use In (Select('bi'))
 
    Return m.cXML
Endproc
 
 
Define Class SBCEvents As Session OlePublic
    IMPLEMENTS IcbSBCEvents IN "C:\USERS\CETIN\DOCUMENTS\VISUAL STUDIO 2010\PROJECTS\SBCHELPER\SBCHELPER\BIN\RELEASE\SBCHELPER.TLB"
 
 
    oHook = Null
    tStart = 0
    BulkMode = 0
    pBar = Null
    Start = 0
 
    Procedure Init(loHook,nMode,oBar)
        This.oHook  = loHook
        This.tStart = Seconds()
        This.BulkMode = m.nMode
        This.pBar = oBar
        This.Start = Seconds()
    Endproc
 
    PROCEDURE IcbSBCEvents_Feedbackprogress(state AS VARIANT, tableName AS STRING, message AS STRING, percent AS Number) AS VOID
        ? state, tablename, Message, m.percent
        Seconds = Seconds()-This.Start
        Insert Into progressInfo From Memvar
        If (m.state = 6)
            Eventhandler(This.oHook,This,.T.)
            This.oHook = Null
            Select * From progressInfo
        Endif
    Endproc
Enddefine

2

Re: SQLBulkCopy Yeni Versiyon

BulkCopy kullanan sanırım ilk kişiyim forumda. 2 yıl önce Çetin sağolsun geliştirip projeme kattığım bu yapının şimdi daha gelişmiş olmasından dolayı öncelikle Çetin'e sonra da, Soykan güzel anlatımından dolayı sana teşekkürü bir borç bilirim.

Yeni SbcHelper hoşgeldin.

3

Re: SQLBulkCopy Yeni Versiyon

Güle güle kullananalım...Benimki küçük bir katkı...Yildizlar ustada smile

4 Son düzenleyen, ugurlu2001 (22.11.2012 14:42:34)

Re: SQLBulkCopy Yeni Versiyon

DLL dosyalarını arşivimize nereden ekliyoruz? smile

Pardon ! şimdi gördüm smile

Uğur
-------------------------------------------------------------------------------------------------------------
Hayat bir bisiklete binmek gibidir. Pedalı çevirmeye devam ettiğiniz sürece düşmezsiniz. Claude Peppeer
Kusuru söylenmeyen adam, ayıbını hüner sanır.  Türk Atasözü

5

Re: SQLBulkCopy Yeni Versiyon

Gule gule kullanin:)

Soykan cok uzun yazmis, o kadar sey okuyup takip etmek zor gelir insane:)

1) Once register etmek gerekiyor. DOS Command penceresinde veya Run komutunda:

regasm SbcHelper.dll /codebase


Bunu kolay yapmak icin DOS'a cikin. SbcHelper'i "c:\SbcHelper" dizinine koydugunuzu farzedersek boyle yazin:

"C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe" "c:\SbcHelper\SbcHelper.Dll" /codebase

[enter]a basin.

VFP icinden de:

run "C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe" "c:\SbcHelper\SbcHelper.Dll" /codebase

olur sanirim (hic yapmak aklima gelmedi).

6 Son düzenleyen, ugurlu2001 (22.11.2012 15:49:56)

Re: SQLBulkCopy Yeni Versiyon

Üstat ellerine sağlık. Yine farkını ortaya koymuşsun smile

İyiki varsın ...

Soykan abi, dökümantasyon ve örnek için çok teşekkürler. Hazır araçları birleştirmek ve kullanmak konusunda seni tek geçiyorum smile

Uğur
-------------------------------------------------------------------------------------------------------------
Hayat bir bisiklete binmek gibidir. Pedalı çevirmeye devam ettiğiniz sürece düşmezsiniz. Claude Peppeer
Kusuru söylenmeyen adam, ayıbını hüner sanır.  Türk Atasözü

7

Re: SQLBulkCopy Yeni Versiyon

Ya unutmadan, mesajlar duzenlenebilir durumda. Messages.xml dosyasinda duzenleyebilirsiniz.

8 Son düzenleyen, sasmazali (23.11.2012 10:21:52)

Re: SQLBulkCopy Yeni Versiyon

Çetin Hocam eline sağlık. İlk fırsatta kullanacağım. 170 bin kişilik bir sınav analizlerinde oluşan devasa verileri aktarmak için çok işime yarayacak.

Soykan Hocam sanada teşekkürler. Detaylı kullanım açıklaman çok güzel.
Yapanın da yayınlayanın da eline sağlık.

Bu aralar C# ile uğraşmaktayım ama mantığı o kadar zor geliyor ki alışmak mesele. C# ile ilgi sorularımı da inşallah sizlerden yardım için paylaşacağım.

Kolay gelsin.

9

Re: SQLBulkCopy Yeni Versiyon

cihan1963 yazdı:

Verdiğiniz cevap için çok teşekkürler çok yardımcı oldunuz.

Ya Cihan emege saygisizlik ancak bu kadar olur sad insan once bir tesekkur eder adam o kadar ugrasmis bize sunmus bu tip bir toolu , ucretli de aramak durumunda kalinabilirdi. Ama sen elinden misketleri alinmis cocuk gibi sitem ediyorsun hatta kiziyorsundur bile.

Ancak bu noktaya gelene kadar insan

yeni bir pcde dener xp yada win7 de
vfp9 ile dener sp1 ile dener sp2 ile dener
(bu isi durtene kadar ben 3 ayri makinada denedim ondan sonra "ya ustad denemedigim kalmadi ancak olmuyor" diye sordum tek atladigim sp2 olmasi imis sonra source lara girdik vs ama cozebilmek icin bastan cabaladim )

ondan sonrada bunlari bunlari yaptim ama olmuyor diye sorar.

Ama sen direkt sitem ediyorsun , armut piş ağzıma düş hemen sorunun hallolsun istiyorsun .
Boyle cikislar yaparsan yardimci olacak kisi(lerin)ninde istegini kirarsin...

Dostca soylemesi.

10 Son düzenleyen, cetinbasoz (23.11.2012 17:18:58)

Re: SQLBulkCopy Yeni Versiyon

Hislerime tercuman olmussun. Ne var ki ben yine de bugun bir bakayim diye MSN'de aradim, sansina cevrim disiydi kaldi:) Hmm su anda cevrim ici bir bakalim olacak mi.
Hallettik. (aslında birsey de yapmadık. Calısıyordu).

11

Re: SQLBulkCopy Yeni Versiyon

cihan1963 yazdı:

Hoca Teşekkür ederim evet  çalıştı şimdi uyarlıyacağım Soykan buarada sanada teşekkür ederim haklı oldugun yerler var.

** sana birazdan buna karşı birşeyler karalayacagım

ben bu konuda 100% hakliyim kabahatini hafifletmeye calisma smile

12

Re: SQLBulkCopy Yeni Versiyon

cihan1963 yazdı:

Hoca Teşekkür ederim evet  çalıştı şimdi uyarlıyacağım Soykan buarada sanada teşekkür ederim haklı oldugun yerler var.

** sana birazdan buna karşı birşeyler karalayacagım


Hala karalama bekliyorum!