如何以程式下令建pg-db的DSN |
答題得分者是:kevin2004
|
limary
初階會員 ![]() ![]() 發表:41 回覆:109 積分:30 註冊:2007-01-11 發送簡訊給我 |
|
kevin2004
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:18 回覆:463 積分:416 註冊:2005-05-29 發送簡訊給我 |
|
limary
初階會員 ![]() ![]() 發表:41 回覆:109 積分:30 註冊:2007-01-11 發送簡訊給我 |
|
kevin2004
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:18 回覆:463 積分:416 註冊:2005-05-29 發送簡訊給我 |
參考以下碼,稍作變化即可
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 發送簡訊給我 |
再你看我上面那篇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 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |