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

連線到遠端資料庫的連線問題..

尚未結案
jackwu
一般會員


發表:28
回覆:54
積分:16
註冊:2002-08-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-08-26 17:12:44 IP:211.75.xxx.xxx 未訂閱
各位: 我所使用的BCB5版本為Professional版,沒有ADO元件,所以採用ODBC連線到遠端的資料庫,並測試成功(前提是已經先登入到遠端的PC)。為了省去每次都要登入到遠端PC的步驟所以我設定一個遠端PC的網路磁碟,這樣每次開機都可以連上線,但是現在發現一個問題,就是網路磁碟機容易斷線,所以可能有時開始執行資料庫程式時,會出現找不到資料庫的訊息,請問各位: 1.現在使用ODBC的方式連結,就必須先登入遠端PC,如果不登入PC是否有方法可以連線呢?因為使用網路磁碟機不是每次都能登入.. 2.要用什麼方式可以保持資料庫一直連線而不斷線呢?因為有時可能會被主機給踢出.. 作業系統: Client端使用 Win2000 Professional Server端使用 Win2000 Server Client 端同時會有超過10部的PC與Server連線 謝謝
jackwu
一般會員


發表:28
回覆:54
積分:16
註冊:2002-08-18

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-09-02 15:22:38 IP:211.75.xxx.xxx 未訂閱
因為都沒有人回信,所以我測試了以下的方式,不知道可不可行,請各位大大給點意見: 如果我要寫入資料至資料庫時,我先判斷資料庫是否連結,如果沒有連結則先將網路磁碟機斷線,在連線,之後再將Query連結至遠端資料庫,下面是網路磁碟機的程式。(這是我參考 C++Builder揭開互助社群軟體-Napster的秘密 Internet與TCP/IP進機程式設計 所寫出來的)  
 
   Password = Edit2->Text;
   UserName = Edit1->Text;
   if(Password == "" || UserName == "")
   {
      MessageDlg("請輸入使用者名稱及密碼!!", mtError, TMsgDlgButtons() << mbOK, 0);
      return;
   }
   lPassword = Password.c_str();
   lUserName = UserName.c_str();       dwResult = WNetOpenEnum(RESOURCE_CONNECTED, RESOURCETYPE_DISK, RESOURCEUSAGE_CONNECTABLE, NULL, &hEnum);
   if((dwResult == NO_ERROR) && (hEnum != 0x00000000))
   {
      LR = (LPNETRESOURCE) GlobalAlloc(GPTR, dwLength);
      ZeroMemory(LR, dwLength);
      dwResult = WNetEnumResource(hEnum, &lpcCount, LR, &dwLength);
      if(dwResult == NO_ERROR)
      {
         for(int i=0; iItems->Add(LocalName   " "   Networkpatch);                lNetworkpatch = Networkpatch.c_str();
            lLocalName = LocalName.c_str();
            //先中斷
            try
            {
               WNetCancelConnection2(lLocalName, CONNECT_UPDATE_PROFILE, true);
            }
            catch(Exception &exception)
            {
               Application->ShowException(&exception);
            }
         }
         for(int i=0; iItems->Add(LocalName   " "   Networkpatch);
            lNetworkpatch = Networkpatch.c_str();
            lLocalName = LocalName.c_str();
            //將網路磁碟機重新連線
            NR.dwScope = RESOURCE_CONNECTED;
            NR.dwType  = RESOURCETYPE_DISK;
            NR.dwDisplayType = RESOURCEDISPLAYTYPE_SHARE;
            NR.dwUsage = RESOURCEUSAGE_CONNECTABLE;
            NR.lpRemoteName = Networkpatch.c_str();
            NR.lpLocalName = LocalName.c_str();
            NR.lpProvider = NULL;                dwResult = WNetAddConnection2(&NR, Password.c_str(), UserName.c_str(), false);
            if(dwResult != NO_ERROR)
               MessageDlg("連結失敗!!!", mtWarning, TMsgDlgButtons() << mbOK, 0);
         }
      }
      GlobalFree((HGLOBAL)LR);
      dwResult = WNetCloseEnum(hEnum);
}
當上面的網路磁碟機再度連線才將TQuery連至Server 在請問各位大大,如我在先前問的問題: 使用ODBC的方式連結,就必須先登入遠端PC,如果不登入PC是否有方法可以連線呢? 請問有解嗎? 發表人 - jackwu 於 2003/09/02 15:26:58
kuochih
一般會員


發表:2
回覆:8
積分:2
註冊:2003-07-17

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-09-04 15:51:58 IP:211.76.xxx.xxx 未訂閱
jackwu 你好,    我是使用BDE連結Mysql BDE中有個Database元件 設定好Database的參數之後 可免去使用者每次登入都須輸入帳號密碼的步驟  也可保持資料庫一直連線    database元件設定方法如下: (double click database元件可進入設定畫面) 1. 設定 Name欄位,     指定該database元件的名稱,若你使用query元件,    可在query元件的database屬性指定該名稱即可。    2. 設定 Alias name,    這個屬性負責連結BDE 目前所連結到可用的資料庫    3. 設定 Parameter overrides,    加入 username=您的帳號         password=您的密碼    4. 另外,    屬性 KeepConnection 設為true    可保持資料庫一直連線       屬性 LoginPrompt 設為false    可省去每次登入皆須輸入帳號密碼的步驟    希望對你有所幫助。
jackwu
一般會員


發表:28
回覆:54
積分:16
註冊:2002-08-18

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-09-05 01:06:59 IP:211.76.xxx.xxx 未訂閱
kuochih 你好: 其實我的連線方式也是和你所寫的一樣,我也察看過我的程式,其中Dtabase元件中的KeepConnection也是True(Default值),但是我現在連不上資料庫並不是因為資料庫的斷線,而是Win2000 Server將遠端使用者踢出,當有這樣的情形,我就必須再登入Server中才能再寫入資料(這一段是我個人的見解,不知道對不對?) 例如說:假設我必須先以Name:User PW:User先登入到Server中,且在在ODBC中設定連結到資料庫的Name:DB PW:DB,那ODBC才能連結到Server遠端的資庫中,並測試連結成功,這樣我的程式才可以透過Query元件將資料寫入到資料庫中。如果我所登入到Server的名稱被踢出,那麼資料庫就無法連結,當然寫入資料也會失敗,請問這樣要如何解決呢?
jackwu
一般會員


發表:28
回覆:54
積分:16
註冊:2002-08-18

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-09-05 15:33:15 IP:211.75.xxx.xxx 未訂閱
各位: 其實我好像將這個問題想得太複雜了,應該只要判斷Database是否有連結到資料庫,像這樣
if(!Database->Connected)
   Database->Connected = true;
原本我以為這樣就可以了,但當我連上資料庫後,由Server將使用者踢出從"我的電腦"按右鍵->管理->在"系統工具"底下有一個"共用資料夾"的底下有一個"工作階段"假設我的登入名稱為"aa",那將aa"關閉工作階段"之後,再從我的程式要寫入資料到資料庫中,並且在寫入之前有也有做Connected的判斷,但是其Connected還是true,所以寫入資料庫會出錯,錯誤訊息如下: Project test.exe raised exception class EDBEngineError with message 'General QL error. [Microsoft][ODBC QL erver Driver][Named Pipes]Connection Write(WrapperWrite()). [Microsoft][ODBC QL erver Driver][Named Pipes]一般網路錯誤。查閱您的網路文件。'.Process stop. Use tep or Run to continue. 所以請問各位前輩,我要如何去判斷Database是否連線呢?
系統時間:2024-05-06 1:32:38
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!