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

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

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

Re[10]: objectのテキスト変換方法教えてください。


(過去ログ 72 を表示中)

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

■41772 / inTopicNo.1)  objectのテキスト変換方法教えてください。
  
□投稿者/ 裕猫 (11回)-(2009/09/30(Wed) 11:31:00)

分類:[C#] 

サーバーWindows2000+Oracle10g(RAW)SIJSテキスト16バイト 7バイト英数字、7バイト英数字、2バイト数字という構成になっています。
7バイト英数字、7バイト英数字、2バイト数字はオブジェクトとしてとれているようですが、それをlabel1に表示するところでつまっています。
                cn.Open();
                MessageBox.Show("接続");
                OracleDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    byte[] byteArray = Encoding.Unicode.GetBytes(dr[0].ToString());
                    label1.Text = Encoding.Unicode.GetString(byteArray);
                    //label2.Text = Encoding.Unicode.GetString(dr[1]);
                    //label3.Text = Encoding.Unicode.GetString(dr[2]);
                    MessageBox.Show("次");
というコードを書きましたが、label1にはSystem.Byte[]という文字しか表示されません。変換がまずいということはわかっているのですがどう書いたら正しく表示できるのか、教えていただけないでしょうか? よろしくお願いいたします。
開発環境はVS2008ProのC#です。os XP

引用返信 編集キー/
■41788 / inTopicNo.2)  Re[1]: objectのテキスト変換方法教えてください。
□投稿者/ επιστημη (2177回)-(2009/09/30(Wed) 16:05:27)
επιστημη さんの Web サイト
*ひょっとしたら*
label1.Text = Encoding.GetEncoding("shift-jis").GetString(dr[0]);

引用返信 編集キー/
■41790 / inTopicNo.3)  Re[2]: objectのテキスト変換方法教えてください。
□投稿者/ 裕猫 (12回)-(2009/09/30(Wed) 16:45:58)
No41788 (επιστημη さん) に返信
> *ひょっとしたら*
> label1.Text = Encoding.GetEncoding("shift-jis").GetString(dr[0]);
>
アドバイスありがとうございます。早速試してみたところ
エラー 1 'System.Text.Encoding.GetString(byte[])' に最も適しているオーバーロード メソッドには無効な引数がいくつか含まれています。
エラー 2 引数 '1': 'object' から 'byte[]' に変換できません。
の2つのエラーが出てしまいました。7バイト英数字、7バイト英数字、2バイト数字はoracle内部ではバイナリーデータで保存されているようです。呼び出しにはODAを使用しています。そのあたりに何かあるのかな?

引用返信 編集キー/
■41792 / inTopicNo.4)  Re[3]: objectのテキスト変換方法教えてください。
□投稿者/ επιστημη (2178回)-(2009/09/30(Wed) 17:06:33)
επιστημη さんの Web サイト
> エラー 2 引数 '1': 'object' から 'byte[]' に変換できません。

えーと...んじゃ dr[0] を byte[] にキャストしたらどうなります?

引用返信 編集キー/
■41830 / inTopicNo.5)  Re[1]: objectのテキスト変換方法教えてください。
□投稿者/ よねKEN (416回)-(2009/09/30(Wed) 23:43:38)
No41772 (裕猫 さん) に返信
> サーバーWindows2000+Oracle10g(RAW)SIJSテキスト16バイト 7バイト英数字、7バイト英数字、2バイト数字という構成になっています。
> 7バイト英数字、7バイト英数字、2バイト数字はオブジェクトとしてとれているようですが、それをlabel1に表示するところでつまっています。

> byte[] byteArray = Encoding.Unicode.GetBytes(dr[0].ToString());
> label1.Text = Encoding.Unicode.GetString(byteArray);

このコードが仮に正しいとすると
label1.Text = dr[0].ToString();
とするだけでよいはずです。

しかし、結果は、

> というコードを書きましたが、label1にはSystem.Byte[]という文字しか表示されません。

ということなので、dr[0]の中身はbyte配列だということだと思います。

> サーバーWindows2000+Oracle10g(RAW)SIJSテキスト16バイト 7バイト英数字、7バイト英数字、2バイト数字という構成になっています。

この部分の説明の意味を私はよく理解できていないのですが、
これがそのbyte配列の中身の構成だとしたら、以下のような感じで切り出せるのでは?

byte[] byteArray = (byte[])dr[0];
Encoding SJIS = Encoding.GetEncoding("Shift_JIS");
string _SJISテキスト16バイト = SJIS.GetString(byteArray, 0, 16);
string _7バイト英数字1 = SJIS.GetString(byteArray, 16, 7);
string _7バイト英数字2 = SJIS.GetString(byteArray, 23, 7);
string _2バイト数字 = SJIS.GetString(byteArray, 30, 2); // 数値じゃなくて数字なんですよね?

#かなり想像をまじえて答えているので、あっているかどうかはあまり自信なし
引用返信 編集キー/
■41837 / inTopicNo.6)  Re[2]: objectのテキスト変換方法教えてください。
□投稿者/ 裕猫 (13回)-(2009/10/01(Thu) 09:12:57)
No41792 (επιστημη) に返信
>えーと...んじゃ dr[0] を byte[] にキャストしたらどうなります?
よねKEN さんの方法がキャストしていますのでそちらで試してみます。

No41830 (よねKEN さん) に返信
>>サーバーWindows2000+Oracle10g(RAW)SIJSテキスト16バイト 7バイト英数字、7バイト英数字、2バイト数字という構成になっています。
>
> この部分の説明の意味を私はよく理解できていないのですが、
説明悪くてすみません。
oracle10g で OracleDbType が RAW というタイプでテーブルはトータル16バイト
16バイトの構成が 7バイト英数字、7バイト英数字、2バイト数字 という構成になっています。
ということでした。

> これがそのbyte配列の中身の構成だとしたら、以下のような感じで切り出せるのでは?
>
> byte[] byteArray = (byte[])dr[0];
> Encoding SJIS = Encoding.GetEncoding("Shift_JIS");
> string _SJISテキスト16バイト = SJIS.GetString(byteArray, 0, 16);
> string _7バイト英数字1 = SJIS.GetString(byteArray, 16, 7);
> string _7バイト英数字2 = SJIS.GetString(byteArray, 23, 7);
> string _2バイト数字 = SJIS.GetString(byteArray, 30, 2); // 数値じゃなくて数字なんですよね? はい数字です。
>
> #かなり想像をまじえて答えているので、あっているかどうかはあまり自信なし
アドバイス参考に
OracleDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
byte[] byteArray = (byte[])dr[0];
Encoding SJIS = Encoding.GetEncoding("Shift_JIS");
label1.Text = SJIS.GetString(byteArray, 0, 7);
label2.Text = SJIS.GetString(byteArray, 7, 7);
label3.Text = SJIS.GetString(byteArray, 14, 2);
MessageBox.Show("次");
}
というコードにして実行してみました。ラベル1には正常データが出ましたが、ラベル2が表示される前に、
  インデックスおよびカウントはバッファ内の場所を参照しなければなりません。
  パラメータ名:bytes
というエラーが出ました。???これはなんだろう?おわかりになるでしょうか?
引用返信 編集キー/
■41839 / inTopicNo.7)  Re[3]: objectのテキスト変換方法教えてください。
□投稿者/ επιστημη (2179回)-(2009/10/01(Thu) 09:16:33)
επιστημη さんの Web サイト
>   インデックスおよびカウントはバッファ内の場所を参照しなければなりません。
>   パラメータ名:bytes

byteArrayの長さはどないなってます? 16以上ありますか?

引用返信 編集キー/
■41840 / inTopicNo.8)  Re[4]: objectのテキスト変換方法教えてください。
□投稿者/ 裕猫 (14回)-(2009/10/01(Thu) 09:33:43)
No41839 (επιστημη さん) に返信
>>  インデックスおよびカウントはバッファ内の場所を参照しなければなりません。
>>  パラメータ名:bytes
>
> byteArrayの長さはどないなってます? 16以上ありますか?
>
調べてみましたら7でした。それで気がついたんですがdr[0]は最初の7バイトでlabel2のはdr[1]、label3のはdr[2]でした。
(; ;)おばかでした。すみません。
OracleDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
byte[] byteArray = (byte[])dr[0];
Encoding SJIS = Encoding.GetEncoding("Shift_JIS");
label1.Text = SJIS.GetString(byteArray, 0, 7);
byteArray = (byte[])dr[1];
SJIS = Encoding.GetEncoding("Shift_JIS");
label2.Text = SJIS.GetString(byteArray, 0, 7);
byteArray = (byte[])dr[2];
SJIS = Encoding.GetEncoding("Shift_JIS");
label3.Text = SJIS.GetString(byteArray, 0, 2);
MessageBox.Show("次");
}
に修正し実行したところしっかり動きました。こんなおばかな私に適切なアドバイスをしていただき本当にありがとうございました。解決しました。m(_ _)m (^ ^)/~
解決済み
引用返信 編集キー/
■41842 / inTopicNo.9)  Re[5]: objectのテキスト変換方法教えてください。
□投稿者/ επιστημη (2180回)-(2009/10/01(Thu) 11:45:58)
επιστημη さんの Web サイト
↓これでぢゅーぶんじゃなかろかと。

Encoding SJIS = Encoding.GetEncoding("Shift_JIS");
label1.Text = SJIS.GetString((byte[])dr[0], 0, 7);
label2.Text = SJIS.GetString((byte[])dr[1], 0, 7);
label3.Text = SJIS.GetString((byte[])dr[2], 0, 2);

解決済み
引用返信 編集キー/
■41846 / inTopicNo.10)  Re[6]: objectのテキスト変換方法教えてください。
□投稿者/ 裕猫 (15回)-(2009/10/01(Thu) 12:53:39)
No41842 (επιστημη さん) に返信
> ↓これでぢゅーぶんじゃなかろかと。
>
> Encoding SJIS = Encoding.GetEncoding("Shift_JIS");
> label1.Text = SJIS.GetString((byte[])dr[0], 0, 7);
> label2.Text = SJIS.GetString((byte[])dr[1], 0, 7);
> label3.Text = SJIS.GetString((byte[])dr[2], 0, 2);
>
おお!シンプルですね! まだプログラムの書き方が未熟なんで参考になります。早速まねさせていただきます。ありがとうございました。
解決済み
引用返信 編集キー/
■41884 / inTopicNo.11)  Re[7]: objectのテキスト変換方法教えてください。
□投稿者/ 裕猫 (16回)-(2009/10/02(Fri) 11:07:30)
おかげさまで進んでおりましたら、数値でまたつまずいちゃいました。 またアドバイスいただけないでしょうか?
oracleの中にF-basicで作られたintegerとlongの数値が存在します。今回long整数値にぶつかりました。

Encoding SJIS = Encoding.GetEncoding("Shift_JIS");
label1.Text = SJIS.GetString((byte[])DR[0], 0, 4);
string 適用 = SJIS.GetString((byte[])DR[1], 0, 30);   今回DR[1] 34バイトの中で前30バイトがsjis日本語文字列、後ろ4バイトは
label2.Text = 適用;                   Fbasicのlong整数値です。
string aa = SJIS.GetString((byte[])DR[1], 30, 4);   ←今ここは何も表示されませんが、ここの2行で10進数の数値を表示したい。
label3.Text = aa;
MessageBox.Show("next");

整数値はc#でもそのまま使えると書いてあるところもありましたが、string型を数値型に変換できないとかエラーが出てきて目下奮闘中です。
よろしくお願いいたします。
引用返信 編集キー/
■41887 / inTopicNo.12)  Re[8]: objectのテキスト変換方法教えてください。
□投稿者/ もりお (95回)-(2009/10/02(Fri) 12:33:53)
No41884 (裕猫 さん) に返信
> string型を数値型に変換できないとかエラーが出て

データベースに byte[] で格納されていて
それを取得して long 整数値にして
Label にセットするために string にするのですよね。
そうしますと、変換の流れとしてはこんな具合になるのではないでしょうか。
byte[] --> long --> string
まずは byte[] から long への変換を考えてみてはいかがでしょうか。
引用返信 編集キー/
■41888 / inTopicNo.13)  Re[9]: objectのテキスト変換方法教えてください。
□投稿者/ 裕猫 (17回)-(2009/10/02(Fri) 12:56:55)
No41887 (もりお さん) に返信
> データベースに byte[] で格納されていて
> それを取得して long 整数値にして
> Label にセットするために string にするのですよね。
> そうしますと、変換の流れとしてはこんな具合になるのではないでしょうか。
> byte[] --> long --> string
> まずは byte[] から long への変換を考えてみてはいかがでしょうか。

返信ありがとうございます。byte[] --> long --> stringの流れはわかっているんですが、byte[] --> longができません。いろいろ試行錯誤
しているところですが、エラーの連続。 long --> stringはわかっているので大丈夫なんですけど。
byte[] --> longの関係がわかっていないのが原因なんですけど、それも含めて調査中です。
引用返信 編集キー/
■41891 / inTopicNo.14)  Re[10]: objectのテキスト変換方法教えてください。
□投稿者/ 裕猫 (18回)-(2009/10/02(Fri) 15:47:02)
すみません。何とかできました。m(_ _)m ああ時間がない。(- -!)ありがとうございました。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -