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
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
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
Local o As "cbNetCOM.cbSBCx"
o = Createobject("cbNetCOM.cbSBCx")
3-) Diger satirlari yorumlamaya devam edelim
Local lcSourceConn, lcTargetConn
satirindan anlasilacagi uzere kaynak VFP dosyalarimizin pathini ve
SqlServer Baglanti cumlemizi yaziyoruz.
4-) Daha sonra
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
x=Createobject("SBCEvents",o,0,.Null.)
Eventhandler(o,x)
o.DoBulkLoad()
satirlari ile kopyalama islemini baslatmis bulunuyoruz, ola la! eger hersey yolunda ise SbcEvents
? state, tablename, Message, m.percent
ile ekrana yazdirilan mesajlari gormeye basliyoruz
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 :
? 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
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;
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 ;
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
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
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ı
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