国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

用C++產生QL*Loader各類文件

2019-11-17 05:29:57
字體:
來源:轉載
供稿:網友

  ----1.前言

----目前,我國許多單位MIS系統建立在微機PC或基于NovellNetWare局域網環境中,數據庫和開發工具采用FoXPRo2.5 for DOS或Foxpro 2.5 for Windows,以dbf文件為數據組織治理手段,隨著系統的不斷擴大和實際應用的需要,不少單位已開始采用大型數據庫Oracle。在MIS從Foxpro升級到大型數據庫Oracle過程中,將Foxpro的dbf文件通過Oracle工具SQL*Loader加載到Oracle數據庫中是一項非常重要的工作。一般用SQL*Loader加載的具體實施步驟是:

----* 運行Foxpro,打開數據庫,將dbf文件拷貝為SDF格式的文本文件

----* 根據dbf文件結構,產生建立Oracle表(CREATETABLE)的SQL語句

----* 登錄Oracle,運行產生Oracle表(CREATETABLE)的SQL語句

----* 根據dbf文件結構,產生SQL*Loader的控制文件

----* 運行SQL*Loader,加載數據

----用手工方法產生CREATETABLE的SQL語句,非凡是產生SQL*Loader控制文件時,POS99vION起始、結束位置經常弄錯,當需要加載大量的數據時,

不但煩瑣,而且效率比較低。我們在實踐中利用BorlandC++5.0編制了一個C++實用程序load.cpp,自動產生SQL*Loader的數據文件、控制文件和產

生CREATETABLE的SQL語句。運用load,我們只需:

----* load<數據庫名>

----* 登錄Oracle,運行產生Oracle表(CREATETABLE)的SQL語句

----* 運行SQL*Loader,加載數據

----在實踐中,我們通過這種方法,在實現從Foxpro到OracleforDigitalUNIX+中文Windows95的client/server平臺的數據加載過程中提高了效率。

----2.Foxpro中dbf文件結構

----dbf文件由文件頭和文件記錄組成,其中文件頭又由數據庫說明和字段說明組成。數據庫說明由32個字節組成,各字節含義如下:

字節    含義   
0      數據庫文件標志有無備注型字段(03H無)
1-3    最后一次修改日期
4-7    文件記錄數
8-9    文件頭長度
10-11  記錄長度
12-31  未用


----字段說明由若干個32字節組成,每32字節說明一個字段,各字節含義如下:

字節    含義
0-10    字段名
11      字段類型
12-15   該字段在文件首記錄中的地址
16      字段長度
17      小數位數
18-31   未用

----文件記錄以ASCII形式存儲,每條記錄以空格(20H)開頭,該空格用來作刪除標志用。

----三

----【注】:

----* 不考慮完整性約束,同時對于TABLESPACE及STORAGE存儲參數取缺省值。

----* 對于數字型字段,n表示數字的寬度,在Foxpro中包含小數點位置,而在Oracle中不包含。

----* 對于Foxprological型字段類型,由于Oracle中沒有相應的邏輯型變量,故將其轉換為字符類型。

----* 暫且不考慮memo、general、picture字段的轉換。

----4.SQL*Loader控制文件的建立

----控制文件為SQL*Loader的核心文件,與Foxpro字段對應關系為表四:Foxpro數據類型

----控制文件語句對應的格式

Character(n)
CHAR
Number(n,m)
Float(n,m)
DECIMAL EXTERNAL NULLIF < field > = BLANKS  (m< >0)


INTEGER EXTERNAL NULLIF < field > = BLANKS   ( m=0)
Logical
CHAR
DATE
DATE  "YYYYMMDD"  NULLIF < field > = BLANKS

---- 四

---- 以 下 是 用Borland C++ 5.0 在 中 文Windows 95 下 編 制 的 產 生CREATE TABLE SQL 語 句 和 產 生SQL*Loader 數 據 文 件、 控 制

文 件 的 源 程 序load.cpp。

#include < stdio.h >
#include < stdlib.h >
#include < iostream.h >
#include < fstream.h >
#include < string.h >
#include < math.h >
#define MAX_ROW_LENGTH 1200
#define MAX_FIELD_NUMBER 30
typedef strUCt head         // dbf頭文件結構
{ unsigned char mask ;
  unsigned char date[3] ;
  unsigned long record_num;
  unsigned short int head_length;
  unsigned short int field_length ;
} HEAD ;

typedef struct field         // dbf字段結構
{ unsigned char name[11];
  unsigned char type ;
  unsigned long  add;
  unsigned char length;
  unsigned char dec ;
} FIELD ;

int main(int argc,char **argv)
{ char buf[MAX_ROW_LENGTH],dbf[40],*sqlload;
  unsigned int i,field_num;
  HEAD  *dbfhead ;
  FIELD dbffield[MAX_FIELD_NUMBER];
  FILE *fout, *fp;

  if (argc!=2)
  { cout < < "Usage : load dbfile" < < endl ;
    return -1;
  }

  sqlload = new char(40);
  dbfhead = new HEAD;
  strcpy(buf,"");

  strcpy(dbf,argv[1]);
  strcat(dbf,".dbf");
  if ((fp=fopen(dbf,"rb")) == NULL)
  { cout < < "Cannot open file " < < dbf < < endl;
    return -1 ;
  }
  fseek(fp,0,SEEK_SET);
  fread(dbfhead,sizeof(HEAD),1,fp);     // 讀dbf頭文件信息

  field_num = (dbfhead- >head_length-1)/32 -1 ;      //字段個數

  for( i=0; i< field_num; i++)
  { fseek(fp,32*(i+1),SEEK_SET);
    fread(&dbffield[i],sizeof(FIELD),1,fp);  // 讀dbf結構信息
  }
// 產 生SQL*Loader 控 制 文 件

  strcpy(sqlload,argv[1]);
  strcat(sqlload,".ctl");
  if ((fout=fopen(sqlload,"w")) == NULL)
  { cout < < "Cannot open file " < < sqlload < < endl;
    return -1 ;
  }
  fprintf(fout,"LOAD DATA/n");
  fprintf(fout,"INFILE '%s.txt'/n", argv[1]);
  fprintf(fout,"INTO TABLE %s (/n", argv[1]);

  for(i=0;i< field_num;++i)
  { fprintf(fout, "%11s  POS99vION(%d:%d)", dbffield[i].name,
   dbffield[i].add, dbffield[i].add + dbffield[i].length -1 );
    switch (dbffield[i].type)
    { case 'C':
      case 'L':                            // 字符型/ 邏輯型
        fprintf(fout, "  CHAR");
        break ;
      case 'N':
        if (dbffield[i].dec == 0 )         //整數型
          fprintf(fout, "INTEGER EXTERNAL NULLIF %s = BLANKS",
            dbffield[i].name);
        else                       &

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 高平市| 丰原市| 瑞昌市| 四川省| 井研县| 丹棱县| 庐江县| 沙雅县| 达孜县| 临西县| 北安市| 广德县| 永嘉县| 鹤岗市| 奉节县| 襄樊市| 右玉县| 江口县| 闸北区| 井陉县| 万宁市| 清流县| 九龙城区| 喜德县| 特克斯县| 永胜县| 周至县| 铁岭市| 松滋市| 塘沽区| 洛阳市| 松潘县| 福海县| 静乐县| 祁连县| 玛沁县| 平顺县| 武义县| 邳州市| 丹棱县| 来安县|