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

ADO的OPENSCHEMA

答題得分者是:eaglewolf
vicky3189
一般會員


發表:1
回覆:5
積分:1
註冊:2007-07-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-07-31 18:10:20 IP:218.170.xxx.xxx 訂閱
想請問ADO的高手們,我在網路上找很久都找不到解答

問題一:用ADO的OPENSCHEMA取得欄位結構後
MS SQL 的decimal和numeric無法分別,因回傳的DATA_TYPE都是131
但我下載Wesly大大的工具程式http://delphi.ktop.com.tw/board.php?cid=31&fid=79&tid=58250
他郤可分別,可惜那位大大好都沒回我..><

問題二:目前想改寫成ORACLE可用的版本,但使用Provider=OraOLEDB.Oracle.1
就取不到欄位大小,但同樣的Wesly大大的工具程式就可以...為什麼..><

那位可幫助我咩..><
eaglewolf
資深會員


發表:4
回覆:268
積分:429
註冊:2006-07-06

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-08-08 15:43:59 IP:211.75.xxx.xxx 訂閱
使用MS-SQL 2000
可以利用以下的SQL Command可取得Table內所有欄位的Data Type
SELECT C.name AS Column_Name, T.name AS Type_Name
FROM sysobjects O INNER JOIN
syscolumns C ON O.id = C.id INNER JOIN
systypes T ON C.xtype = T.xtype
WHERE (O.name = your_table_name )
ORDER BY C.colid
------
先查HELP
再查GOOGLE
最後才發問

沒人有義務替你解答問題
在標題或文章中標明很急
並不會增加網友回答速度

Developing Tool:
1.Delphi 6
2.Visual Studio 2005
3.Visual Studio 2008
DBMS:
MS-SQL
vicky3189
一般會員


發表:1
回覆:5
積分:1
註冊:2007-07-19

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-08-08 16:04:54 IP:61.225.xxx.xxx 訂閱
謝謝你的回覆...
因我要寫的工具是希望能for 各家資料庫版本
所以希望用ado物件去取schema
才不用使用各家資料庫特定的語法去取..但還是感謝你的熱心回覆^^

另外問題二已經ok了...其實是取得到欄位大小,只是dbgrid畫面上看不到
且在oracle指定那個物件(user,table)時,一定要傳入大寫才能對回傳值哦

wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-08-08 16:34:49 IP:61.222.xxx.xxx 訂閱
語焉不詳!?

是語法有錯,是以哪一個參數代入。
無法瞭解你的問題。

我記得很久我寫過印出 ACCESS 資料結構表。
是透過 ADOX_TLB CoCatalog 並配合OpenSchema。

給你做參考
vicky3189
一般會員


發表:1
回覆:5
積分:1
註冊:2007-07-19

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-08-08 17:39:07 IP:61.225.xxx.xxx 訂閱
意思是目前我用ADO的OPENSCHEMA已可以取得ORACLE及INFORMIX的結構了
尚還有問題一找不到決解方法

問題一:用ADO的OPENSCHEMA取得欄位結構後
MS SQL 的decimal和numeric無法分別,因回傳的DATA_TYPE都是131

有些還可以用COLUMN_FLAGS來區別,但若連COLUMN_FLAGS都一樣就不知怎麼分判了
如:MS SQL 的decimal和numeric無法分別,因回傳的DATA_TYPE都是131

MSSQL用siProviderTypes取得如下,很多都一樣,和siColumns取得的DATA_TYPE對應要怎麼對哩
6:ftype := 'money';
11:ftype := 'bit';
12:ftype := 'sql_variant';
17:ftype := 'tinyint';
20:ftype := 'bigint';
72:ftype := 'uniqueidentifier';
128:ftype := 'binary';
128:ftype := 'timestamp';
128:ftype := 'image';
128:ftype := 'varbinary';
129:ftype := 'char';
129:ftype := 'text';
129:ftype := 'varchar';
130:ftype := 'nchar';
130:ftype := 'xml';
130:ftype := 'ntext';
130:ftype := 'nvarchar';
131:ftype := 'decimal';
131:ftype := 'numeric';
135:ftype := 'smalldatetime';
135:ftype := 'datetime';

編輯記錄
vicky3189 重新編輯於 2007-08-08 17:41:50, 註解 無‧
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-08-08 17:58:24 IP:61.222.xxx.xxx 訂閱
我無法幫你做測試。這是我以前的程式碼。

for J := 0 To TableX.Columns.Count -1 Do
begin
ColumnX := TableX.Columns[J];

Case ColumnX.Type_ of
adEmpty :S2 := 'Empty';
adTinyInt :S2 := 'TinyInt';
adUnsignedTinyInt :S2 := 'UnsignedTinyInt';
adSmallInt :S2 := '整數';
adInteger :S2 := '長整數';
adBigInt :S2 := 'BigInt';
adUnsignedSmallInt :S2 := 'UnsignedSmallInt';
adUnsignedInt :S2 := 'UnsignedInt';
adUnsignedBigInt :S2 := 'UnsignedBigInt';
adSingle :S2 := '單精度';
adDouble :S2 := '雙精度';
adCurrency :S2 := '貨幣';
adDecimal :S2 := 'Decimal';
adNumeric :S2 := 'Numeric';
adBoolean :S2 := '是/否';
adError :S2 := 'Error';
adUserDefined :S2 := 'UserDefined';
adVariant :S2 := 'Variant';
adIDispatch :S2 := 'IDispatch';
adIUnknown :S2 := 'IUnknown';
adGUID :S2 := 'GUID';
adDate :S2 := '日期/時間';
adDBDate :S2 := 'DBDate';
adDBTime :S2 := 'DBTime';
adDBTimeStamp :S2 := 'DBTimeStamp';
adBSTR :S2 := 'BSTR';
adChar :S2 := 'Char';
adVarChar :S2 := 'VarChar';
adLongVarChar :S2 := '備忘';
adWChar :S2 := 'WChar';
adVarWChar :S2 := '文字';
adLongVarWChar :S2 := '備忘';
adBinary :S2 := 'Binary';
adVarBinary :S2 := 'VarBinary';
adLongVarBinary :S2 := 'LongVarBinary';
adChapter :S2 := 'Chapter';
adFileTime :S2 := 'FileTime';
adPropVariant :S2 := 'PropVariant';
adVarNumeric :S2 := 'VarNumeric';
end;

上面看來是有 adDecimal 、 adNumeric之區分
我說過了 是透過 Catalog -> Tables -> Cloumns 取得。

你可以查 MSDN 。 有結構表
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-08-08 18:01:21 IP:61.222.xxx.xxx 訂閱
據我所知 可以透過三種取得資料結構。 1. Recordset  2 openschema  3 Catalog
不清楚對不對。沒什麼映象了。..
eaglewolf
資深會員


發表:4
回覆:268
積分:429
註冊:2006-07-06

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-08-08 23:55:22 IP:220.132.xxx.xxx 訂閱
在SQL Server的 線上說明有這麼一段話:
[在 SQL Server 中,numeric 資料型別是 decimal 資料型別的同義字。]

所以小弟大膽的臆測,要單純利用openschema 來判定 是numeric 或 decimal可能作不到
另外如果用openschema(siProviderTypes,VarAraayOf([131,Unassigned]),EmptyParam,adoDataSet)去看
可以發現 numeric及decimal兩個除了名稱以外 唯一的差別在於
numeric 的best_match 是true, decimal則是false

------
先查HELP
再查GOOGLE
最後才發問

沒人有義務替你解答問題
在標題或文章中標明很急
並不會增加網友回答速度

Developing Tool:
1.Delphi 6
2.Visual Studio 2005
3.Visual Studio 2008
DBMS:
MS-SQL
編輯記錄
eaglewolf 重新編輯於 2007-08-08 23:55:48, 註解 無‧
vicky3189
一般會員


發表:1
回覆:5
積分:1
註冊:2007-07-19

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-08-09 09:12:18 IP:61.225.xxx.xxx 訂閱
[在 SQL Server 中,numeric 資料型別是 decimal 資料型別的同義字。]
==>是沒錯..但還有其他型別也有同樣的問題,

所以小弟大膽的臆測,要單純利用openschema 來判定 是numeric 或 decimal可能作不到
==>MS SQL 的decimal和numeric無法分別,因回傳的DATA_TYPE都是131
但我下載Wesly大大的工具程式http://delphi.ktop.com.tw/board.php?cid=31&fid=79&tid=58250
他郤可分別,可惜那位大大好都沒回我..><

另外如果用openschema(siProviderTypes,VarAraayOf([131,Unassigned]),EmptyParam,adoDataSet)去看
可以發現 numeric及decimal兩個除了名稱以外 唯一的差別在於
numeric 的best_match 是true, decimal則是false
==>我也有發現,但siColumns取得的相關欄位資訊無法去對應><
vicky3189
一般會員


發表:1
回覆:5
積分:1
註冊:2007-07-19

發送簡訊給我
#10 引用回覆 回覆 發表時間:2007-08-09 09:15:28 IP:61.225.xxx.xxx 訂閱

===================引 用 wameng 文 章===================
據我所知 可以透過三種取得資料結構。 1. Recordset? 2 openschema? 3 Catalog
不清楚對不對。沒什麼映象了。..

我是有看到李維大師的ADO/MTS/COM 專業程式師計篇是用Catalog啦
但因我是要取結構後,重新建同原資料庫所有物件的完整的資料庫
怕是ADOX的資訊會不夠(PK,KF,INDEX,DEFULT.....等物件)
目前是希望能找到OPENSCHEMA的解法
編輯記錄
vicky3189 重新編輯於 2007-08-09 09:16:35, 註解 無‧
eaglewolf
資深會員


發表:4
回覆:268
積分:429
註冊:2006-07-06

發送簡訊給我
#11 引用回覆 回覆 發表時間:2007-08-09 15:05:43 IP:211.75.xxx.xxx 訂閱
Wesly大大已在8/2回覆 http://delphi.ktop.com.tw/board.php?cid=31&fid=79&tid=58250
並在文章中指出 可以判別 是因為 係透過 MS-SQL的sp_columns STORED_PROCEUDRE

另外 在MS-SQL 2000的說明文件中 (data types-SQL Server, ADO)
Mapping Data Types
In rowsets and as parameter values, ADO represents data in Microsoft® SQL Server™ 2000 by using the following data types. The ADO enumerated constant, DataTypeEnum, specifies the data type of the Field and Parameter objects.
SQL Server Data Type ADO Data Type
bigint adBigInt
binary adBinary
bit adBoolean
char adChar
datetime adDBTimeStamp
decimal adNumeric
float adDouble
image adVarbinary
int adInteger
money adCurrency
nchar adWChar
ntext adWChar
numeric adNumeric
nvarchar adWChar
real adSingle
smalldatetime adTimeStamp
smallint adSmallInt
smallmoney adCurrency
sql_variant adVariant
sysname adWChar
text adChar
timestamp adBinary
tinyint adVarbinary
uniqueidentifier adGUID
varbinary adVarbinary
varchar adChar

------
先查HELP
再查GOOGLE
最後才發問

沒人有義務替你解答問題
在標題或文章中標明很急
並不會增加網友回答速度

Developing Tool:
1.Delphi 6
2.Visual Studio 2005
3.Visual Studio 2008
DBMS:
MS-SQL
vicky3189
一般會員


發表:1
回覆:5
積分:1
註冊:2007-07-19

發送簡訊給我
#12 引用回覆 回覆 發表時間:2007-08-09 15:35:51 IP:61.225.xxx.xxx 訂閱
哈...因問一陣子了....還以為Wesly大大沒在上KTOP囉....
因之前那個帳號因MAIL改了..沒收到認證信,(有寄MAIL給站長改MAIL也沒回><)只好新開帳號了

唉....結果還是要用到各家資料庫的語法....也該死心了...
嗚....謝謝大家熱心的幫忙...就此結案了...^^

eaglewolf
資深會員


發表:4
回覆:268
積分:429
註冊:2006-07-06

發送簡訊給我
#13 引用回覆 回覆 發表時間:2007-08-09 15:57:05 IP:211.75.xxx.xxx 訂閱
只能說一切都是MS耍詐~
------
先查HELP
再查GOOGLE
最後才發問

沒人有義務替你解答問題
在標題或文章中標明很急
並不會增加網友回答速度

Developing Tool:
1.Delphi 6
2.Visual Studio 2005
3.Visual Studio 2008
DBMS:
MS-SQL
系統時間:2024-04-26 16:52:34
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!