把SQL2000的里的表导出为foxpro的dbf的问题

grayloach1 2005-09-16 08:26:51
问题一:用什么方式实现?

因为没有找到好的方式,我打算采用用ADO的方式来实现,思路如下:
1.连接SQL;
2.读出字段信息;
3.根据2的信息,使用SQL语句建立一个空的dbf文件;
4.把SQL里的记录读到dbf中去。

问题二:第3步怎么做?

//===========以下已经实现到第2步==========
#define INITGUID
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <string>
#include <set>
#include <icrsint.h>
//#include "dbf.h"

//导入库文件
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
no_namespace rename("EOF", "EndOfFile")

using namespace std;

void dump_com_error(_com_error &e)
{
printf("Error\n");
printf("\tCode = %08lx\n", e.Error());
printf("\tCode meaning = %s", e.ErrorMessage());
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
printf("\tSource = %s\n", (LPCSTR) bstrSource);
printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}

int main()
{
::CoInitialize( NULL ); //初始化环境
try{
//建立sql连接
_ConnectionPtr pConnectionSQL("ADODB.Connection");
_RecordsetPtr pRecordsetSQL("ADODB.Recordset");
_CommandPtr pCommandSQL("ADODB.Command");
_bstr_t connectionStringSQL("Driver={SQL Server}; Server=(local); Uid=sa; Pwd=; Database=pubs");
pConnectionSQL->ConnectionTimeout=3; //设置超时时间为3秒
pConnectionSQL->Open(connectionStringSQL,"","",NULL);

//执行命令
_bstr_t queryStringSQL("select * from authors");
_variant_t recAffectedSQL; //受影响的记录行数
pRecordsetSQL->Open(queryStringSQL, _variant_t((IDispatch *)pConnectionSQL,true), adOpenKeyset,adLockBatchOptimistic, adCmdText);

//第2步:读出字段名
long limit = pRecordsetSQL->GetFields()->Count;
for (long x = 0; x < limit; x++)
cout << (char*) pRecordsetSQL->GetFields()->Item[x]->Name << endl;

//第3步:根据2的信息,建立dbf数据表
//?????????????????????????????????????

//关闭记录集、关闭连接
if(pRecordsetSQL->State) pRecordsetSQL->Close();
if(pConnectionSQL->State) pConnectionSQL->Close();
} //end of try
catch (_com_error &e )
{
dump_com_error(e);
}
//释放资源
::CoUninitialize();
//system("pause");
return 0;
}
...全文
175 点赞 收藏 6
写回复
6 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
wgsasd311 2005-09-23
楼主是用C,我的方法不可行
回复
wgsasd311 2005-09-23
因为表的结构要到运行时刻才能知道,所以不可能事先建立一个aa.dbf!
我所问的,就是如何根据运行时候读到的sql表的结构,建立一个dbf表。
------------------------------------------------->
在vfp里面我是这样做的,
con=SQLSTRINGCONNECT([cConnectString])
sql='select * from tb'
sqlexec(con,sql)
copy to aa.dbf
回复
grayloach1 2005-09-22
我顶啊~~
回复
grayloach1 2005-09-20
楼上的说法,不知所云。
你所说的aa.dbf,正我尚要建立的东西。

因为表的结构要到运行时刻才能知道,所以不可能事先建立一个aa.dbf!
我所问的,就是如何根据运行时候读到的sql表的结构,建立一个dbf表。
回复
zlp321002 2005-09-20

insert into openrowset('MSDASQL',
'Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\',
'select * from [aa.DBF]')
select * from 表

说明:
SourceDB=c:\ 指定foxpro表所在的文件夹
aa.DBF 指定foxpro表的文件名.
回复
mousubin 2005-09-16
UP
回复
发帖
应用实例
创建于2007-09-28

2.7w+

社区成员

MS-SQL Server 应用实例
申请成为版主
帖子事件
创建了帖子
2005-09-16 08:26
社区公告
暂无公告