转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 站长学院 >> Web开发 >> 正文
ADO多表更新BCB實現         ★★★★

ADO多表更新BCB實現

作者:闵涛 文章来源:闵涛的学习笔记 点击数:1775 更新时间:2009/4/23 10:47:14


強烈感謝PPower.
ADO多表更新的代碼,welcome指正xuchaofei@jit.com.tw,
//-------------------------------------------------------------------------------------------------------------------------------------------
在.h文件中 定義一個這樣的結構:
struct FieldValue
{
  AnsiString FNName;
  Variant FNValue;
} ;
struct FieldInfor
{
  std::vector<FieldValue> MyValue;
};
//-----------
在private部分中定義下面函數:
  std::vector<FieldInfor>MyFieldInfor;
  std::vector<FieldValue>TableField;
  void __fastcall GetTheUpdateTable(std::vector<AnsiString>&TableName);
  void __fastcall BeforePostEv(TDataSet *DataSet);
//-----------------------
在cpp文件中:
在訂義了多表的SQL語句的DataSet的BeforePost事件中加入如下代碼:
BeforePostEv(DataSet);
//-----------------------
void __fastcall TMutableOp::BeforePostEv(TDataSet *DataSet)
{
      if(DataSet->Modified)
    {
       FieldInfor TempVector;
      for(int i=0; i<DataSet->FieldCount; ++i)
      {
        FieldValue AllField;
        AllField.FNName  = DataSet->Fields->Fields[i]->FieldName;
        AllField.FNValue = DataSet->Fields->Fields[i]->Value;
        TempVector.MyValue.push_back(AllField);//把有數據更改的那個字段的數據的全部內容全部都保存起來。
      }
       MyFieldInfor.push_back(TempVector);
    }
}
//---------------------------------
//假設已取得了改變了的字段,那麼對它進行比較,看是那個表的數據,分表更新。
void __fastcall TMutableOp::GetTheUpdateTable(std::vector<AnsiString>&TableName)
{
  std::auto_ptr<TADOQuery>Query(new TADOQuery(NULL));
  Query->Connection = ADOConnection1;
//-------------------------------------------------------------
   for(std::size_t i=0;i< MyFieldInfor.size();++i)                            // 1 for
   {
      for(std::size_t t=0;t<TableName.size(); ++t)//按表名來分類處理 
      {
         AnsiString KeyFieldID;
         AnsiString KeyFieldValue;
         TableField.clear();
         for(std::size_t j=0; j< MyFieldInfor[i].MyValue.size(); ++j )    //3 for
         {
            //這裡是一個視圖被更改的一條記錄
            //對記錄按表分類:
              AnsiString StrTemp = MyFieldInfor[i].MyValue[j].FNName;
              if(StrTemp.Delete(TableName[t].Length()+1,StrTemp.Length()) ==TableName[t])//
              { //如果是這個表的字段,如果是Key字段,則把它記下,如果不是,則讓它組成SQL語句
                AnsiString Temp;
                Temp =  MyFieldInfor[i].MyValue[j].FNName;
                Temp.Delete(1,TableName[t].Length());
                Temp.Delete(5,Temp.Length());//除表名後的前面四個字符,看看是不是"_Key"
                if(Temp == "_Key")
                {//是關建字段 ;把數據存到一個項量裡
                  //把字段的附加信息除去

                  AnsiString TempA = MyFieldInfor[i].MyValue[j].FNName;;

                   TempA.Delete(1,TableName[t].Length());//把表名去除
                   TempA.Delete(1,5);                    //把_Key去除,得到真實字段名
                   FieldValue FieldStruct;

                   KeyFieldID = TempA;
                   KeyFieldValue = MyFieldInfor[i].MyValue[j].FNValue;
                   FieldStruct.FNName =TempA;
                   FieldStruct.FNValue = MyFieldInfor[i].MyValue[j].FNValue;
                   TableField.push_back(FieldStruct);
                }
                else
                {
                   FieldValue FieldStruct;
                   AnsiString TempA = MyFieldInfor[i].MyValue[j].FNName;;

                   TempA.Delete(1,TableName[t].Length());//把表名去除
                   TempA.Delete(1,2);                    //把__去除


                   FieldStruct.FNName = TempA;
                   FieldStruct.FNValue = MyFieldInfor[i].MyValue[j].FNValue;
                   TableField.push_back(FieldStruct);
                }

            }
            else
            {
              //如果表名不一樣,什麼也不做
            }
         }// 3 for
         //對第一個表的數據,到此找完,因些在這裡做更新SQL語句的合成
            if(TableField.size()==0)
            return;
            AnsiString SQL;
            SQL =" Select ";
            for(std::size_t v=0 ;v <TableField.size()-1 ;++v)
            {
              SQL+= TableField[v].FNName +  " , ";
            }
            SQL += TableField[TableField.size()-1].FNName+" ";// 到些應組成了類如這樣的字串"Select  FA,FB,FC "
            //加上表名  +條件
            SQL += " From "+ TableName[t]+ " Where "+ KeyFieldID +"  =  " + KeyFieldValue;
            Query->SQL->Text = SQL;
            Query->Open();//取出了這個表中符合這個ID條件的記錄。然後進行比較,後付值
            while(!Query->Eof) //這 個SQL語句選 出來的結果只能有一條記。
            {
              for(int F=0; F< Query->FieldCount; ++F)
              {
       

[1] [2]  下一页


[Delphi程序]Delphi(BCB)中编译器版本宏定义  [Delphi程序]如何用Tprinter设计BCB操作数据库程序中的报表
[Delphi程序]Delphi&BCB一线程序员开发经验  [Delphi程序]用日志钩子来实现键盘钩子功能之delphi/bcb版本
[Sql Server]BCB 6 sp4 + SQL Server 2k 存取JPEG图像,绝对好…  
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · Web开发  · 网页制作
    · 平面设计  · 网站运营
    · 网站推广  · 搜索优化
    · 建站心得  · 站长故事
    · 互联动态
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台