- PR -

テーブルの型と桁数の取得方法

1
投稿者投稿内容
koko
会議室デビュー日: 2004/09/20
投稿数: 9
投稿日時: 2004-10-10 18:37
はじめまして。KOKOと申します。
新参者ですがよろしくお願いいたします。m(__)m

皆様の知恵を拝借したいのですが、
現在、VB.net2003 + SQLServer2000にて、Windowsアプリを開発しております。

そこで、テーブル名だけを引数として受け取ったら、
グリッド上にデータを表示して編集できるような簡単な
共通マスタメンテ画面を作成しようとしています。

仕組みはシンプルで、データを表示する際のロジックはこんな感じです。

Sub グリッドにデータを表示(ByVal pテーブル名$)

Dim sql$ = "select * from " & pテーブル名$
Dim myConn As New SqlConnection(strCon$)
Dim myDataAdapter As New SqlDataAdapter
Dim ds As New DataSet

myDataAdapter.SelectCommand = New SqlCommand(sql$, myConn)
myConn.Open()
myDataAdapter.Fill(ds)
DataGrid.DataSource = ds.Tables(0)

End Sub

その際に、グリッドの列幅をデフォルト設定ではなく、
テーブルの桁数の取得方法
データの桁数に応じて動的に変更したいと思っています。
(してくれ、といわれたw)

そこで、DB上のデータ型と桁数の定義を取得できれば、
(nvarcharの10とか、intの4とか)
それで、ルールに基づいて列幅を設定しようかと思ってますが、
その、型と桁数の取得方法がわからず困っています。。。
(もしかすると、もうひとつ何らかのデータ型を
 取得するようなSQLを投げないといけない?)

もしご存知の方がいらっしゃれば、ご教授いただければ幸いです。

(もちろん、すべてのセルの中身を精査して、取得した文字列の
レングスから調整するということは考えましたが、
あまり効率のいいやり方と思えないので、できれば別の方法で
実現したいと思っています。
(後学のためにも、ぜひ知っておきたいと。。))

よろしくお願いいたします。
えムナウ
大ベテラン
会議室デビュー日: 2004/06/10
投稿数: 187
お住まい・勤務地: 東京
投稿日時: 2004-10-10 21:45
DataColumn.MaxLength プロパティ にお望みのデータがあると思ったら、ここには入っていませんでしたね。
ここのデータは、セットしたら制限が働くようです。

SqlParameter.Size プロパティで string の場合列内のデータの最大サイズをバイト単位で取得できます。
SqlParameter.SqlDbType プロパティか SqlParameter.DbType プロパティでType が取得できます。

InsertCommand を作っているのであれば、myDataAdapter.InsertCommand.Parameters[i].Size で取得できます。
グリッド上にデータを表示して編集するからには作ってますよね。
_________________
えムナウ Microsoft MVP for Visual Developer - C#,2005/01-2007/12
えムナウのプログラミングのページ Blog1 Blog2
nanbu
大ベテラン
会議室デビュー日: 2004/08/19
投稿数: 178
投稿日時: 2004-10-10 22:02
引用:

kokoさんの書き込み (2004-10-10 18:37) より:

その際に、グリッドの列幅をデフォルト設定ではなく、
テーブルの桁数の取得方法
データの桁数に応じて動的に変更したいと思っています。
(してくれ、といわれたw)

そこで、DB上のデータ型と桁数の定義を取得できれば、
(nvarcharの10とか、intの4とか)
それで、ルールに基づいて列幅を設定しようかと思ってますが、
その、型と桁数の取得方法がわからず困っています。。。
(もしかすると、もうひとつ何らかのデータ型を
 取得するようなSQLを投げないといけない?)



南部です。

動的に変更するといっても、限度があるとは思いますが、
(varchar(2000)とかいってもね、、)
とりあえず、SQLServer2000だと、こんな感じでしょうか。
select
a.name, b.name, a.length
from
syscolumns a, systypes b
where
id = object_id('テーブル名') and a.xtype=b.xtype
order by a.colid
rvmx
大ベテラン
会議室デビュー日: 2002/09/26
投稿数: 184
お住まい・勤務地: 愛媛県
投稿日時: 2004-10-11 10:52
今日は

myDataAdapter.Fill(ds)
の所に下記を追加すると、DataColumn.MaxLengthやその他の情報も見えます。
myDataAdapter.FillSchema(ds, SchemaType.Mapped)

koko
会議室デビュー日: 2004/09/20
投稿数: 9
投稿日時: 2004-10-12 11:06
KOKOです。

えムナウ様、nanbu様、rvmx様:
早速の有益な情報の提供ありがとうございます。

> グリッド上にデータを表示して編集するからには作ってますよね。
うう。。。
基本的に、テーブル名だけを受け取って、
Select以外は、SqlCommandBuilderで作成していたのですが。。
試してみましたが、SqlCommandBuilderで各コマンドを生成した場合、
Parametersの値はどうも入っていないようです。これが取れれば一番よかったのですが。。。

FillSchemaですか!これは便利ですね。
SqlDbTypeとかは取れないようですが、
MaxLength等の情報が見えるようになるのは何かと役に立ちそうです。

さしあたってはnanbu様に教えていただいたSQLを同時に発行する方法を検討していますが、
(varchar(2000)とかいわれたら、もちろん途中で切るような形になりますが。。)
せっかくなので、事前にデータアダプタを作成しておくとか、単純にMaxLengthで
サイズを切るような方法も含めて再検討してみたいと思います。

ありがとうございました。m(__)m
1

スキルアップ/キャリアアップ(JOB@IT)