DOBON.NET DOBON.NETプログラミング掲示板過去ログ

フィールドのサイズを得るには?(ADO.NET)

環境/言語:[WIN XP,VB.NET]
分類:[.NET]

次のようなコードで、フィールド名やフィールドの属性が取得できる状態ですが、
ここで、属性が文字列だった場合、フィールドサイズも知りたいのですが、
どうしたらいいでしょうか? myReaderのプロパティは探したのですが、
見つかりません。

Dim myConnection As New SqlConnection(myConnString)
myConnection.Open()
Dim myCommand As SqlCommand = myConnection.CreateCommand()
Dim FTYPE
Dim myReader As SqlDataReader
myCommand.Connection = myConnection
myCommand.CommandText = "SELECT * FROM CFG "
myReader = myCommand.ExecuteReader()
FTYPE = myReader.FieldCount
myReader.Read()
FTYPE = myReader.Item("DATA") '値の取得
FTYPE = myReader.GetName(2) '列名の取得
FTYPE = myReader.GetSqlValue(1) '列の属性
FTYPE = myReader.GetDataTypeName(1) '列の属性名
■No10757に返信(セリカさんの記事)
> 次のようなコードで、フィールド名やフィールドの属性が取得できる状態ですが、
> ここで、属性が文字列だった場合、フィールドサイズも知りたいのですが、
> どうしたらいいでしょうか? myReaderのプロパティは探したのですが、
> 見つかりません。
>
> Dim myConnection As New SqlConnection(myConnString)
> myConnection.Open()
> Dim myCommand As SqlCommand = myConnection.CreateCommand()
> Dim FTYPE
> Dim myReader As SqlDataReader
> myCommand.Connection = myConnection
> myCommand.CommandText = "SELECT * FROM CFG "
> myReader = myCommand.ExecuteReader()
> FTYPE = myReader.FieldCount
> myReader.Read()
> FTYPE = myReader.Item("DATA") '値の取得
> FTYPE = myReader.GetName(2) '列名の取得
> FTYPE = myReader.GetSqlValue(1) '列の属性
> FTYPE = myReader.GetDataTypeName(1) '列の属性名
>

残念ながら、IDataReaderクラスにフィールドのサイズに関するプロパティがありあませんねぇ...
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpguide/html/cpconmappingnetdataproviderdatatypestonetframeworkdatatypes.asp
DAOにはあるのですが...
どうしても必要ならば、SQLコマンドで取得してはどうでしょうか?
返事ありがとうございます。

> どうしても必要ならば、SQLコマンドで取得してはどうでしょうか?
そうですか。ADOにもあったのですが。
SQLコマンドでも取れるんですね。
もしご存知なら、そのコマンドを教えてもらえますでしょうか?
>残念ながら、IDataReaderクラスにフィールドのサイズに関するプロパティがありあませんねぇ...
GetSchemaTable メソッドで取得できるテーブルの ColumnSize
とは違いますか?。
[IDataReader.GetSchemaTable メソッド]
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemdataidatareaderclassgetschematabletopic.asp
うまくいきました。
下記で出来ました。
本当は TB.BeginLoadData()を使うのではないかと想像しますが、
LoadDataRowのサンプルでは私にはSIZEの行には行けませんでした。
目的は達成できているのでこれでよしとします。
ありがとうございました。

Dim TB As DataTable
<中略・・・前回と同じ>
TB = myReader.GetSchemaTable
For Each r As DataRow In TB.Rows
FTYPE = r(0)
If FTYPE = "DATA" Then
FSIZE = r(2)
Exit For
End If
Next
TB.Dispose()
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板