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

WinPgAP-SetUp之五_如何自動建DB的DSN項

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


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-08-16 07:05:04 IP:61.219.xxx.xxx 未訂閱
建好資料庫了,我還要加及設這個資料庫的ODBC-DSN。尤其因為我有用到
WinPostgreSQL的Blob欄位,這個DSN還要作特殊設定,否則根本不能用。我要跟
User講如何新增及設定這個項目,也要講老半天才行。可否自動作這個新增及
設定的動作。
kevin2004
資深會員


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-08-17 13:38:55 IP:61.219.xxx.xxx 未訂閱
這個很簡單,不要想的太複雜了,它只是ODBC-DSN而已。你進Regedi32,用你已建
好的一個WinPgOdbcDsn名去找就可以了。找到了依樣葫蘆就好了。
不過你一定要見個此WinPg的關鍵資料庫postgres的DSN才可以順利執行後面的作業
------
Kevin
kevin2004
資深會員


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-08-17 13:56:15 IP:61.219.xxx.xxx 未訂閱
留給你作習題了。
------
Kevin
kevin2004
資深會員


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-08-17 13:57:49 IP:61.219.xxx.xxx 未訂閱
一、unit中
implementation
uses
....
const
ODBC_ROOT_KEY = HKEY_LOCAL_MACHINE ;
ODBC_DSN_REGIST_KEY = '\SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources';
ODBC_DSN_DETAIL_KEY = '\SOFTWARE\ODBC\ODBC.INI' ;

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


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-08-17 14:00:01 IP:61.219.xxx.xxx 未訂閱
function TODBCObject.IsDsnExist(ThisDSNName : String ) : Boolean ;
begin
Result:=(Reg_KeyExists(ODBC_ROOT_KEY,ODBC_DSN_DETAIL_KEY '\' ThisDSNName))or
(RegItemIsExist(ODBC_ROOT_KEY,ODBC_DSN_REGIST_KEY,ThisDSNName));
end ;
function TODBCObject.KillThisDsnOK ( ThisDSNName : String ) : Boolean ;
begin
Result :=
(Reg_DeleteKeyOK(ODBC_ROOT_KEY,ODBC_DSN_DETAIL_KEY '\' ThisDSNName)) or
(Reg_DeleteValueOK(ODBC_ROOT_KEY,ODBC_DSN_REGIST_KEY,ThisDSNName)) ;
end ;
Function TPostgreSQLObject.CreateMasterDbDsnOK (
ThisDSNName : string ; // 如PostgresDB_PG
ThisServerNameOrIP : string ; // 如192.168.1.110
ThisPort : string = '5432' ) : Boolean ;
begin
Result := CreateDbDsnOK (
ThisDSNName , // 如MyToolSDB_PG
'postgres' , // postgreSQL主DB固定為postgres
ThisServerNameOrIP , // 如192.168.1.110
ThisPort ) ;
end ;
Function TPostgreSQLObject.CreateDbDsnOK (
ThisDSNName : string ; // 如MyToolSDB_PG
ThisDataBase : string ; // 如MyToolSDB
ThisServerNameOrIP : string ; // 如192.168.1.110
ThisPort : string = '5432' ) : Boolean ;
var
Reg : TRegistry ;
begin
Result := False ;
// ============================================================
// 安全起見,要清除舊的DSN記錄。先殺與此DSN同名的舊Key
// ============================================================
if FoundDbDsn(ThisDSNName) then
if Not AP_GetODBCObject.KillThisDsnOK ( ThisDSNName ) then
begin
File_Msg('通知閣下:清除舊有[' ThisDSNName ']失敗。將會自動覆寫到新值');
end ;
try
// ============================================================
// 先建較少項目者
// ============================================================
try
Reg := TRegistry.Create ;
Reg.RootKey := ODBC_ROOT_KEY ;
if Reg.OpenKey ( ODBC_DSN_REGIST_KEY , True ) then
// true表如此key不存在時,先CreateKey
begin
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') ;
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
limary
初階會員


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-08-17 16:37:52 IP:61.219.xxx.xxx 未訂閱
想不到,問題竟然如此就解決了。太感謝了。
謝謝前輩。
系統時間:2024-11-21 16:33:28
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!