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

如何以程式下令建pg-db的DSN

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


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-04-10 15:12:45 IP:61.219.xxx.xxx 未訂閱
為了作WinPG-DB-AP的自動化SetUp功能,我必需要要能以程式碼自動為某個
pg-db﹝如postgres﹞建psqlODBC-DSN-Item,請問我要如何作才行?
先謝謝前輩的指點。
kevin2004
資深會員


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-04-10 16:21:08 IP:61.219.xxx.xxx 未訂閱
這很簡單,你只要自己手動建個DSN,比如是ABC_pg,再到登錄中去找個項目,
然後自己寫個程式來新增這個Item就可以了。很簡單的。
當然你也可以寫一些變型的,比如說知道DSN要取得或改其IP,或由DB-Name要
抓其DSN名。不一而足,這些都會常被用到的。
------
Kevin
limary
初階會員


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-08-21 16:45:14 IP:61.219.xxx.xxx 未訂閱
可否請前輩惠賜一些樣碼,以供小妹學習模仿
萬分感謝
kevin2004
資深會員


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2010-04-13 18:55:24 IP:118.161.xxx.xxx 未訂閱
參考以下碼,稍作變化即可
Function TPostgreSQLObject.CreateDbDsnOK (
ThisDSNName : string ; // 如MyToolSDB_PG
ThisDataBase : string ; // 如MyToolSDB
ThisServerNameOrIP : string ; // 如192.168.1.110
ThisPort : string = '5432' ;
ThisDriverKind : string = 'Unicode' ) : Boolean ;
var
Reg : TRegistry ;
begin
Result := False ;
if FoundDbDsn(ThisDSNName) then
begin
File_Msg ('此有同名的ODBC-DSN項目' ) ;
// ============================================================
// 安全起見,要清除舊的DSN記錄。先殺與此DSN同名的舊Key
// ============================================================
if Not AP_GetODBCObject.KillThisDsnOK ( ThisDSNName ) then
begin
// 以下碼不需要。因如果原不存在,自然殺不掉,而會有不必要的
// 訊息出現。如果已存在,則自然殺沒問題,也沒以下訊息出
// 現。即以下碼為贅碼。
//File_Msg('通知閣下:清除舊有[' ThisDSNName
// ']失敗。將會自動覆寫到新值');
end ;
end ;
try
// ============================================================
// 先建較少項目者
// ============================================================
try
Reg := TRegistry.Create ;
Reg.RootKey := ODBC_ROOT_KEY ;
if Reg.OpenKey ( ODBC_DSN_REGIST_KEY , True ) then
// true表如此key不存在時,先CreateKey
begin
// ============================================================
// 選ANSI為psqlodbc30a.dll
// 選Unicode為psqlodbc35w.dll
// ============================================================
if AnsiCompareText(ThisDriverKind,'Unicode')=0 then
Reg.WriteString ( ThisDSNName , 'PostgreSQL Unicode' )
else
Reg.WriteString ( ThisDSNName , 'PostgreSQL ANSI' ) ;
Result := True ;
end
else
Result := False ;
finally
Reg.CloseKey ;
Reg.Free ;
end ;
// ============================================================
// 再建較多項目者
// ============================================================
try
Reg := TRegistry.Create ;
Reg.RootKey := ODBC_ROOT_KEY ;
if Reg.OpenKey ( ODBC_DSN_DETAIL_KEY '\' ThisDSNName , True ) then
// true表如此key不存在時,先CreateKey
begin
Reg.WriteString ( 'AB' , '10' ) ;
Reg.WriteString ( 'BI' , '0') ;
Reg.WriteString ( 'BoolsAsChar' , '1') ;
Reg.WriteString ( 'ByteaAsLongVarBinary', '1') ;
Reg.WriteString ( 'BytesAsLongVarBinary', '1') ;
Reg.WriteString ( 'CancelAsFreeStmt' , '0') ;
Reg.WriteString ( 'CommLog' , '0') ;
Reg.WriteString ( 'ConnSettings' , '') ;
Reg.WriteString ( 'Database' , ThisDataBase ) ;
Reg.WriteString ( 'DeBug' , '0') ;
Reg.WriteString ( 'Description' , '') ;
Reg.WriteString ( 'DisallowPremature' , '0') ;
// ============================================================
// 選ANSI為psqlodbc30a.dll
// 選Unicode為psqlodbc35w.dll
// ============================================================
if AnsiCompareText(ThisDriverKind,'Unicode')=0 then
Reg.WriteString ( 'Driver' ,
'C:\Program Files\psqlODBC\0802\bin\psqlodbc35w.dll')
else
Reg.WriteString ( 'Driver' ,
'C:\Program Files\psqlODBC\0802\bin\psqlodbc30a.dll') ;
Reg.WriteString ( 'ExtraSysTablePrefixes', 'dd_;') ;
Reg.WriteString ( 'FakeOidIndex' , '0') ;
Reg.WriteString ( 'Fetch' , '100') ;
Reg.WriteString ( 'Ksqo' , '1') ;
Reg.WriteString ( 'LFConversion' , '1') ;
Reg.WriteString ( 'LowerCaseIdentifier' , '0') ;
Reg.WriteString ( 'MaxLongVarcharSize' , '8190') ;
Reg.WriteString ( 'MaxVarcharSize' , '255') ;
Reg.WriteString ( 'Optimizer' , '1') ;
Reg.WriteString ( 'Parse' , '0') ;
Reg.WriteString ( 'Password' , '') ;
Reg.WriteString ( 'Port' , ThisPort ) ;
Reg.WriteString ( 'Protocol' , '7.4-1') ;
Reg.WriteString ( 'ReadOnly' , 'p') ;
Reg.WriteString ( 'RowVersioning' , '0') ;
Reg.WriteString ( 'Servername' , ThisServerNameOrIP ) ;
Reg.WriteString ( 'ShowOidColumn' , '0') ;
Reg.WriteString ( 'ShowSystemTables' , '0') ;
Reg.WriteString ( 'SSLMode' , 'disable') ;
Reg.WriteString ( 'TextAsLongVarchar' , '1') ;
Reg.WriteString ( 'TrueIsMinus1' , '0') ;
Reg.WriteString ( 'UID' , '') ;
Reg.WriteString ( 'UniqueIndex' , '1') ;
Reg.WriteString ( 'UnknownsAsLongVarchar' , '0') ;
Reg.WriteString ( 'UnknownSizes' , '0') ;
Reg.WriteString ( 'UpdatableCursors' , '1') ;
Reg.WriteString ( 'UseDeclareFetch' , '0') ;
Reg.WriteString ( 'Username' , '') ;
Reg.WriteString ( 'UseServerSidePrepare' , '0') ;
Reg.WriteString ( 'XaOpt' , '1') ;
Result := True ;
end
else
Result := False ;
Finally
Reg.CloseKey ;
Reg.Free ;
end ;
except
Result := False ;
end ;
end ;

------
Kevin
kevin2004
資深會員


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2010-04-13 19:04:11 IP:118.161.xxx.xxx 未訂閱
再你看我上面那篇Code時,你要注意幾個地方:
1.因為我的AP中我有用到ByteA-Field-TYpe存放doc/mp3/jpg等格式的資料,所以我
必需將bytea as lo打開
2.如果PostgreSQL在你的AP中是很重要的話,那你要將有關PostgreSQL的操作用
Class包裝起來,而且要用Singleton方式召喚。
3.這些相關的Class就像你在用MSSQL/MySQL/Oracle時你可能都會將相關功能與Code
包裝起來一樣。這我就不多說了。
------
Kevin
系統時間:2024-05-05 7:06:21
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!