C++Builder 程序员博客
28 Aug
txt文件的格式是自己从原来的数据库用memo导出来的,数据都用tab分开的
第一行数据要导入第一个表
第二行数据要导入第二个表
后面的数据导入到第三个表(行数未知)
三张表同在一个数据库中
因为需要"定时导入数据",所以就利用了windows自带的任务计划功能(方法比较土 - -!
但是txt文件的路径需要用参数的方法告诉这个程序
求问下这类程序的写法
接触CB差不多一个月了,之前做的工作都是在别人的基础上修改程序
突然让自己写一个出来就傻了 - -!
还望各位大侠指点一下
定时导入这个可以不做的
主要是数据导入对我来说比较难做…
因为原来没有用C++ Builder创建过程序
不知道该如何下手..
比如说程序结构大概是怎样的?
你可以用orcle专用load倒入工具,只有配置一下即可,比你写程序简单多啦。
使用sql语句配合odbc一样可以导入,真的不要写程序啦,sql导入的灵活性可强多了
可以同时导入多个文件么?(每个文件结构相同)
求范例写法
多个表,用直接SQL有些繁。最简的方法,一行行的读,一行行导入
结你个例子:
1.先建三个表
create table t1( ta1 varchar(10),ta2 varchar(10) );
create table t2( tb1 varchar(10),tb2 varchar(10) );
create table t3( tc1 varchar(10),tc2 varchar(10) );
2.文本数据:
'111' '222'
'333' '444'
'555' '666'
'777' '888'
'999' 'aaa'
'bbb' 'ccc'
3.程序:
//————————————————————————— #include <vcl.h> #pragma hdrstop #include "testora.h" //————————————————————————— #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //————————————————————————— __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //————————————————————————— void __fastcall TForm1::Button1Click(TObject *Sender) { TStringList *t=new TStringList() ; String x; ADOConnection1->Connected=true; if (OpenDialog1->Execute()) { t->LoadFromFile(OpenDialog1->FileName); x=t->Strings[0]; x="insert into t1 values("+StringReplace(x,"\x09",",",TReplaceFlags()<<rfReplaceAll)+")"; ADOQuery1->SQL->Text=x; ADOQuery1->ExecSQL(); x=t->Strings[1]; x="insert into t2 values("+StringReplace(x,"\x09",",",TReplaceFlags()<<rfReplaceAll)+")"; ADOQuery1->SQL->Text=x; ADOQuery1->ExecSQL(); for(int i=2;i<t->Count;i++) { x=x=t->Strings[i]; if (x.Trim()=="") continue; x="insert into t3 values("+StringReplace(x,"\x09",",",TReplaceFlags()<<rfReplaceAll)+")"; ADOQuery1->SQL->Text=x; ADOQuery1->ExecSQL(); } } delete t; } //—————————————————————————
感谢ls各位的指点
特别是keiy的代码
试了一下,报错说"missing comma"
然后把'111'和'222'中间的空格改成逗号就可以了
问下keiy大侠,可以改成不要界面,而转为支持多个参数的命令行的方式么?
参数为txt的路径,数目不确定。
"missing comma" 错是因为我的txt文件中间是tab而非空格(改为,或tab都可以)
console程序为:
#include <vcl.h> #include <ADODB.hpp> #include <DB.hpp> #include <iostream> using namespace std; #pragma link "adortl.lib" #pragma link "dbrtl.lib" #pragma link "rtl.lib" int main( int argc,char *argv[]) { if (argc<2) { cout << "Miss TXT FileName" << endl; return -1; } CoInitialize(NULL); TStringList *t=new TStringList() ; String x; TADOConnection *ADOConnection1=new TADOConnection(NULL); ADOConnection1->ConnectionString="你的连接串"; TADOQuery *ADOQuery1=new TADOQuery(NULL); ADOQuery1->Connection = ADOConnection1; ADOConnection1->Connected=true; cout << "connect db ok" <<endl; t->LoadFromFile(argv[1]); x=t->Strings[0]; x="insert into t1 values("+StringReplace(x,"\x09",",",TReplaceFlags()<<rfReplaceAll)+")"; ADOQuery1->SQL->Text=x; ADOQuery1->ExecSQL(); x=t->Strings[1]; x="insert into t2 values("+StringReplace(x,"\x09",",",TReplaceFlags()<<rfReplaceAll)+")"; ADOQuery1->SQL->Text=x; ADOQuery1->ExecSQL(); for(int i=2;i<t->Count;i++) { x=x=t->Strings[i]; if (x.Trim()=="") continue; x="insert into t3 values("+StringReplace(x,"\x09",",",TReplaceFlags()<<rfReplaceAll)+")"; ADOQuery1->SQL->Text=x; ADOQuery1->ExecSQL(); } delete t; cout << "ok" << endl; return 0; }
注意:编译时要加cp32mt.lib库
如你的文件名为t.cpp
编译时:
bcc32 t cp32mt.lib
(cp32mt.lib用#pragma link加在程序中是无用的,不知为什么)
谢谢keiy少
"你的连接串"是不是按照当时application的时候ADOConnection1的值填进去就可以了???
- -!
饿了,先回去吃饭了
明天接着看…
你的连接串"就是按照当时application的时候ADOConnection1的值填进去就可以了
在cmd下bcc32编译通过
然后转到工程目录,输入
Unit1.exe 2 111.txt
显示如下结果然后出错退出
connect db ok
—
输入
Unit1.exe 2 111.txt 222.txt 333.txt
结果和上面一样
—
111.txt 222.txt均为工程目录下文本文件
不知道是我参数输入不正确还是其他原因?
你看一下程序,我的程序只能有一个参数
试试
unit1.exe 111.txt
嗯,已经可以了…
如果希望读入多个参数而且参数数目不固定的话是不是需要用到CmdLine、ParamStr()、ParamCount()这几个函数?
可以不用CmdLine、ParamStr()、ParamCount(),因为c/c++本身就有
int main( int argc,char *argv[])
中的argc为参数个数。
argv[0]….程序本身
argv[1]….第一个参数
argv[2]….第二个参数
…
加了一个循环
for(int i=1;i <argc;i++)
{
t->LoadFromFile(argv[i]);
…
…
…
}
编译可以通过
不过运行时还是出错
是循环体写的不对么?
程序应该没问题.但要保证参数所指向的文件名全部存在,如按你写的
Unit1.exe 2 111.txt 222.txt 333.txt
中的2,也必须是一存在的文件的名字,且数据要符合上面的格式
我写的只是测试,容错方面还是要再完善的
另外编译一定要带上 cp32mt.lib 不然运行会错(在我机上如此)
嗯,回头我再调试一下…
麻烦keiy少了
明天过来结贴…