1 Son düzenleyen, konuka (21.03.2009 13:39:51)

Konu: SQL --> dbf dbf --> SQL data taşıma

SQL datayı işteki serverden eve götürmek için notebooka alırken aşağıdaki kodları yazdım.
Mantığı temelde aynı table isimlerini kullanarak SQL datayı dbf'e ve de dbf datayı SQL'e yüklüyor.
Belki işe yarar diye paylaşıyorum. Kodlar ham, (bölümler ayrı ayrı da olmak üzere) çalışıyor, maksada uygun geliştirilebilinir.

Tabi ki Çetin'den 3-5 satırlık başkaca uzman çözümler gelmezse !  smile

Visual Fox Pro
*** handle alma ve dbf'leri saklayacağın alan belirleme

lnHserver=SQLSTRIGCONNECT('Driver={SQL Server Native Client 10.0}; Server=ML350\SQLEXPRESS; Database=nkt; uid=sa; pwd=xx')
 
lnHlokal=SQLSTRIGCONNECT('Driver={SQL Server Native Client 10.0};'+;
          'Server=KONUKPC\SQLEXPRESS;Database=nkt;Trusted_Connection=yes;' )
                                    && database i belirtmek iyi oluyor - bendeki nkt,
                                    && yanlışlıkla bütün SQLserverdeki database ile işlem yapılmasın
#DEFI DBF_SAKLAMA_YERI "c:\gecici\" && veya dilenen dizin \olmazsa kodda ADDBS() kullanılabilinir
IF ! DIRECTORY(DBF_SAKLAMA_YERI)
  MD(DBF_SAKLAMA_YERI)
ENDIF
 
*** kopyalama bölümü
* #DEFI DBF_SAKLAMA_YERI "
c:\gecici\"
SQLTABLES(m.lnHserver,'TABLE','curtable')
SCAN
  m.Xkomut="
select * from "+ALLTRIM(curtable.table_cat)+".."+ALLTRIM(curtable.table_name)
  m.Xdbf=DBF_SAKLAMA_YERI+ALLTRIM(table_name)+"
.dbf"
  WAIT WINDOW m.Xdbf NOWAIT NOCLEAR
  SQLEXEC(m.lnHserver,m.Xkomut,"
xcur")
  SELECT * FROM xcur INTO DBF (m.Xdbf)
  SELECT curtable
ENDSCAN
WAIT CLEAR
 
*** silme bölümü (lokalde eski datayı) primer indexler için iyi oluyor
SQLTABLES(m.lnHlokal,'TABLE','curtable')
BROWSE  && neler SİLİNECEĞİNİ gözden geçirme -esc ile devam
SCAN
    m.Xkomut="
delete from "+ALLTRIM(curtable.table_cat)+".."+ALLTRIM(curtable.table_name)
    m.Xdbf=DBF_SAKLAMA_YERI+ALLTRIM(table_name)+"
.dbf"
    IF FILE(m.Xdbf) AND 6=MESSAGEBOX(m.Xdbf,292,"
SQL dosyalar silinsin mi")
      IF 1>SQLEXEC(m.lnHlokal,m.Xkomut)
        DO hata
      ENDIF
    ENDI
    SELECT curtable
ENDSCAN
 
***SQL'e yazma bölümü
CLOSE DATABASES
SQLTABLES(m.lnHlokal,'TABLE','curtable')
BROWSE  && neler yazılacağını gözden geçirme -esc ile devam
 
SCAN
  m.Xdbf=DBF_SAKLAMA_YERI+ALLTRIM(table_name)+"
.dbf"
  IF FILE(m.Xdbf) AND 6=MESSAGEBOX(m.Xdbf,292,"
SQL dosyalar eklensin mi")
    SELECT 0
    USE (m.Xdbf) AGAIN  && ne olur ne olmaz
    m.Xkomut="
insert into "+ALLTRIM(curtable.table_cat)+".."+ALLTRIM(curtable.table_name)+" values (?arrayx[1]"
    FOR m.Xi=2 TO FCOUNT(JUSTSTEM(m.Xdbf))
      m.Xkomut=m.Xkomut+"
, ?arrayx["+ALLTRIM(STR(m.Xi))+"]"
    ENDF
    m.Xkomut=m.Xkomut+"
)"
    DIMENSION arrayx(FCOUNT(JUSTSTEM(m.Xdbf)))  && bunu yapmazsan bir sonraki fcount() küçükse hata oluşuyor
    SCAN
      SCATTER MEMO TO arrayx
      IF 1>SQLEXEC(m.lnHlokal,m.Xkomut)
        DO hata
        IF 6=MESSAGEBOX("
kayıt olmadı",292,"işlem sonlandırılsın?")
          RETURN
        ENDIF
      ENDIF
    ENDSCAN
  USE
  ENDIF
SELECT curtable
ENDSCAN
 
*** bitti
SQLDISCONNECT(0)
CLOSE DATABASES
 
*** hata
RETURN
PROCEDURE hata  && SQL komut hatalarını belirleme için  (UTden almıştım)
LOCAL Array aHata[1]
LOCAL ix,lcHata
Aerror(aHata)
lcHata = ''
FOR ix = 1 TO 7
  lcHata = m.lcHata + Transform(aHata[m.ix]) + Chr(13)
Endfor
Messagebox(m.lcHata)
RETURN
VFP9 SP2