Merhabalar:) Birden fazla yolu var. Hangi yolun secilecegi bir kac faktore bagli:
a) SQL server versiyonu 2008' mi yoksa daha oncesi mi? SQL 2008'de tek bir insert ile bircok kayit insert edilebiliyor:
Visual Fox Pro
local array laData[1]
select f1,f2,f3 from myTable into array laData
if _Tally > 0
local row,lcSQL
set textmerge to memvar lcSQL noshow
set textmerge on
\\ insert into [xx]..[sqldosya] (sqlbir,sqliki,sqlüç) values
for row = 1 to alen(laData,1)
\ ( ?laData[<< m.row >>, 1], ?laData[<< m.row >>, 2], ?laData[<< m.row >>, 3] )
if m.row < alen(laData, 1)
\\,
endif
endfor
set textmerge to
set textmerge off
m.lnh=SQLSTRINGCONNECT("Driver={SQL Server Native Client 10.0};server=.\sql2008;Trusted_Connection=yes;Database=test")
SQLExec(m.lnh, m.lcSQL)
SQLDISCONNECT(0)
endif
(eger .Net kullaniyor olsaydik bunun yerine dogrudan bir 'table'i parametre olarak gonderebiliyorduk:( VFP ile yapilabilir mi cok derinlemesine bakmadim).
Bu, kayit sayisi cok fazla degilse, tek seferde insert etmek icin kullanilabilecek bir yontem (SQL 2008).
2) SQL versiyonu ne olursa olsun kayit sayisi az mi cok mu. Az ise:
Visual Fox Pro
Local Array laData[1]
Select f1,f2,f3 From (_samples+'data\customer') Into Array laData
If _Tally > 0
Local Row,lcSQL
Set Textmerge To Memvar lcSQL Noshow
Set Textmerge On
For Row = 1 To Alen(laData,1)
\ insert into [xx]..[sqldosya] (sqlbir,sqliki,sqlüç) values
\\ ( ?laData[<< m.row >>, 1], ?laData[<< m.row >>, 2], ?laData[<< m.row >>, 3] );
Endfor
Set Textmerge To
Set Textmerge Off
m.lnh=Sqlstringconnect("Driver={SQL Native Client};server=.\sql2008;Trusted_Connection=yes;Database=test")
SQLExec(m.lnh, m.lcSQL)
SQLDisconnect(0)
Endif
Bir baska yontem (bir kez compile + N kez insert ):
Visual Fox Pro
LOCAL lcSQL
lcSQL = 'INSERT INTO [xx]..[sqldosya] (sqlbir,sqliki,sqlüç) VALUES (?m.bir,?m.iki,?m.üç)'
m.lnh=SQLSTRINGCONNECT("Driver={SQL Server Native Client 10.0};server=.\sql2008;Trusted_Connection=yes;Database=test")
SQLPrepare(m.lnh, m.lcSQL) && Compile
SCAN && 4 kere SQLSERVER'e bilgi gidiyor
SCATTER MEMVAR
SQLExec(m.lnH) && compile edilmis kodu kullan
ENDS
SQLDISCONNECT(0)
Bu yontemler az kayitla efektif calisiyor. Diger bir yontem CursorAdapter kullanmak. CursorAdapter'in BatchUpdateCount propertysi var . 100 dersen (benim denemelerimde cok buyuk kurmanin bir faydasi olmuyor, bir yerden sonra ayni, 100 ortalama iyi bir deger gibi) tek seferde o 100 gondererek update ediyor (select ... where 1=2 ile baslarsan hepsi Insert olacak).
Parametre giden yontemlerde 3 field icin pratikte 700 kayit sinirin var (SQL server maximum parametre sayisi 2100 eger yanlis hatirlamiyorsam).
3) Eger kayit sayisi cok ise:
a) http://www.fox4um.com/topic/1214/sqlbulkcopy/
benim bugune kadar bulabildigim en efektif yontem. Gerekirse dll'i filan hazir gonderirim:)
b) VFP datasini text dosyasina copy to ile transfer edip SQL server'dan 'Bulk Copy' ile okumak (SQL server text dosyasina ulasabilmeli)
c) SQL server'da once bir linked server olusturmak (kodla olabilir - SQL server'a erisim haklarina bagli). Sonra da istenilen VFP dosyasindan query yapmak. Soyle birsey:
Visual Fox Pro
TEXT TO lcLinkedYarat noshow
EXEC sp_addlinkedserver
@server = N'VFP_SERVER', -- linked server adi
@srvproduct=N'Visual FoxPro 9', -- ne istersen olabilir
@provider=N'VFPOLEDB',
@datasrc=N'"C:\PROGRAM FILES\MICROSOFT VISUAL FOXPRO 9\Samples\data\testdata.dbc"'
ENDTEXT
* Bir kez yapmak gerekiyor
SQLEXEC(m.lnh, m.lcLinkedYarat)
VFP'den kodla yapmak yerine SQL server management kullansak da olurdu. Bir kez yapildi mi artik VF_SERVER diye VFP datasina ulasan bir kaynak var (northwind benzeri dataya insert - VFP"den select, SQL'e insert):
Visual Fox Pro
TEXT TO lcSQL noshow
insert mySQLTable (orderId, orderDate,shippedTo)
Select * From openquery(VFP_SERVER,
'Select
order_ID,
Cast(Evl(order_date,Null) As DateTime) As order_Date,
TRIM(to_Name)
from customer')
ENDTEXT
SQLEXEC(m.lnh, m.lcSQL)
Not: Burada OpenQuery() icindeki SQL VFP'nin anlayacagi SQL, VFP tablosuna yapiliyor. Sadece basta ve sonda tirnak isareti var, gerisi normal ; kullanilmadan yazilabiliyor.
d) XmlBulkCopy, SQL Server'in For XML gibi baska yontemlerde var ama bana hem yavas geldi hem de ben beceremedim cok karmasik, birinde calisiyor digerinde calismiyor, yazmasi da cok zor geldi: