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

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

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

Re[3]: フィールドサイズ取得について教えてください


(過去ログ 25 を表示中)

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

■11666 / inTopicNo.1)  フィールドサイズ取得について教えてください
  
□投稿者/ なまもの (1回)-(2007/12/19(Wed) 19:17:41)

分類:[C#] 

2007/12/19(Wed) 19:18:54 編集(投稿者)
2007/12/19(Wed) 19:18:47 編集(投稿者)

初めまして「なまもの」と申します。
開発環境は、「Visual Studio 2005」、使用データベースは「SQL Server2005」、
OSは「XP」です。最近になり VBからC#に移行しました。

SQLサーバーで作成したテーブルのフィールド(データ型は文字列型「nvarchar」)から
フィールドサイズを取得する方法をご存知でしたら、教えて頂けます様御願い致します。

「System.Data.SqlClient.SqlDataReader」クラスの「GetBytes()」メソッド実行時に
「InvalidOperationExceptionはユーザーコードによってハンドルされませんでした。」
「存在しないデータを読み取ろうとしました。」とエラーで返されました。

同クラスの「GetName()」メソッドで、フィールド名は正常に取得できていますので
テーブルが参照できていない様な状態では無いようです。「GetBytes()」の引数の
使い方が分かっていないだけだと思われます。ヘルプを見ても使用例が書いておらず、
解説内の「dataIndex」くらいしか意味が分かりませんでした。

実際のソースを記載致します。「GetBytes」の行だけ見て頂ければ良いと思います。


PS.
このサイトの記事検索で、全ログから「フィールド (AND) サイズ」で検索しましても、
この件についての記載がありませんでした。
もしかして「知ってて当たり前」な事なのでしょうか?無知ですいません。


private void TEST_FieldSize_Get()
{
System.Data.SqlClient.SqlConnection SC;
System.Data.SqlClient.SqlDataReader SDR;
string[,] Tb_Field; // テーブルのフィールド情報を格納

// データベースファイルの情報
string myStr = "Data Source=TEST_DS;Initial Catalog=TEST_DB;"
+ "Integrated Security=True;Connection Timeout=30";
SC = new System.Data.SqlClient.SqlConnection(myStr);
SC.Open();

// テーブルの情報
myStr = "SELECT TOP 1 * FROM [テストテーブル]";
System.Data.SqlClient.SqlCommand com = new System.Data.SqlClient.SqlCommand(myStr, SC);
SDR = com.ExecuteReader();

// フィールド情報を Tb_Field[,] に保存
Tb_Field = new string[SDR.FieldCount, 2]; // [フィールド件数(0〜X), 項目(0:名称 1:サイズ)]
for (int i = 0; i < SDR.FieldCount; i++) // テストテーブルの全フィールド件数繰り返す
{
Tb_Field[i, 0] = SDR.GetName(i); // フィールド名を保存(この書式で問題ありませんでした)

//////////////////////////////////////////////////////////////////////////////////////////
// ※※※ GetBytesは、実行時にエラーになる様です。 ※※※ //
Tb_Field[i, 1] = SDR.GetBytes(0, i, null, 0, 0).ToString(); // サイズ(文字列型で保存)
//////////////////////////////////////////////////////////////////////////////////////////
}
SDR.Close();
SC.Close();
}


引用返信 編集キー/
■11676 / inTopicNo.2)  Re[1]: フィールドサイズ取得について教えてください
□投稿者/ やじゅ (27回)-(2007/12/19(Wed) 22:58:17)
やじゅ さんの Web サイト
No11666 (なまもの さん) に返信
> 2007/12/19(Wed) 19:18:54 編集(投稿者)
> 2007/12/19(Wed) 19:18:47 編集(投稿者)
>
> SQLサーバーで作成したテーブルのフィールド(データ型は文字列型「nvarchar」)から
> フィールドサイズを取得する方法をご存知でしたら、教えて頂けます様御願い致します。
>

「フィールドサイズ取得」でググっただけですが、いかがでしょう
DataReader の GetSchemaTable メソッドと Visual Basic .NET を使用して列スキーマを取得する方法
http://support.microsoft.com/kb/310108/ja

引用返信 編集キー/
■11718 / inTopicNo.3)  Re[2]: フィールドサイズ取得について教えてください
□投稿者/ なまもの (2回)-(2007/12/20(Thu) 14:45:01)
No11676 (やじゅ さん) に返信

>>やじゅ さん
ありがとうございました。

http://support.microsoft.com/kb/310108/ja」を参考にしましたら
問題解決致しました。(例題がVBでしたが、C#にも簡単に応用できました)

「SqlDataReader」クラスの「GetBytes()」の使い方は、結局分からず
仕舞いでしたが、「DataTable」と「DataRow」を使用すれば、目的の
フィールドサイズ取得ができましたので、アレはもういいです。
前回のソースを修正し、下記に記載致しましたので、この件でお悩みの
方がいらっしゃいましたら、ご活用下さい。

PS.
フィールドサイズ取得するだけで、丸1日かかってしまいました・・・。
この先まだまだ、壁にぶつかりそうですので、また来るかも知れません。
その際は、ご指導頂けます様、よろしく御願い致します。
いつか、教える側になれたら良いのですが、まだ先の事でしょうね・・・。

private void TEST_FieldSize_Get()
{
System.Data.SqlClient.SqlConnection SC;
System.Data.SqlClient.SqlDataReader SDR;
System.Data.DataRow DR;
string[,] Tb_Field; // テーブルのフィールド情報を格納

// データベースファイルの情報
string myStr = "Data Source=TEST_DS;Initial Catalog=TEST_DB;"
+ "Integrated Security=True;Connection Timeout=30";
SC = new System.Data.SqlClient.SqlConnection(myStr);
SC.Open();

// テーブルの情報
myStr = "SELECT TOP 1 * FROM [テストテーブル]";
System.Data.SqlClient.SqlCommand com = new System.Data.SqlClient.SqlCommand(myStr, SC);
SDR = com.ExecuteReader();
//////////////////////////////////////////////////////////////////////////////////////////
// DataTableクラスのオブジェクトを使用する様に修正しました //
System.Data.DataTable DT = SDR.GetSchemaTable();
//////////////////////////////////////////////////////////////////////////////////////////

// フィールド情報を Tb_Field[,] に保存
Tb_Field = new string[SDR.FieldCount, 2]; // [フィールド件数(0〜X), 項目(0:フィールド名 1:サイズ)]
for (int i = 0; i < SDR.FieldCount; i++) // テストテーブルの全フィールド件数繰り返す
{
//////////////////////////////////////////////////////////////////////////////////////////
// SqlDataReaderの使用をやめて、DataTableのフィールド情報をDataRowに写す方法に変更 //
DR = DT.Rows[i]; // DataRowクラスのオブジェクトにフィールド情報を写す
Tb_Field[i, 0] = DR[0].ToString(); // DataRowクラスの[0]がフィールド名の様です。
Tb_Field[i, 1] = DR[2].ToString(); // DataRowクラスの[2]がフィールドサイズの様です。
//////////////////////////////////////////////////////////////////////////////////////////
}
SDR.Close();
SC.Close();
}

解決済み
引用返信 編集キー/
■11726 / inTopicNo.4)  Re[3]: フィールドサイズ取得について教えてください
□投稿者/ まさる (14回)-(2007/12/20(Thu) 15:12:39)
No11718 (なまもの さん) に返信

> 「SqlDataReader」クラスの「GetBytes()」の使い方は、結局分からず
> 仕舞いでしたが、

解決されたようですが、分からないことはまずMSDNライブラリを読む癖をつけておくと、この先役に立つと思いますよ。

SqlDataReader.GetBytes メソッド
http://msdn2.microsoft.com/ja-jp/library/system.data.sqlclient.sqldatareader.getbytes(VS.80).aspx
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -