■49621 / inTopicNo.4) |
Re[3]: ORACLEへのバイナリデータの書き込みについて |
□投稿者/ 魔界の仮面弁士 (1644回)-(2010/05/11(Tue) 14:40:10)
|
■No49613 (裕猫 さん) に返信 > System.Data.OracleClient.OracleDataAdapterを使用していたのでODAとかいてしまいました。 No29031 でも ODA と表記されていたようですが、一般的な略称ではないように思います。
> ODP.NETでした。似たような名前がたくさんあるので混同してしまいました。すみません。 すみません。ODP.NET の名を出してしまって、かえって混乱させてしまったのかも知れません。
裕猫さんが、もしも アセンブリ:System.Data.OracleClient.dll 名前空間:System.Data.OracleClient の事を説明されているのだとすれば、それは ODP.NET ではありません。
ODP.NET (Oracle Data Provider for .NET) というのは、 アセンブリ:Oracle.DataAccesss.dll 名前空間:Oracle.DataAccess.Client にあたります。
いずれも ADO.NET 準拠の Oracle 用プロバイダという点では同じですが、別のライブラリです。 (前者は Microsoft 製、後者は Oracle 製)
なお OracleClient は .NET Framework 2.0 より登場したライブラリですが、 .NET Framework 4 では非推奨(下位互換性のために Obsolete 扱い)になっており、 将来のバージョンでは削除される可能性があります。 http://msdn.microsoft.com/ja-jp/library/77d8yct7.aspx
今後、Visual Studio 2010 以降のバージョンへの移行も検討しているのであれば、 ODP.NET や Connect for ADO.NET 等への切り替えも検討しておいた方が良いかも知れません。
>>> 以前にバイナリデータのORACLEへの書き込みでお世話になりました裕猫ですが、 >>> その後(かなりたちますが)いまだに書き込めないでおります。 >> 覚えていないので検索してみました。どれでしょうか? > すみません私もよく覚えてないです。 失念されているなら仕方ないですね。 以前のスレッドも参考にしておきたいので、こちらで勝手に探す事にします。
ところで、当時の投稿先はココで間違いないですか? 投稿者名は同じですよね?
>>それと、データは SQL 中に埋め込むのでは無く、cmd.Parameters を使って >>パラメーター化するようにしましょう。その方が問題が少ないです。 > はいわかりました。そのように直してみます。
イメージ的には、こうかな? cmd.CommandText = "INSERT INTO GN30X (コード,適用,番号) VALUES (:P1, :P2, :P3)"; cmd.Parameters.Add("P1", OracleType…); cmd.Parameters.Add("P2", OracleType…); cmd.Parameters.Add("P3", OracleType…); cmd.Parameters["P1"].Value = 〜; cmd.Parameters["P2"].Value = 〜; cmd.Parameters["P3"].Value = 〜; cmd.ExecuteNonQuery();
>>* GN30X のテーブル定義はどのようになっているのでしょうか? >> それぞれの列(コード,適用,番号)のデータ型を公開してください。 > GN30の構造は GN30X ですよね、GN30 ではなく。
> 4byteの英数字 30byteの日本語 4byteの整数の合計38byteのデータが > ORACLEの中に4byte+30byte+4byteのバイナリデータで記録されています。 繰り返しの質問になりますが、それぞれの「データ型」は何に設定されているのでしょうか?
No42179 で、ぽぴ王子さんが「その部分が明確になっていないので回答は難しいです。」と 書かれていますが、それと同じ理由による質問だと思ってください。
以前の質問にあった TEST_HI01(COL1, COL2, COL3) は、すべて RAW 型だったようですが、 http://bbs.wankuma.com/index.cgi?mode=al2&namber=42177&KLOG=72 今回の GN30X(コード,適用,番号) は、それぞれ何型なのでしょうか?
たとえば『4byteの英数字』を格納する場合、それが文字列として保持するならば、Oracle 側では VARCHAR2(4 CHAR) VARCHAR2(4 BYTE) NVARCHAR2(4) CHAR(4 CHAR) CHAR(4 BYTE) NCHAR(4) などが使われるかと思います。しかし、今回は文字列ではなくバイナリなのですよね。
4バイトのバイナリを格納するのであれば、これらの文字列型に加えて、さらに NUMBER(10) RAW(4) BLOB などのデータ型も候補に挙げる事ができます。あるいは、他の型なのかも知れませんが、 実際のところはどうなのでしょうか?
>>* それぞれの TextBox の内容と、そこから期待される GN30X への格納結果を >> 具体例として提示して欲しいです。 > textbox1 = "AC01" > textbox2 = "銀行残高" > textbox3 = "123456" > textbox1,2を文字、textbox3をint型のバイナリデータにして記録したいのです。 textBox1 の "AC01" が示す内容というのは、0xAC,0x01 の意味ではなく、 0x41,0x43,0x30,0x31 のデータとして保存されれば良いのですよね?
> 以上の説明でわかりますでしょうか? これで TextBox の内容はわかりましたが…肝心の格納結果についての具体例が提示されていません。 期待する「格納後のバイナリデータの内容」は、具体的にはどういったものですか? (int というのは C# の型であって、Oracle の型ではありませんよね)
要するに、上記のデータを正しく格納できていたとしたら、 SELECT DUMP(コード, 1016), DUMP(適用, 1016), DUMP(番号, 1016) FROM GN30X からは、どのようなデータが返されるようにしたいのでしょうか、という事です。
たとえば、[コード]列に 0x41,0x43,0x30,0x31 の 4 バイトを格納するにしても、 格納先の Oracle 側の型によって、複数のパターンが想定されます。たとえば: Typ=1 Len=4: 41,43,30,31 Typ=23 Len=4: 41,43,30,31 Typ=96 Len=4 CharacterSet=JA16SJIS: 41,43,30,31 Typ=96 Len=4 CharacterSet=JA16SJISTILDE: 41,43,30,31 など。そして、そのそれぞれにおいて、記述すべき C# のコードも微妙に異なる事になります。
|
|