ODBC+mdb 表格rebuild... |
尚未結案
|
Ross
一般會員 發表:6 回覆:17 積分:4 註冊:2005-03-02 發送簡訊給我 |
各位大大... 我這樣做: 先用ADOconnect 連接了一個mdb
再用ADOquery...
//rebuild table
DROP TABLE T1 ....(old)
CREATE TABLE T1 ...(new but the scheme is not the same) 然後立刻
SELECT * FROM T1.... 得到的結果是之前的 T1 (old)... 要把程式關了再開先看到新的T1 (new)... 那是不是要用commit 指令... 快要發瘋了...
|
allenchan
資深會員 發表:10 回覆:306 積分:283 註冊:2004-01-06 發送簡訊給我 |
我做了一下測試,在畫面上拉了一個 ADOConnection 設好 ConnectionString,將 Connected 設成 true,然後再拉一個 ADOQuery1 將 Connection 設到 ADOConnection1,測試程式如下:
void __fastcall TForm1::Button1Click(TObject *Sender) { ADOQuery1->SQL->Clear(); ADOQuery1->SQL->Add("Drop Table T1"); ADOQuery1->ExecSQL(); ADOQuery1->SQL->Clear(); ADOQuery1->SQL->Add("Create Table T1 ( A char(16), B char(1) )"); ADOQuery1->ExecSQL(); ADOQuery1->SQL->Clear(); ADOQuery1->SQL->Add("select * from T1"); ADOQuery1->Open(); }結果一切正常,並無查詢到舊 Schema 的狀況? |
Ross
一般會員 發表:6 回覆:17 積分:4 註冊:2005-03-02 發送簡訊給我 |
引言: 我做了一下測試,在畫面上拉了一個 ADOConnection 設好 ConnectionString,將 Connected 設成 true,然後再拉一個 ADOQuery1 將 Connection 設到 ADOConnection1,測試程式如下:大大您好... 我的程序如下: void __fastcall TMDIChild::BitBtn3Click(TObject *Sender) { TStringList *m=new TStringList; int fnum,k=1; String S,SQLnd,SQLee,SQLev; //setting S=""; m->Clear(); if (PCA_RB_n->Checked && (!PCA_value->Text.IsEmpty())){ S="0\t" PCA_value->Text; }else if (PCA_RB_p->Checked&& (!PCA_value->Text.IsEmpty())){ S="1\t" PCA_value->Text; }else { Application->MessageBoxA("Value can't be empty!",MB_OK); } //The name of the table must be changeable DataModule1->AT_PCA_nd->TableName="New_data"; DataModule1->AT_PCA_eigvalue->TableName="PCA_eigvalue"; DataModule1->AT_PCA_eigvector->TableName="PCA_eigvector"; if (S!=""){ m->Add(S); m->SaveToFile("setting.txt"); // m->Clear(); fnum=DataModule1->AT_public->FieldCount; // DataModule1->AT_public->First(); do{ S=""; for(int i=1;i<=fnum;i ){ S = S DataModule1->AT_public->Fields->FieldByNumber(i)->AsString "\t"; } m->Add(S); DataModule1->AT_public->Next(); } while (!DataModule1->AT_public->Eof); m->SaveToFile("dataTmp.txt"); //call PCA the cal New data, eigvalue and eigvector ShellExecute(NULL,NULL,"usePCA.exe",NULL,NULL,SW_HIDE);//SW_SHOW m->Clear(); m->LoadFromFile("eigvalue.txt"); SQLnd="CREATE TABLE New_data("; SQLee="CREATE TABLE PCA_eigvalue("; SQLev="CREATE TABLE PCA_eigvector("; //PCA_value->Text=m->Count; for (int i=0;i < (m->Count-1);i ){ SQLnd=SQLnd "[Z" IntToStr(k) "]float,"; SQLee=SQLee "[evalue" IntToStr(k) "]float,"; SQLev=SQLev "[evector" IntToStr(k) "]float,"; k ; } SQLnd=SQLnd "[Z" IntToStr(k) "]float)";// IF NOT EXISTS New_data; "; SQLee=SQLee "[evalue" IntToStr(k) "]float)";// IF NOT EXISTS PCA_eigvalue; "; SQLev=SQLev "[evector" IntToStr(k) "]float)";// IF NOT EXISTS PCA_eigvector; "; DataModule1->ADOConnection1->Connected=false; //table for the original data //DataModule1->AT_public->Active=false; //tables for PCA /* DataModule1->AT_PCA_nd->Active=false; DataModule1->AT_PCA_eigvalue->Active=false; DataModule1->AT_PCA_eigvector->Active=false; */ DataModule1->AT_PCA_nd->Active=true; DataModule1->AT_PCA_eigvalue->Active=true; DataModule1->AT_PCA_eigvector->Active=true; try{ DataModule1->ADOConnection1->Connected=true; DataModule1->AT_public->Active=true; DataModule1->AQ_public->SQL->Clear(); DataModule1->AQ_public->SQL->Add("DROP TABLE New_data"); DataModule1->AQ_public->ExecSQL(); DataModule1->AQ_public->SQL->Clear(); DataModule1->AQ_public->SQL->Add(SQLnd); DataModule1->AQ_public->ExecSQL(); ///////////// DataModule1->AQ_public->SQL->Clear(); DataModule1->AQ_public->SQL->Add("DROP TABLE PCA_eigvalue"); DataModule1->AQ_public->ExecSQL(); DataModule1->AQ_public->SQL->Clear(); DataModule1->AQ_public->SQL->Add(SQLee); DataModule1->AQ_public->ExecSQL(); ////////////////////////////// DataModule1->AQ_public->SQL->Clear(); DataModule1->AQ_public->SQL->Add("DROP TABLE PCA_eigvector"); DataModule1->AQ_public->ExecSQL(); DataModule1->AQ_public->SQL->Clear(); DataModule1->AQ_public->SQL->Add(SQLev); DataModule1->AQ_public->ExecSQL(); } catch(...){ Application->MessageBoxA("linking error",MB_OK); } } } 我真的暈了...< > 這是我的 > 因為平時寫開的都是實用性的...現在一做學術性的就暈倒了...< >void __fastcall TForm1::Button1Click(TObject *Sender) { ADOQuery1->SQL->Clear(); ADOQuery1->SQL->Add("Drop Table T1"); ADOQuery1->ExecSQL(); ADOQuery1->SQL->Clear(); ADOQuery1->SQL->Add("Create Table T1 ( A char(16), B char(1) )"); ADOQuery1->ExecSQL(); ADOQuery1->SQL->Clear(); ADOQuery1->SQL->Add("select * from T1"); ADOQuery1->Open(); }結果一切正常,並無查詢到舊 Schema 的狀況? |
allenchan
資深會員 發表:10 回覆:306 積分:283 註冊:2004-01-06 發送簡訊給我 |
我大致看了一下,並沒有實際跑過,我猜想如果想要看到新建立的 Table,
那你應該在新 Table 建立完成後才去讀 Table,如下紅字部分。
void __fastcall TMDIChild::BitBtn3Click(TObject *Sender) { TStringList *m=new TStringList; int fnum,k=1; String S,SQLnd,SQLee,SQLev; //setting S=""; m->Clear(); if (PCA_RB_n->Checked && (!PCA_value->Text.IsEmpty())){ S="0\t" PCA_value->Text; }else if (PCA_RB_p->Checked&& (!PCA_value->Text.IsEmpty())){ S="1\t" PCA_value->Text; }else { Application->MessageBoxA("Value can't be empty!",MB_OK); } //The name of the table must be changeable DataModule1->AT_PCA_nd->TableName="New_data"; DataModule1->AT_PCA_eigvalue->TableName="PCA_eigvalue"; DataModule1->AT_PCA_eigvector->TableName="PCA_eigvector"; if (S!="") { m->Add(S); m->SaveToFile("setting.txt"); // m->Clear(); fnum=DataModule1->AT_public->FieldCount; // DataModule1->AT_public->First(); do{ S=""; for(int i=1;i<=fnum;i ){ S = S DataModule1->AT_public->Fields->FieldByNumber(i)->AsString "\t"; } m->Add(S); DataModule1->AT_public->Next(); } while (!DataModule1->AT_public->Eof); m->SaveToFile("dataTmp.txt"); //call PCA the cal New data, eigvalue and eigvector ShellExecute(NULL,NULL,"usePCA.exe",NULL,NULL,SW_HIDE);//SW_SHOW m->Clear(); m->LoadFromFile("eigvalue.txt"); SQLnd="CREATE TABLE New_data("; SQLee="CREATE TABLE PCA_eigvalue("; SQLev="CREATE TABLE PCA_eigvector("; //PCA_value->Text=m->Count; for (int i=0;i < (m->Count-1);i ){ SQLnd=SQLnd "[Z" IntToStr(k) "]float,"; SQLee=SQLee "[evalue" IntToStr(k) "]float,"; SQLev=SQLev "[evector" IntToStr(k) "]float,"; k ; } SQLnd=SQLnd "[Z" IntToStr(k) "]float)";// IF NOT EXISTS New_data; "; SQLee=SQLee "[evalue" IntToStr(k) "]float)";// IF NOT EXISTS PCA_eigvalue; "; SQLev=SQLev "[evector" IntToStr(k) "]float)";// IF NOT EXISTS PCA_eigvector; "; DataModule1->ADOConnection1->Connected=false; //table for the original data //DataModule1->AT_public->Active=false; //tables for PCA DataModule1->AT_PCA_nd->Active=false; DataModule1->AT_PCA_eigvalue->Active=false; DataModule1->AT_PCA_eigvector->Active=false;發表人 - allenchan 於 2005/04/21 01:57:03 |
Ross
一般會員 發表:6 回覆:17 積分:4 註冊:2005-03-02 發送簡訊給我 |
這個我想不是了...試了很多種次序都是這樣...會不會是我的connection有問題呢? 因為要做動態的連接所以修改了一個這樣的程序...
AnsiString DataSourceName,FileName,WinSysDir;
TRegistry *rg;
char buff[MAX_PATH];
//Get WinSysDir
GetSystemDirectory(buff,MAX_PATH);
WinSysDir=buff;
rg=new TRegistry();
//ODBC Config
DataSourceName="dpandp";
FileName=Name.Trim();
//
rg->RootKey=HKEY_CURRENT_USER;
rg->OpenKey("\\Software\\ODBC\\ODBC.INI\\" DataSourceName,True);
rg->WriteString("Driver",WinSysDir "\\odbcjt32.dll");
rg->WriteString("DBQ",FileName);
rg->WriteString("Description","Access Data Demo");
rg->WriteInteger("DriverId",0x00000019);
rg->WriteString("FIL","MS Access;");
rg->WriteInteger("SafeTransactions",0);
rg->WriteString("UID","");
rg->OpenKey("\\Software\\ODBC\\ODBC.INI\\" DataSourceName "\\Engines\\Jet",True);
rg->WriteString("ImplicitCommitSync","");
rg->WriteInteger("MaxBufferSize",0x00000800);
rg->WriteInteger("PageTimeout",0x00000005);
rg->WriteInteger("Threads",0x00000003);
rg->WriteString("UserCommitSync","Yes");
rg->OpenKey("\\Software\\ODBC\\ODBC.INI\\ODBC Data Sources",True);
rg->WriteString(DataSourceName,"Microsoft Access Driver (*.mdb)");
//
rg->CloseKey();
rg->Free(); 想問一問大大...除了用odbc連mdb,還有什麼方法呢?
|
allenchan
資深會員 發表:10 回覆:306 積分:283 註冊:2004-01-06 發送簡訊給我 |
何以確定不是呢?您的問題跟 Connection 是透過何種 Provider 並沒有關係,重點只在於變更完 Table Schema 後,指向此 Table 的 ADOTable 物件必須關掉再開才會看到新的 Schema,以下的 Code 是我自己測試的,無論是透過 ODBC or OLEDB 均正常。
void __fastcall TForm1::Button1Click(TObject *Sender) { ADOQuery1->SQL->Clear(); ADOQuery1->SQL->Add("Drop Table T1"); ADOQuery1->ExecSQL(); ADOQuery1->SQL->Clear(); ADOQuery1->SQL->Add("Create Table T1 ( A char(16), B char(1) )"); ADOQuery1->ExecSQL(); ADOTable1->Active = false; ADOTable1->Fields->Clear(); ADOTable1->Active = true; }P.S 前提是你 AQ_public, AT_PCA_nd, AT_PCA_eigvalue, AT_PCA_eigvector 確定是連到同一個 Database。 發表人 - allenchan 於 2005/04/21 12:12:59 |
Ross
一般會員 發表:6 回覆:17 積分:4 註冊:2005-03-02 發送簡訊給我 |
引言: 何以確定不是呢?您的問題跟 Connection 是透過何種 Provider 並沒有關係,重點只在於變更完 Table Schema 後,指向此 Table 的 ADOTable 物件必須關掉再開才會看到新的 Schema,以下的 Code 是我自己測試的,無論是透過 ODBC or OLEDB 均正常。大大其實我也有試過...正常的做法...是可以的 但不知為什麼現在的不可以...暈了... 現在只好用timer 令它自動按二下....... 發表人 -void __fastcall TForm1::Button1Click(TObject *Sender) { ADOQuery1->SQL->Clear(); ADOQuery1->SQL->Add("Drop Table T1"); ADOQuery1->ExecSQL(); ADOQuery1->SQL->Clear(); ADOQuery1->SQL->Add("Create Table T1 ( A char(16), B char(1) )"); ADOQuery1->ExecSQL(); ADOTable1->Active = false; ADOTable1->Fields->Clear(); ADOTable1->Active = true; }P.S 前提是你 AQ_public, AT_PCA_nd, AT_PCA_eigvalue, AT_PCA_eigvector 確定是連到同一個 Database。 發表人 - allenchan 於 2005/04/21 12:12:59 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |