数据库表的字段如何有选择的导出?

中骑士 2003-08-29 09:25:41
常看到好多数据库应用软件有这样一个功能:在导出向导中,让用户选择需要的字段然后导出为文本文件(即用复选框CheckBox->Checked是否等于true)),我想知道程序算法步骤,是怎样实现的?
我想问的是:
我用
fprintf(fp,"%4s%20s%8s%2s",字段1,字段2,字段3,字段4);//估且这样写吧
语句写入到文本文件中。我想问的是,如果字段3没被选中,如何把“%8s”这个字符串和后边的“字段3,”字样去掉?或者字段2也没选中?或者字段1和4都没选中?千万别对我说,直接删掉不就行了?因为编译好的程序已经发布出去了,可没法让你改了。况且情况很多,没法写明各种是否选中的情况:比如假设有3个字段,那么用户就有数十种选择:选中1个字段,选中2个字段,3个字段,4个字段;而且选中1个字段时,就有选中字段1,选中字段2,选中字段2,选中字段3,选中字段4四种情况。
---------------------
唉哟累死我了,各位看着也累吧?
这是个技术问题,谁慷慨助我,我是不会吝啬分数的。(而且200分是给一个人的,绝不散分!)
不过没解决这前,我是不会结帖的。
-------------------------------
帖子最多给100分,所以我开了两个帖,解决后我会让他在另一帖里也露一小脸,我好再给分。这样就达到了给200分的目的!
...全文
155 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
zyxgd 2003-09-10
  • 打赏
  • 举报
回复
up
zyxgd 2003-09-09
  • 打赏
  • 举报
回复
up
kingcaiyao 2003-09-08
  • 打赏
  • 举报
回复
你的问题讲到底,就是要正确有效地形成SQL语句(即select关键词后的字段列表),这并不困难。
runnerrunning 2003-09-08
  • 打赏
  • 举报
回复
我是这么实现的:
原理:select * from table1 where .... //全部的字段
select field1,field3,field6 from table1 where ..//指定的字段

实现:
String s1 = "select ";
StringList sFieldList = new StringList();
String s2 = "from table1 where ..."

//一下构造sFieldList的各个字段

然后就获得select field1,field3,field6 from table1 where 。。。类似的语句即可
zyxgd 2003-09-08
  • 打赏
  • 举报
回复
up
luckyboy97 2003-09-08
  • 打赏
  • 举报
回复
如果要导到WORD、EXCEL中又应该怎么做呢
52vc 2003-09-08
  • 打赏
  • 举报
回复
用view 先把那些要导出的字段选出来,再导了
zyxgd 2003-09-05
  • 打赏
  • 举报
回复
To wawxj(海原) :

--back_str->Add(表中被导出数据的排列顺序-包括类型转换等)
此顺序怎么表达?

--sSQL = LoadResString(HInstance,OutFields);
此句中OutFields究竟是什么,是什么内容?

能否就这两句举一个明确的例子?
52vc 2003-08-30
  • 打赏
  • 举报
回复
同意楼主
wawxj 2003-08-29
  • 打赏
  • 举报
回复

void __fastcall Export()
{
//数据导出
TStringList *back_str;
AnsiString sFile,sSQL;
AnsiString Where_SQL;
if(!PromptForFileName(sFile,"文本文件|*.txt","*.txt","数据导出到",".\\",true))
return;
try
{
try
{
back_str = new TStringList;
Where_SQL = 需要导出数据的条件;
back_str->Add(Where_SQL);
back_str->Add(表中被导出数据的排列顺序-包括类型转换等);

sSQL = LoadResString(HInstance,OutFields);
sSQL = "select "+ sSQL + " as sj from tablename ";
if(!Where_SQL.IsEmpty())
sSQL += " where "+Where_SQL;

if(!ExecuteSQL(Q1,sSQL,true))//这是自己写的函数,用于执行SQL操作
return ;
Q1->First();
while(!Q1->Eof)
{
back_str->Add(Q1->FieldByName("sj")->AsString) ;
Q1->Next();
}
back_str->SaveToFile(sFile);//写入文件
ShowMessage("成功完成数据导出!") ;
}
catch (Exception &E1)
{
ShowMessage( "由于以下原因,数据导出失败!\n"+E1.Message) ;
}
}
__finally
{
delete back_str;
back_str = NULL;
}
}
//---------------------------------------------------------------------------

void __fastcall Import()
{
//数据接收
AnsiString rSQL,sTemp;//定义SQL
AnsiString Filename ;
TStringList *FileContent = new TStringList ;
if(!PromptForFileName(Filename,"文本文件|*.txt","*.txt","恢复数据数据文件位于",".\\",false))
return;
try
{
FileContent->LoadFromFile(Filename) ;//读取文件
//正常数据应包括:1、导出数据的条件;2、导出的数据字段列表;3、至少一行有效数据
//在我写这些代码时,在系统中无论如何都会满足这三个条件,你可以自己去取舍
if(FileContent->Count < 3)
{
ShowMessage("数据格式错误!");
delete FileContent;
return;
}
sTemp = FileContent->Strings[0];//删除条件
rSQL = "delete from tablename";
if(!sTemp.IsEmpty())
sTemp += " where "+sTemp;//删除
ExecuteSQL(Q1,rSQL,false);
sTemp = FileContent->Strings[1];//字段列表
for(int i = 2;i < FileContent->Count;++i)
{
rSQL = "insert into tb_data("+sTemp+") values ("+FileContent->Strings[i]+")";
ExecuteSQL(Q1,rSQL,false);
}
delete FileContent;
ShowMessage("数据导入完成!");
}
catch(Exception &E)
{
ShowMessage("由于以下原因,数据接收失败!\n"+E.Message);
}
delete FileContent;
}
//---------------------------------------------------------------------------

中骑士 2003-08-29
  • 打赏
  • 举报
回复
问题没解决,但我已放弃!!!!?唉,无可奈何中。。。。。
请不要再回帖了,朋友们,我想删此帖,但提示我没有权限!(kao),晕,我是楼主吗?
中骑士 2003-08-29
  • 打赏
  • 举报
回复
up
中骑士 2003-08-29
  • 打赏
  • 举报
回复
up
wawxj 2003-08-29
  • 打赏
  • 举报
回复
我不能连续回复3次,只有在这回了:
===============================
我觉得要实现这个最大的问题在于:
  1、系统字典的建立;
  2、并发操作的控制;
  3、日期型字段的处理(是否包含时分秒、是否能直接接受字符日期、是否支持ODBC日期型字段的转义字符等);

1,178

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 数据库及相关技术
社区管理员
  • 数据库及相关技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧