強烈感謝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图像,绝对好…
|