to: zjcxc(邹建) 補充說明一下,這個導出不是做了一次就完了,以後不時還會用到,比如我公司某操作員阿蘭在舊的dos程序中錄入客戶訂單: cpo.dbf, 而阿純在新系統中錄入生產工程單,生產工程單需要調用客戶訂單的數據,因此每天都要從cpo.dbf中導入新的資料添加到新系統中的sqlserver表cpo中.dos的数据,可以先转换成文本文件,不過需要額外做個轉換小程序,如用vfp等, 似乎有點麻煩.SQL的导入/导出向导本身就可以直接從clipper表導入,但也需要作額外的人工干預,而且是新產生一個表,而不是添加到一個存在的表中. 我是想可不可以在delphi中用ado控件adocommand通過sql命令如此之類的方式來實現,將那些步驟寫入到程序中,這樣導入資料的工作就交給了操作員自己來做了,既省心又方便.
.dbf 可以直接导入到SQL SERVER
用dbf数据库,那就可以直接导了,自己写语句导也可以.
--不知道你的dbf是那一种--/* dBase IV文件 select * from OPENROWSET('MICROSOFT.JET.OLEDB.4.0' ,'dBase IV;DATABASE=C:\' --c:\是目录 ,'select * from [客户资料4.dbf]') --客户资料4.dbf是文件名 --*/--/* dBase III文件 select * from OPENROWSET('MICROSOFT.JET.OLEDB.4.0' ,'dBase III;DATABASE=C:\' ,'select * from [客户资料3.dbf]') --*/--/* FoxPro 数据库 select * from openrowset('MSDASQL', 'Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\', --c:\是目录 'select * from [aa.DBF]') --aa.dbf是文件名/*--说明:SourceDB=c:\ c:\是dbf文件的存放目录 [aa.DBF] 是dbf文件名 --*/
clipper针对dBASE各版本推出的关系数据库管理系统,不知道你是使用dBASE的哪个版本. 1.如果是dBase IV 登录sqlserver的查询分析器,执行下面的代码(以c:\cpo.dbf为例): select * from OPENROWSET('MICROSOFT.JET.OLEDB.4.0' ,'dBase IV;HDR=NO;IMEX=2;DATABASE=C:\' ,'select * from cpo.dbf') 2.如果是dBase III 登录sqlserver的查询分析器,执行下面的代码(以c:\cpo.dbf为例): select * from OPENROWSET('MICROSOFT.JET.OLEDB.4.0' ,'dBase III;HDR=NO;IMEX=2;DATABASE=C:\' ,'select * from cpo.dbf')
樓上兩位一定要救救我了:我的dbf肯定不是vfp的表,我分別用了dBase III,dBase IV的驅動方式,都出錯如下:select * from OPENROWSET('MICROSOFT.JET.OLEDB.4.0','dBase III;DATABASE=C:\','select * from cpo.dbf')伺服器: 訊息 7357,層級 16,狀態 2,行 1 Could not process object 'select * from cpo.dbf'. The OLE DB provider 'MICROSOFT.JET.OLEDB.4.0' indicates that the object has no columns.select * from OPENROWSET('MICROSOFT.JET.OLEDB.4.0','dBase IV; DATABASE=C:\','select * from cpo.dbf')伺服器: 訊息 7357,層級 16,狀態 2,行 1 Could not process object 'select * from cpo.dbf'. The OLE DB provider 'MICROSOFT.JET.OLEDB.4.0' indicates that the object has no columns.我用了 laughsmile(海边的星空) 的方法加了HDR=NO;IMEX=2也是一樣.我抱著試試看的心態,也用了VFP的驅動方式: select * from openrowset('MSDASQL','Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\', 'select * from CPO.DBF')伺服器: 訊息 7399,層級 16,狀態 1,行 1 OLE DB provider 'MSDASQL' reported an error. The provider did not give any information about the error.
to: zjcxc(邹建) : 我看了csdn上的資料,從你給另一個帖子的回覆上知道: 被查詢的表在sql上需要是sqlserver機器上的表,而不是本地表,所以我改了一下路徑,是可以查詢了,但出現了如下錯誤; select * from OPENROWSET('MICROSOFT.JET.OLEDB.4.0','dBase IV;DATABASE=f:\program\hgq\tmpcpo\','select * from cpo.dbf order by inter')伺服器: 訊息 8114,層級 16,狀態 9,行 1 Error converting data type DBTYPE_DATE to datetime. 我查了一下原表,是操作員在錄入日期時,將2000/01/31錄入成了0200/01/31,這已經超出了sqlserver的datetime字段規定的日期範圍,所以出錯. 但是cpo.dbf這個表很大,有6萬多條記錄,日期字段有好幾個,請問邹建先生,可不可以讓命令凡是找到不符合規定的日期自動設為NULL值,或其他辦法也可?
我先將不規範的記錄找出來修改後,再執行; insert into cpo_bak select * from OPENROWSET('MICROSOFT.JET.OLEDB.4.0','dBase IV;DATABASE=f:\program\hgq\tmpcpo\','select * from cpo.dbf order by inter') 終於大攻告成,真是要好好謝謝邹建先生了.
補充說明一下,這個導出不是做了一次就完了,以後不時還會用到,比如我公司某操作員阿蘭在舊的dos程序中錄入客戶訂單: cpo.dbf, 而阿純在新系統中錄入生產工程單,生產工程單需要調用客戶訂單的數據,因此每天都要從cpo.dbf中導入新的資料添加到新系統中的sqlserver表cpo中.dos的数据,可以先转换成文本文件,不過需要額外做個轉換小程序,如用vfp等, 似乎有點麻煩.SQL的导入/导出向导本身就可以直接從clipper表導入,但也需要作額外的人工干預,而且是新產生一個表,而不是添加到一個存在的表中.
我是想可不可以在delphi中用ado控件adocommand通過sql命令如此之類的方式來實現,將那些步驟寫入到程序中,這樣導入資料的工作就交給了操作員自己來做了,既省心又方便.
可以直接导入到SQL SERVER
select * from
OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
,'dBase IV;DATABASE=C:\' --c:\是目录
,'select * from [客户资料4.dbf]') --客户资料4.dbf是文件名
--*/--/* dBase III文件
select * from
OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
,'dBase III;DATABASE=C:\'
,'select * from [客户资料3.dbf]')
--*/--/* FoxPro 数据库
select * from openrowset('MSDASQL',
'Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\', --c:\是目录
'select * from [aa.DBF]') --aa.dbf是文件名/*--说明:SourceDB=c:\ c:\是dbf文件的存放目录
[aa.DBF] 是dbf文件名
--*/
1.如果是dBase IV
登录sqlserver的查询分析器,执行下面的代码(以c:\cpo.dbf为例):
select * from
OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
,'dBase IV;HDR=NO;IMEX=2;DATABASE=C:\'
,'select * from cpo.dbf')
2.如果是dBase III
登录sqlserver的查询分析器,执行下面的代码(以c:\cpo.dbf为例):
select * from
OPENROWSET('MICROSOFT.JET.OLEDB.4.0'
,'dBase III;HDR=NO;IMEX=2;DATABASE=C:\'
,'select * from cpo.dbf')
Could not process object 'select * from cpo.dbf'. The OLE DB provider 'MICROSOFT.JET.OLEDB.4.0' indicates that the object has no columns.select * from OPENROWSET('MICROSOFT.JET.OLEDB.4.0','dBase IV; DATABASE=C:\','select * from cpo.dbf')伺服器: 訊息 7357,層級 16,狀態 2,行 1
Could not process object 'select * from cpo.dbf'. The OLE DB provider 'MICROSOFT.JET.OLEDB.4.0' indicates that the object has no columns.我用了 laughsmile(海边的星空) 的方法加了HDR=NO;IMEX=2也是一樣.我抱著試試看的心態,也用了VFP的驅動方式:
select * from openrowset('MSDASQL','Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\', 'select * from CPO.DBF')伺服器: 訊息 7399,層級 16,狀態 1,行 1
OLE DB provider 'MSDASQL' reported an error. The provider did not give any information about the error.
如果可以的话.
我看了csdn上的資料,從你給另一個帖子的回覆上知道: 被查詢的表在sql上需要是sqlserver機器上的表,而不是本地表,所以我改了一下路徑,是可以查詢了,但出現了如下錯誤;
select * from OPENROWSET('MICROSOFT.JET.OLEDB.4.0','dBase IV;DATABASE=f:\program\hgq\tmpcpo\','select * from cpo.dbf order by inter')伺服器: 訊息 8114,層級 16,狀態 9,行 1
Error converting data type DBTYPE_DATE to datetime. 我查了一下原表,是操作員在錄入日期時,將2000/01/31錄入成了0200/01/31,這已經超出了sqlserver的datetime字段規定的日期範圍,所以出錯.
但是cpo.dbf這個表很大,有6萬多條記錄,日期字段有好幾個,請問邹建先生,可不可以讓命令凡是找到不符合規定的日期自動設為NULL值,或其他辦法也可?
insert into cpo_bak select * from OPENROWSET('MICROSOFT.JET.OLEDB.4.0','dBase IV;DATABASE=f:\program\hgq\tmpcpo\','select * from cpo.dbf order by inter')
終於大攻告成,真是要好好謝謝邹建先生了.