C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: DBの数値型カラムのサイズを取得する方法


(過去ログ 136 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■80368 / inTopicNo.1)  DBの数値型カラムのサイズを取得する方法
  
□投稿者/ OsaKoi (1回)-(2016/07/11(Mon) 21:45:30)

分類:[VB.NET/VB2005 以降] 

早速ですが、VB6.0のRDOを使用したシステムをVS2013のVB.NETへコンバージョンしています。
このシステムは、ODBCを使用し、複数のDB(Oracle,SqlServer,Access)よりデータを検索するシステムです。
そこで、現在解決できない問題に直面しており、知恵をお借りしたく投稿させて頂きました。
問題とは、DBのカラム型が数値の場合に、サイズが取得出来ないのです。
ちなみに、文字型の場合は、取得出来ます。
データ型取得ソースコードを下記に記載します。
---ソースコード-----------------------------------------
Imports System.Data.odbc

Dim _con As OdbcConnection = Nothing
Dim sql As String
Dim ds As New DataSet

_con = New odbcConnection
_con.ConnectionString = "UID=testuser;PWD=test;DSN=OracleOdbc;DRIVER={Oracle ODBC Driver}"

'テストテーブルカラム定義内容
'文字列項目:VarChar2(500)
'数値項目:Number(5,2)

sql = " Select 文字列項目,数値項目 from テストテーブル"

Dim SchemaDA as New odbcDataAdapter(sql,_con)

SchemaDA.FillSchema(ds, SchemaType.Source)
For i = 0 To ds.Tables.Item(0).Columns.Count -1
  Debug.Print(ds.Tables.Item(0).Columns(i).ColumnName.Tostring)    'カラム名
  Debug.Print(ds.Tables.Item(0).Columns(i).DataType.Name.Tostring) '型名
  Debug.Print(ds.Tables.Item(0).Columns(i).MaxLength.Tostring)     '桁数
Next
---実行結果---------------------------------------------
VARCHAR2(500)
String
500
NUMBER(5,2)
Decimal
-1
--------------------------------------------------------
数値項目のサイズを、整数部、小数部毎に取得する方法を教えてください。

引用返信 編集キー/
■80369 / inTopicNo.2)  Re[1]: DBの数値型カラムのサイズを取得する方法
□投稿者/ daive (122回)-(2016/07/12(Tue) 08:20:41)
2016/07/12(Tue) 09:24:05 編集(投稿者)

見直したら役に立たないので、削除します。失礼しました。
引用返信 編集キー/
■80370 / inTopicNo.3)  Re[2]: DBの数値型カラムのサイズを取得する方法
□投稿者/ kaina (14回)-(2016/07/12(Tue) 09:28:49)
Oracleのリンクテーブルをaccessで使用しているということですね。
でしたら、ALL_TAB_COLUMNSビューのDATA_PRECISIONとDATA_SCALEから
取得すると良いかと思います。

以下はOracleの11.2のリファレンスです。
https://docs.oracle.com/cd/E16338_01/server.112/b56311/statviews_2103.htm

引用返信 編集キー/
■80373 / inTopicNo.4)  Re[1]: DBの数値型カラムのサイズを取得する方法
□投稿者/ 魔界の仮面弁士 (764回)-(2016/07/12(Tue) 12:32:45)
No80368 (OsaKoi さん) に返信
> 問題とは、DBのカラム型が数値の場合に、サイズが取得出来ないのです。
rdoColumn は ODBC の型システムに基づいていましたが、
DataColumn は .NET 側の型システムに基づいています。

特定のデータベースの橋渡しを担うのは、OdbcDataAdapter や
OdbcParameter の役目です。DataTable が持つスキーマ情報は
ODBC データソースが持つそれとは若干異なります。

数値型にしろ日付型にしろ、Access/SQL Server/Oracle/.NET それぞれで
精度も最大値・最小値も異なりますので、どうしても丸めが発生します。



> データ型取得ソースコードを下記に記載します。

'ODBC Driver によっては、テーブル名の両端に「"」が必要なケースがあります
'Dim tableName As String = """" & TextBox1.Text & """"
Dim tableName As String = TextBox1.Text

Dim tbl As DataTable = _con.GetSchema("Columns", New String() {Nothing, Nothing, tableName})
For Each row As DataRowView In New DataView(tbl, "", "ORDINAL_POSITION", DataViewRowState.CurrentRows)
 Debug.Print(row("COLUMN_NAME"))
 Debug.Print(vbTab & " 型:" & row("TYPE_NAME"))
 Debug.Print(vbTab & "長さ:" & row("LENGTH"))
 Debug.Print(vbTab & "精度:" & row("PRECISION"))
 Debug.Print(vbTab & "桁数:" & row("SCALE"))
 Debug.Print(vbTab & "基数:" & row("RADIX"))
 Debug.Print(vbTab & "null:" & row("NULLABLE"))
 Debug.Print(vbTab & "列順:" & row("ORDINAL_POSITION"))
Next


Connection クラスの GetSchema メソッドは、VB6 でいうところの
ADODB.Connection オブジェクトの OpenSchema メソッドに相当します。

上記で使った "Columns" スキーマの他にも、"Indexes" や "ProcedureColumns" など、
様々な問い合わせが行えるので、調べてみて下さい。


なお、ODBC では取得できないデータベース固有情報を得る場合は、
OleDbConnection.GetOleDbSchemaTable メソッドを試してみるのも良いかと思います。
引用返信 編集キー/
■80383 / inTopicNo.5)  Re[2]: DBの数値型カラムのサイズを取得する方法
□投稿者/ OsaKoi (2回)-(2016/07/12(Tue) 22:31:06)
No80373 (魔界の仮面弁士 さん) に返信
> ■No80368 (OsaKoi さん) に返信
>>問題とは、DBのカラム型が数値の場合に、サイズが取得出来ないのです。
> rdoColumn は ODBC の型システムに基づいていましたが、
> DataColumn は .NET 側の型システムに基づいています。
>
> 特定のデータベースの橋渡しを担うのは、OdbcDataAdapter や
> OdbcParameter の役目です。DataTable が持つスキーマ情報は
> ODBC データソースが持つそれとは若干異なります。
>
> 数値型にしろ日付型にしろ、Access/SQL Server/Oracle/.NET それぞれで
> 精度も最大値・最小値も異なりますので、どうしても丸めが発生します。
>
>
>
>>データ型取得ソースコードを下記に記載します。
>
> 'ODBC Driver によっては、テーブル名の両端に「"」が必要なケースがあります
> 'Dim tableName As String = """" & TextBox1.Text & """"
> Dim tableName As String = TextBox1.Text
>
> Dim tbl As DataTable = _con.GetSchema("Columns", New String() {Nothing, Nothing, tableName})
> For Each row As DataRowView In New DataView(tbl, "", "ORDINAL_POSITION", DataViewRowState.CurrentRows)
>  Debug.Print(row("COLUMN_NAME"))
>  Debug.Print(vbTab & " 型:" & row("TYPE_NAME"))
>  Debug.Print(vbTab & "長さ:" & row("LENGTH"))
>  Debug.Print(vbTab & "精度:" & row("PRECISION"))
>  Debug.Print(vbTab & "桁数:" & row("SCALE"))
>  Debug.Print(vbTab & "基数:" & row("RADIX"))
>  Debug.Print(vbTab & "null:" & row("NULLABLE"))
>  Debug.Print(vbTab & "列順:" & row("ORDINAL_POSITION"))
> Next
>
>
> Connection クラスの GetSchema メソッドは、VB6 でいうところの
> ADODB.Connection オブジェクトの OpenSchema メソッドに相当します。
>
> 上記で使った "Columns" スキーマの他にも、"Indexes" や "ProcedureColumns" など、
> 様々な問い合わせが行えるので、調べてみて下さい。
>
>
> なお、ODBC では取得できないデータベース固有情報を得る場合は、
> OleDbConnection.GetOleDbSchemaTable メソッドを試してみるのも良いかと思います。

魔界の仮面弁士さん、daiveさん、 kaina さん、いろいろありがとう御座いました。
daiveさんの投稿を手掛かりにして、いろいろと試してみたところ、
魔界の仮面弁士さんのご説明通りの処理にたどり着きました。
本当にありがとう御座いました。
無事に解決致しました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -