VFP 愛用者社區 首頁 VFP 愛用者社區
本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入

把資料夾中的所有DBF 表格上移到 MS SQL

 
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區
上一篇主題 :: 下一篇主題  
發表人 內容
syntech



註冊時間: 2003-05-16
文章: 4211
來自: Taipei,Taiwan

第 1 樓

發表發表於: 星期六 十月 17, 2020 10:45 pm    文章主題: 把資料夾中的所有DBF 表格上移到 MS SQL 引言回覆

在 SQL SERVER 2000 及 SQL SERVER 2012 測試,VFP 6 用 ,
如果改為其他版本,記得修改 AFIELDS[]的元素指標.
VFP 6 AFIELDS 是16 COLUMN,
VFP 9 AFIELDS 是18 COLUMN,
應該不含索引部分,需要請自行加入

取自:https://vdocuments.mx/building-a-visual-foxpro-application-for-sql-server.html
"BUILDING A VISUAL FOXPRO APPLICATION FOR SQL SERVER"

代碼:

* Purpose....: Creates a duplicate of each DBF
*            : from your data directory in SQL Server
*              and copies the DBF’s records to the SQL table.
*              The program puts brackets around named reserved words.
*  If you get an error indicating illegal use of a reserved word, add it here:

SET TALK OFF
CLEAR
CLOSE ALL
SET STRICTDATE TO 0
SET SAFETY OFF
SET EXCLUSIVE ON
SET DATE YMD
SET CENTURY ON
SET CONFIRM ON
CLOSE TABLE ALL
CLOSE DATABASE ALL
ConnStr = [Driver={SQL Server};Server=(local);UID=SA;PWD=;Database=MyDataBase;]  && 這裡要修改成你的情況
Handle = SQLSTRINGCONNECT( ConnStr )

IF Handle < 1
   MESSAGEBOX( '無法連接 SQL' + CHR(13) + ConnStr, 16 )
   RETURN
ENDIF

ReservedWords = [,DESC,DATE,RESERVED,PRINT,ID,VIEW,BY,DEFAULT,CURRENT,KEY,ORDER,CHECK,FROM,TO,]
DataPath = GETDIR("請選擇 DBF 所在資料夾?")
IF LASTKEY() = 27  && Escape was pressed
   RETURN
ENDIF
IF NOT EMPTY  ( DataPath )
   SET PATH TO &DataPath
ENDIF

ADIR( laDBFS, ( DataPath + [*.DBF] ) )
ASORT(laDBFS,1)
* Load each of the tables to SQL
FOR I = 1 TO ALEN(laDBFS,1)
   USE ( laDBFS(I,1))
   _VFP.Caption = "載入表格 " + ALIAS()
   LoadOneTable()
ENDFOR
SQLDISCONNECT(0)
CLOSE TABLE ALL
CLOSE DATABASE ALL
_VFP.Caption = [完成]

*   ===============================
PROCEDURE LoadOneTable
LOCAL I
cRecCount = TRANSFORM(RECCOUNT())
cmd  = [DROP TABLE ] +ALIAS()
SQLEXEC( Handle, Cmd )      
* Skip tables we don't want to load
IF ALIAS() $ [COREMETA/DBCXREG/SDTMETA/SDTUSER/FOXUSER/]
   * skip system tables, add yours here.
   ? [Skipping ] +ALIAS()
   RETURN
ENDIF
CreateTable(SYSNAME)      && see below
SCAN
   WAIT WINDOW [Loading record ] + TRANSFORM(RECNO()) + [/] + cRecCount NOWAIT
   Cmd  = [INSERT INTO ] + [ VALUES ( ]
   FOR I = 1 TO FCOUNT()
      fld  = FIELD(I)
      IF TYPE(Fld) = [G]
         LOOP
      ENDIF
      dta  = &Fld
      typ  = VARTYPE(dta)
      cdta = ALLTRIM(TRANSFORM(dta))
      cdta = CHRTRAN ( cdta, CHR(39),CHR(146) )   && remove any single quotes
      DO CASE
         CASE Typ $ [CM]
            Cmd = Cmd + ['] + cDta + ['] + [, ]
         CASE Typ $ [IN]
            Cmd = Cmd + cDta + [, ]
         CASE Typ = [D]
            IF cDta = [/  /]
               cDta = []
            ENDIF
            Cmd = Cmd + ['] + cDta + ['] + [, ]
         CASE Typ = [T]
            IF cDta = [/  /]   or  cDta = [/  /       :  :]
               cDta = []
            ENDIF
            Cmd = Cmd + ['] + cDta + ['] + [, ]
         CASE Typ = [L]
            Cmd = Cmd + IIF('F'$cdta,[0],[1]) + [, ]
         CASE Typ $ [Y]
            Cmd = Cmd
      ENDCASE
   ENDFOR
   Cmd = LEFT(Cmd,LEN(cmd)-2) + [ )]
   lr = SQLEXEC( Handle, Cmd )
   IF lr < 0
      ? [Error: ] + Cmd
      SUSPEND
   ENDIF
ENDSCAN
WAIT CLEAR

*=============================
PROCEDURE CreateTable
LOCAL J
Cmd = [CREATE TABLE ]  +ALIAS() + [ ( ]
AFIELDS(laFlds)
FOR J = 1 TO ALEN(laFlds,1)
   IF laFlds(J,2) = [G]
      LOOP
   ENDIF   
   FldName = laFlds(J,1)
   IF [,] + FldName + [,] $ ReservedWords
      FldName = "[" + FldName + "]"
   ENDIF
   Cmd = Cmd + FldName + [ ]
   DO CASE
      CASE laFlds(J,2) = [C]
         Cmd = Cmd + [Char(] + TRANSFORM(laFlds(J,3)) ;
            + [)  NOT NULL DEFAULT '', ]
      CASE laFlds(J,2) = [I]
         Cmd = Cmd + [Integer  NOT NULL DEFAULT 0, ]
      CASE laFlds(J,2) = [M]
         Cmd = Cmd + [Text     NOT NULL DEFAULT '', ]
      CASE laFlds(J,2) = [N]
         N = TRANSFORM(laFlds(J,3))
         D = TRANSFORM(laFlds(J,4))
         Cmd = Cmd + [Numeric(] + N + [,] + D + [)  NOT NULL DEFAULT 0, ]            
      CASE laFlds(J,2) $ [TD]
         Cmd = Cmd + [DateTime  NOT NULL DEFAULT '', ]
      CASE laFlds(J,2) = [L]
         Cmd = Cmd + [Bit  NOT NULL DEFAULT 0, ]
      ENDCASE
   ENDFOR
   Cmd = LEFT(Cmd,LEN(cmd)-2) + [ )]
   lr = SQLEXEC( Handle, Cmd )
   IF lr < 0
      _ClipText = Cmd
      ? [無法建立表格 ] + SYSNAME+'_'+ ALIAS()
      MESSAGEBOX( Cmd )
      SUSPEND
   ENDIF
   ? [新增表格 ] + ALIAS()
ENDPROC

_________________
如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問

請聯絡我們,也許我們幫得上忙
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 AIM Address
CPS0204



註冊時間: 2014-08-24
文章: 441


第 2 樓

發表發表於: 星期日 十月 18, 2020 2:38 pm    文章主題: 引言回覆

此將dbf上移sql程式我也開發過!
但遇到=sqlexec(HANDEL,STR1) ...........當中的STR1長度大於950字元時就會出問題,因為此命令不可大於約950字元
產品基本檔/客戶/廠商基本檔,最容易大於950個字元
回頂端
檢視會員個人資料 發送私人訊息
syntech



註冊時間: 2003-05-16
文章: 4211
來自: Taipei,Taiwan

第 3 樓

發表發表於: 星期日 十月 18, 2020 8:33 pm    文章主題: 引言回覆

就自己修改了.

前幾天我搜尋一下本站,
發現就沒有 M$ SQL的,
應該是大家都有自己的版本,
所以上網GOOGLE 一個基本版的


VFP 內建的是 "DBC上移精靈",
不是 "DBF上移精靈"

Very Happy Very Happy Very Happy

_________________
如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問

請聯絡我們,也許我們幫得上忙
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 AIM Address
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
無法 在這個版面附加檔案
無法 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作