線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1220
推到 Plurk!
推到 Facebook!

ODBC+mdb 表格rebuild...

尚未結案
Ross
一般會員


發表:6
回覆:17
積分:4
註冊:2005-03-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-04-20 20:44:42 IP:202.175.xxx.xxx 未訂閱
各位大大...    我這樣做:    先用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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-04-20 22:21:41 IP:61.62.xxx.xxx 未訂閱
我做了一下測試,在畫面上拉了一個 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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-04-20 23:40:47 IP:202.175.xxx.xxx 未訂閱
引言: 我做了一下測試,在畫面上拉了一個 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 的狀況?
大大您好... 我的程序如下: 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); } } } 我真的暈了...< > 這是我的 > 因為平時寫開的都是實用性的...現在一做學術性的就暈倒了...< >
allenchan
資深會員


發表:10
回覆:306
積分:283
註冊:2004-01-06

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-04-21 01:50:18 IP:61.62.xxx.xxx 未訂閱
我大致看了一下,並沒有實際跑過,我猜想如果想要看到新建立的 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;

    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();

      DataModule1->AT_PCA_nd->Active=true;
      DataModule1->AT_PCA_eigvalue->Active=true;
      DataModule1->AT_PCA_eigvector->Active=true;            }
    catch(...){
      Application->MessageBoxA("linking error",MB_OK);
    }      }    }    
發表人 - allenchan 於 2005/04/21 01:57:03
Ross
一般會員


發表:6
回覆:17
積分:4
註冊:2005-03-02

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-04-21 10:21:43 IP:202.175.xxx.xxx 未訂閱
這個我想不是了...試了很多種次序都是這樣...會不會是我的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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-04-21 12:09:34 IP:203.70.xxx.xxx 未訂閱
何以確定不是呢?您的問題跟 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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-04-21 12:34:55 IP:202.175.xxx.xxx 未訂閱
引言: 何以確定不是呢?您的問題跟 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
大大其實我也有試過...正常的做法...是可以的 但不知為什麼現在的不可以...暈了... 現在只好用timer 令它自動按二下....... 發表人 -
系統時間:2024-04-30 3:02:14
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!