- PR -

C#.NETでDataSet()を使用してByte配列の受け渡しかた

1
投稿者投稿内容
のり
会議室デビュー日: 2005/05/22
投稿数: 7
お住まい・勤務地: 東京都在住
投稿日時: 2005-05-22 01:46
現在C#.NETを使用して開発を行なっています。
ExcelのファイルをBinaryデータとしてDBに登録するのですが
その際に、別のクラスへ値を受け渡すのですが開発の規約により
DataSetを使用して受け渡さなければなりません。
ソースは以下のようになっています。

a.class
----------------------------------------------------------------------
byte[] data;
Stream st = InputFile.PostedFile.InputStream;
data = new byte[InputFile.PostedFile.ContentLength];
st.Read(data,0,InputFile.PostedFile.ContentLength);

DataSet ds = new DataSet();
ds.Tables.Add("A");
ds.Tables["A"].Columns.Add("KeyData");
ds.Tables["A"].Columns.Add("BinaryData");
object[] objArray = new object[2];
oArray[0] = "keydata";
oArray[1] = data;
ds.Tables["A"].Rows.Add(objArray);
----------------------------------------------------------------------

b.class
----------------------------------------------------------------------
string strkey = (string)ds.Tables["A"].Rows[0]["KeyData"];
byte[] BinData = (byte[])ds.Tables["A"].Rows[0]["BinaryData"];
----------------------------------------------------------------------

このような感じで渡したいのですがこれでは
「指定されたキャストは有効ではありません。」
となってしまいエラーになってしまいます。
一応、私のほうでも調べてみたのですが分かりませんでした。
どなたか教えて頂けないでしょうか?
よろしくお願いします。
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2005-05-22 02:04
NAL-6295です。

うまくいかない原因は配列の内容が入っているのではなく、その配列をToStringした結果が格納されているから。
byte型の配列なので、"System.Byte[]"という文字列が格納されているからです。


ds.Tables["A"].Columns.Add("BinaryData");

で型指定をしないで追加された項目があるとして、
一度、

コード:

System.Diagnostics.Debug.WriteLine(ds.Tables["A"].Rows[0]["BinaryData"].GetType().Name);



こんなコードを書けばきっと、"string"と出力される事でしょう。
で、格納されている値は"System.Byte[]"という文字列です。

ついでに直接的な解決策だけを言えば、
コード:

ds.Tables["A"].Columns.Add("BinaryData",typeof(byte[]));



で、バイト配列が格納されますよ。


[ メッセージ編集済み 編集者: NAL-6295 編集日時 2005-05-22 02:06 ]
のり
会議室デビュー日: 2005/05/22
投稿数: 7
お住まい・勤務地: 東京都在住
投稿日時: 2005-05-22 03:14
>>NAL-6295さん
早速の返答ありがとうございます。

引用:

うまくいかない原因は配列の内容が入っているのではなく、
その配列をToStringした結果が格納されているから。
byte型の配列なので、"System.Byte[]"という文字列が格納されているからです。


そうですか、ToStringした結果が格納されていたんですね。
Object型が格納されていると思っていました。

引用:

コード:
ds.Tables["A"].Columns.Add("BinaryData",typeof(byte[])); 




DataSetのテーブルに列を追加する時に型を指定できるんですね。
私の調査不足でした。
今回の開発で初めてC#.NETを使用して開発したので知識が足りませんでした。
今は自宅にいるので確認できませんので会社に行った時に確認してみます。
その時にまた結果を報告させてもらいます。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2005-05-22 05:54
諸農です。

引用:

DataSetのテーブルに列を追加する時に型を指定できるんですね。



開発規約でDataSetを使用することが決められているなら、
型付きのDataSetの使用を提案・検討されてみてはいかがでしょうか。
インタフェース間違いのリスクが軽減できそうです。

_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
のり
会議室デビュー日: 2005/05/22
投稿数: 7
お住まい・勤務地: 東京都在住
投稿日時: 2005-05-22 21:19
>>Jubeiさん
ご意見ありがとうございます。
引用:
開発規約でDataSetを使用することが決められているなら、
型付きのDataSetの使用を提案・検討されてみてはいかがでしょうか。
インタフェース間違いのリスクが軽減できそうです。


そうですね、リスクが軽減出来るなら開発規約へ組み込んでもらえると思います。
明日、提案をしてみます。
のり
会議室デビュー日: 2005/05/22
投稿数: 7
お住まい・勤務地: 東京都在住
投稿日時: 2005-05-23 12:13
のりです。
>>NAL-6295、Jubeiさん
ご意見ありがとうございました。

本日、確認したところ正常に値を受け渡しDBへ登録することが出来ました。
本当にありがとうございました。
1

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