全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2659
推到 Plurk!
推到 Facebook!

由Access移到MSSQL或PG,請前輩提供經驗與意見

答題得分者是:kevin2004
limary
初階會員


發表:41
回覆:109
積分:30
註冊:2007-01-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-07-09 16:12:47 IP:61.219.xxx.xxx 未訂閱
小妹欲將原先在Access環境下執行的系統移到MSSQL或postgresql下,可否請
前輩們提供一下經驗、意見、或特殊技巧。以供後輩學習參考。謝謝。
ko
資深會員


發表:28
回覆:785
積分:444
註冊:2002-08-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-07-09 18:09:19 IP:61.66.xxx.xxx 訂閱
不外乎資料庫權限設定及安全
其他有問題在PO來這裡問吧!!

願你順利轉移~
------
======================
昏睡~
不昏睡~
不由昏睡~
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-07-10 02:08:27 IP:61.67.xxx.xxx 未訂閱
請用心點查一下本站吧!
===================引 用 limary 文 章===================
小妹欲將原先在Access環境下執行的系統移到MSSQL或postgresql下,可否請
前輩們提供一下經驗、意見、或特殊技巧。以供後輩學習參考。謝謝。
kevin2004
資深會員


發表:18
回覆:463
積分:416
註冊:2005-05-29

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-07-10 14:20:25 IP:61.219.xxx.xxx 未訂閱
大哉問。很難回答。
可能就像PD兄講的,可能你要自己多花點功夫爬文才行。
純是聊聊。小弟不曉得你玩這些多久了,不知道你的系統的架構是
那種的。這是蠻關鍵的。如果只是玩玩的,而不是兩層或多層架構
,也沒有交易管理等機制,那還是讓它停在Access上吧。如果當初
就花了大功夫,那還可聊聊。這時要扯一些,還好扯的開。不過,
也實在是上天下海,如果能限個範圍,可能也比較好聊。
您覺得如何?
------
Kevin
kevin2004
資深會員


發表:18
回覆:463
積分:416
註冊:2005-05-29

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-07-10 16:02:09 IP:61.219.xxx.xxx 未訂閱
Delphi不像Java,Delphi把什麼都處理的好好的,而Java是什麼都要自己來。早期用
JSP/Servlet/JDBC開發系統的時候,真是痛苦的要命。可是像Web這種不知是幾
層的環境,又沒有像Delphi這麼體貼的工具,那還真不是一個痛字可以說的淨的
。那時作WebCase,而客戶後端五花八門的DB更是整死人。做的要吐血了,客戶
還嫌的要死。碰到移殖後端DB更是大工程,要想交差,幾乎是作夢比較快。
後來OR-Mapping越來越強手了,OO及Designed Pattern越普及了。這些問題全被
FremeWork作掉了,你只要在AP某個地方改個DB-方言設定為Oracle或PostgreSQL
,就全部OK了。你根本不用管後端的資料庫是那個東東。真是美夢成真。
不過,如果你還是區網、緊密聯接、要下SQL命令的Delphi,認命吧。
------
Kevin
編輯記錄
kevin2004 重新編輯於 2008-07-10 16:03:52, 註解 無‧
limary
初階會員


發表:41
回覆:109
積分:30
註冊:2007-01-11

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-07-10 16:21:06 IP:61.219.xxx.xxx 未訂閱
我在課餘寫了一段時間的Delphi,系統層次稍稍可以,正試者換後端的
資料庫,還請多多指教
===================引 用 kevin2004 文 章===================
大哉問。很難回答。
可能就像PD兄講的,可能你要自己多花點功夫爬文才行。
純是聊聊。小弟不曉得你玩這些多久了,不知道你的系統的架構是
那種的。這是蠻關鍵的。如果只是玩玩的,而不是兩層或多層架構
,也沒有交易管理等機制,那還是讓它停在Access上吧。如果當初
就花了大功夫,那還可聊聊。這時要扯一些,還好扯的開。不過,
也實在是上天下海,如果能限個範圍,可能也比較好聊。
您覺得如何?
limary
初階會員


發表:41
回覆:109
積分:30
註冊:2007-01-11

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-07-10 16:25:17 IP:61.219.xxx.xxx 未訂閱
什麼是OR-Mapping,小妹對Java不熟,會有如此好的工具嗎,可以不用管後端
資料庫的種類
我的問題是如何把一個在Access跑的好好的系統,移到MSSQL或其他資料庫上
,還要可以切換回原先的Access的環境
謝謝
===================引 用 kevin2004 文 章===================
Delphi不像Java,Delphi把什麼都處理的好好的,而Java是什麼都要自己來。早期用
JSP/Servlet/JDBC開發系統的時候,真是痛苦的要命。可是像Web這種不知是幾
層的環境,又沒有像Delphi這麼體貼的工具,那還真不是一個痛字可以說的淨的
。那時作WebCase,而客戶後端五花八門的DB更是整死人。做的要吐血了,客戶
還嫌的要死。碰到移殖後端DB更是大工程,要想交差,幾乎是作夢比較快。
後來OR-Mapping越來越強手了,OO及Designed Pattern越普及了。這些問題全被
FremeWork作掉了,你只要在AP某個地方改個DB-方言設定為Oracle或PostgreSQL
,就全部OK了。你根本不用管後端的資料庫是那個東東。真是美夢成真。
不過,如果你還是區網、緊密聯接、要下SQL命令的Delphi,認命吧。
jackiemi2_seed
中階會員


發表:37
回覆:97
積分:76
註冊:2006-09-11

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-07-10 16:32:50 IP:61.218.xxx.xxx 訂閱
在登入系統的主程式上面加一個選項,
依所選的選項,改變連線字串,讓使用者可以選擇要登入access或ms sql
這樣應可以吧...
------
OS : Win 7 pro
Program : Delphi 7
DataBase : Ms Sql 2008
kevin2004
資深會員


發表:18
回覆:463
積分:416
註冊:2005-05-29

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-07-10 17:48:45 IP:61.219.xxx.xxx 未訂閱
請問你是老師,還是學生。這點要先弄清楚,免得失禮了
===================引 用 limary 文 章===================
我在課餘寫了一段時間......
------
Kevin
kevin2004
資深會員


發表:18
回覆:463
積分:416
註冊:2005-05-29

發送簡訊給我
#10 引用回覆 回覆 發表時間:2008-07-10 17:52:52 IP:61.219.xxx.xxx 未訂閱
趕快把這個漏洞補起來,這可是個了不得的漏洞。
===================引 用 limary 文 章===================
什麼是OR-Mapping,小妹對Java不熟,.....
------
Kevin
kevin2004
資深會員


發表:18
回覆:463
積分:416
註冊:2005-05-29

發送簡訊給我
#11 引用回覆 回覆 發表時間:2008-07-10 17:57:47 IP:61.219.xxx.xxx 未訂閱
這我也有一個類似的經驗。我們公司的系統通常併行於Oracle/MSSQL/Postgresql/Access,
尤其是Postgresql與Access時,因pg需要有IP才能接的上,在出外對客戶用
筆電作Demo時就必需切換成Access。不過,我們的技巧不是改ADO聯接字串。
===================引 用 jackiemi2_seed 文 章===================
在登入系統的主程式上面加一個選項,
依所選的選項,改變連線字串,讓使用者可以選擇要登入access或ms sql
這樣應可以吧...
------
Kevin
limary
初階會員


發表:41
回覆:109
積分:30
註冊:2007-01-11

發送簡訊給我
#12 引用回覆 回覆 發表時間:2008-07-11 18:32:07 IP:61.219.xxx.xxx 未訂閱
小妹是學生啦,因為我有個姐姐在我高中時就教我用Delphi,所以也有幾年寫Delphi的經驗罷了
請問,如何讓使用者自行下令切換資料庫為Access或postgresql
===================引 用 kevin2004 文 章===================
這我也有一個類似的經驗。我們公司的系統通常併行於Oracle/MSSQL/Postgresql/Access,
尤其是Postgresql與Access時,因pg需要有IP才能接的上,在出外對客戶用
筆電作Demo時就必需切換成Access。不過,我們的技巧不是改ADO聯接字串。
jackiemi2_seed
中階會員


發表:37
回覆:97
積分:76
註冊:2006-09-11

發送簡訊給我
#13 引用回覆 回覆 發表時間:2008-07-12 22:38:07 IP:210.64.xxx.xxx 訂閱
目前想到二個方法
1.連線字串使用odbc,更換資料庫時,修改odbc內容
2.使用.ini檔,連線時捉ini檔的內容
===================引 用 kevin2004 文 章===================
這我也有一個類似的經驗。我們公司的系統通常併行於Oracle/MSSQL/Postgresql/Access,
尤其是Postgresql與Access時,因pg需要有IP才能接的上,在出外對客戶用
筆電作Demo時就必需切換成Access。不過,我們的技巧不是改ADO聯接字串。
===================引 用 jackiemi2_seed 文 章===================
在登入系統的主程式上面加一個選項,
依所選的選項,改變連線字串,讓使用者可以選擇要登入access或ms sql
這樣應可以吧...
------
OS : Win 7 pro
Program : Delphi 7
DataBase : Ms Sql 2008
limary
初階會員


發表:41
回覆:109
積分:30
註冊:2007-01-11

發送簡訊給我
#14 引用回覆 回覆 發表時間:2008-07-15 17:01:48 IP:61.219.xxx.xxx 未訂閱
謝謝前輩熱心回覆,小妹還有一些疑問,
Delphi-ADO下對postgresql是透過ODBC,如要聯postgresql勢必要用ODBC,但
如果要user去改odbc設定可能有點困難,而且自動化程度不高,這要如何克服?
謝謝。
===================引 用 jackiemi2_seed 文 章===================
目前想到二個方法
1.連線字串使用odbc,更換資料庫時,修改odbc內容
2.使用.ini檔,連線時捉ini檔的內容
limary
初階會員


發表:41
回覆:109
積分:30
註冊:2007-01-11

發送簡訊給我
#15 引用回覆 回覆 發表時間:2008-07-15 17:09:19 IP:61.219.xxx.xxx 未訂閱
我有個很大的問題。煩勞了各位前輩費心幫忙解答後,我才想到我當初最煩惱的
是我要如何控制面對不同資料庫需不同SQL命令的控制結構。這個不同資料庫所須
的不同SQL,我可以自己慢慢試。可是要如何作個控制才好。我現在是放在我的
MainForm中作控制,自己想想這一定有問題,可是不知要如何作才好。這可否
請前輩指點一二。謝謝。
jackiemi2_seed
中階會員


發表:37
回覆:97
積分:76
註冊:2006-09-11

發送簡訊給我
#16 引用回覆 回覆 發表時間:2008-07-16 08:48:17 IP:61.218.xxx.xxx 訂閱
新增一個ini檔
連線時固定捉[odbc]
想連ms sql時,把[odbc_mssql]改成[odbc]
想連sybase時,把[odbc_sybase]改成[odbc]
由db_kind的值,就可以知道目前使用的是什麼資料庫,連上一個問題都解決了

ini檔內容
[odbc_mssql]
db_kind=1
odbc_name=odbc_sybase
[odbc_sybase]
db_kind=2
odbc_name=odbc_sybase
[odbc_access]
db_kind=3
odbc_name=odbc_access



程式連線字串,只要在data source部份用變數去捉ini設定的值就好了
var myini:Tinifile;
db_name:string;
db_kind:string;
begin
//捉ini檔要先uses inifiles
myini:=Tinifile.Create('c:\db.ini');
db_name:=myini.ReadString('odbc','odbc_name','');
db_kind:=myini.ReadString('odbc','db_kind','');
adoconnection1.ConnectionString:='Provider=MSDASQL.1;Password=xxx;Persist Security Info=True;xxx;Data Source=' db_name;

寫的有點亂,希望看得懂


===================引 用 limary 文 章===================
謝謝前輩熱心回覆,小妹還有一些疑問,
Delphi-ADO下對postgresql是透過ODBC,如要聯postgresql勢必要用ODBC,但
如果要user去改odbc設定可能有點困難,而且自動化程度不高,這要如何克服?
謝謝。
===================引 用 jackiemi2_seed 文 章===================
目前想到二個方法
1.連線字串使用odbc,更換資料庫時,修改odbc內容
2.使用.ini檔,連線時捉ini檔的內容
------
OS : Win 7 pro
Program : Delphi 7
DataBase : Ms Sql 2008
編輯記錄
jackiemi2_seed 重新編輯於 2008-07-16 08:51:46, 註解 無‧
jackiemi2_seed 重新編輯於 2008-07-16 09:01:16, 註解 無‧
pedro
尊榮會員


發表:152
回覆:1187
積分:892
註冊:2002-06-12

發送簡訊給我
#17 引用回覆 回覆 發表時間:2008-07-16 11:05:40 IP:60.248.xxx.xxx 未訂閱
小弟略懂Access、MSSQL但postgresql不懂
不知道這三套是否能接受相同的select,update,insert,delete語法?
單就看access及ms-sql語法就有些微不相容

不知前輩對方面有無經驗可談
kevin2004
資深會員


發表:18
回覆:463
積分:416
註冊:2005-05-29

發送簡訊給我
#18 引用回覆 回覆 發表時間:2008-07-17 17:30:40 IP:61.219.xxx.xxx 未訂閱
雖然號稱SQL標準,但實際上這些不同資料庫的SQL都有不同。有時甚至連
我們在Delphi中下令的格式都不一樣,當初在將Paradox移殖到Access
及MSSQL及PG及Oracle及MySQL時就吃了不少苦頭。更別論同一個欄在
不同廠商的型別與限制就各有千秋。而Delphi是區網環境,及緊密聯接
,沒有Java中的ORMapping產品的幫忙,非要我們自己來長SQL字串不可
。這在不同DB是要用不同SQL字串的,這實在是沒辦法的事。即使你把
各家DB特殊絕活全部放棄﹝這實在好痛苦,而且讓我們無
法壓榨用特別DB的客戶的銀子﹞,只嚴格限制只使用SQL92最最基
本的語法,那你也要面對不同格式等問題。你還是要因不同DB去長不同
的SQL字串。更何況有些客戶的錢真是多到不知該怎麼花,當然要用一些
花樣去榨他們的錢阿。
如何在AP中設定此產品實務環境是使用那個資料庫與那個客戶,以換接不同
的處理或長SQL字串,實在是我們這些用Delphi人永遠的痛。是宿命吧,
只有接受。
===================引 用 pedro 文 章===================
Access/MSSQL/PG,不知道這三套是否能接受相同的select,update,insert,delete語法?
單就看access及ms-sql語法就有些微不相容
------
Kevin
編輯記錄
kevin2004 重新編輯於 2008-07-17 17:49:51, 註解 無‧
kevin2004
資深會員


發表:18
回覆:463
積分:416
註冊:2005-05-29

發送簡訊給我
#19 引用回覆 回覆 發表時間:2008-07-17 17:48:28 IP:61.219.xxx.xxx 未訂閱

===================引 用 limary 文 章===================
...不同資料庫所須的不同SQL....。可是要如何作個控制才好。我現在是放在我的
MainForm中作控制,自己想想這一定有問題,可是不知要如何作才好。
===================引 用 limary 文 章===================
limary,
你在一個題目中,問了太多不同的題目,而且都是問超大超大的主題。
這不好,對以後我們要查索資料會造成很大的問題,及可能因只看了題
目就錯過了可能是找了好久的正確答案。你應該讓你的題名達意及限
縮你的題目範圍。
------------------------------------------------------------------
我先專就你的詢問AP對不同資料庫SQL控制提供個人看法。
1.你用MainForm放DB種類及客戶資料是不好的。甚至這些資料都不應該
放在Form中,要放應放在Unit中。因為它通常是控制用的,通常是不
應該有Visual元件。
2.這種敏感及關係AP生死的東西,當然沒人會用變數或全域變數的方式
來處理。最好放在物件中。
3.在團隊開發環境時,它應該是一個專人專責維護的物件,它應該是個
Singleton物件,非專責的同事只能讀取相關值,而不能改它。
4.設好了,再在各個需要作DB處理的段落再切到不同DB的長SQL字串或特
殊DB處理的不同碼了。
------
Kevin
編輯記錄
kevin2004 重新編輯於 2008-07-17 17:52:19, 註解 無‧
kevin2004 重新編輯於 2008-07-17 17:53:05, 註解 無‧
limary
初階會員


發表:41
回覆:109
積分:30
註冊:2007-01-11

發送簡訊給我
#20 引用回覆 回覆 發表時間:2008-07-18 07:36:15 IP:61.219.xxx.xxx 未訂閱
小妹不太懂這些
可否請前輩講解一下謂Singleton物件及如何實作,另可否請前輩惠賜範例碼
謝謝前輩教導
===================引 用 kevin2004 文 章===================
3.在團隊開發環境時,它應該是一個專人專責維護的物件,它應該是個
Singleton物件,非專責的同事只能讀取相關值,而不能改它。
limary
初階會員


發表:41
回覆:109
積分:30
註冊:2007-01-11

發送簡訊給我
#21 引用回覆 回覆 發表時間:2008-07-18 07:41:31 IP:61.219.xxx.xxx 未訂閱
謝謝jackiemi2_seed前輩的熱心指導
jackiemi2_seed前輩講的是用程式線上改INI內容,配合AP元件供User選
設資料庫的方法,小妹下午時試者來實作看看。
感謝。感謝。
kevin2004
資深會員


發表:18
回覆:463
積分:416
註冊:2005-05-29

發送簡訊給我
#22 引用回覆 回覆 發表時間:2008-07-20 09:31:44 IP:61.219.xxx.xxx 未訂閱
limary,你好。最近很忙,抱歉,今日才回。你這問題很不好回,可能原因是我自
己都學的不好的緣故。如果有講錯了,提示小弟一下。
有關Sungleton這些不是三言兩語可以說的盡,我可以稍稍介紹一下,但最好你自己
也找幾本書來看。
第一本當然是四人幫的DisignPattern,不過這本書初看會很吃力,甚至在你看了第
五遍第十遍,你還會無法貫通。好在類似的書,現在很多,有用Java作例碼的
,也有C 例碼的,我建議你找Java例碼的。這些看看,再照四人幫的書,會有
助深入瞭解。但如果覺得四人幫的書看的頭痛,那暫時將之擱在一邊,也可以。
市面上還有一本是用Delphi講DesignPattern原理及相關實務的,寫的很不錯,書名
及作者我一下子記不起來,它的作者也是我們站裏及友站的版主。
------------------------------------------------------------------
望文生義,Singleton就指單體,意思就是同時間,只產生一個此物件的意思。這在
控制物件來說,當然Singleton是必要的,否則就天下大亂了。
Delphi與java不同,在Java中作Singleton控制很簡單,可是Delphi就有點困難了。
這你要看一下書,書上寫的很詳細。實作重點如下:
1.開個ControlObjectUnit,放你的控制物件的定義。這個物件很重要,要設計
好,很多東西要保護好。
2.在apFacadeUnit中以Func讓大家讀取這些公開資訊
3.apFacadeUnit讀控制資訊的函式自動執行保證是Singleton物件的Unit專有的
函式。而這些控制物件也是apFacadeUnit-implementation-var的私有物件。
// 或在apFacadeUnit-initialization先自動生成這些物件
4.記得在apFacadeUnit-finalization中清除這些物件
大略如上
---------------------------------------------------------------------
一、建你的控制物件:用個unit將這些相關的重要物件定義集中到這裏,這是標準
的東西,小弟就略過了。
二、apFacadeUnit:
1.Interface要公開你的讀取控制物件重要值的函式
2.implementation-var要設此物件的變數
3.implementation設生成此singleton物件的函式。此函式指紋是否公開在
interface,沒關係。此函式碼很簡單,如下:
begin
if ControlObject = nil then
begin
try
ControlObject := TControlObject.create ;
except
Application.Terminate ;
end ;
end ;
Result := ControlObject ;
end ;
4.initialization可以先生成此控制物件,如
initialization
........
if ControlObject = nil then // 或 if not Assigned(ControlObject) then
begin
try
ControlObject := TControlObject.create ;
except
Application.Terminate ;
end ;
end ;
5.implementation私有的抓取或生成此物件的函式
function GetControlObject : TControlObject ;
begin
if ControlObject = nil then
begin
try
ControlObject := TControlObject.create ;
except
Application.Terminate ;
end ;
end ;
Result := ControlObject ;
end ;
6.finalization中要砍這些控制物件,如
finalization
......
if ControlObject <> nil then
begin
FreeAndNil(ControlObject) ;
end ;
就這樣啦,你試試看。
------
Kevin
編輯記錄
kevin2004 重新編輯於 2008-07-20 09:43:41, 註解 無‧
limary
初階會員


發表:41
回覆:109
積分:30
註冊:2007-01-11

發送簡訊給我
#23 引用回覆 回覆 發表時間:2008-07-21 16:52:16 IP:61.219.xxx.xxx 未訂閱
謝謝前輩,前輩講的Singleton正是我要找的東西。我剛試過這個架構,完全沒問題。
謝謝前輩。
我會多找些時間來研究Java這些有趣的主題。謝謝。
系統時間:2024-05-04 23:44:09
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!