[seasar-dotnet:2260] Re: 【S2Dao.Net】OracleのNCHARまたはNVRCHAR2の取扱について

kotani.k [E-MAIL ADDRESS DELETED]
2013年 3月 26日 (火) 07:07:06 JST


李さん

小谷です。
返信が非常に遅くなってしまい、申し訳ありません。

下記の手順で拡張することで対応できるのではないかと考えています。
試してみていただけないでしょうか。

1.Seasar.Extension.ADO.IValueTypeの実装クラスを作成
2.1.のBindValueメソッドで独自設定を行うIDbParameterを生成し、cmd.ParametersにAdd
(参考:Seasar.Extension.ADO.Types.BaseValueType他)
3.Seasar.Dao.Impl.BeanMetaDataImpl, Seasar.Dao.Impl.DtoMetaDataImplを拡張する
 それぞれCreatePropertyTypeメソッドをoverrideし、特定のプロパティの場合は
 「valueType」に共通手順で作成した2で作成したValueTypeを設定するようにする
 (参考:Seasar.Dao.Impl.DtoMetaDataImpl#CreatePropertyType)
4.Seasar.Dao.Impl.DaoMetaDataImplを拡張する
 Initializeメソッドをoverrideし、3で作成した拡張BeanMetaDataImplをBeanMetaDataとして設定する
 CreateAutoSelectSqlByDtoをoverrideし、3で作成した拡張DtoMetaDataImplを使用する
 (参考:Seasar.Dao.Impl.DaoMetaDataImpl)
5.Seasar.Dao.Impl.DaoMetaDataFactoryImplを拡張する
 CreateDaoMetaDataImplをoverrideし、4で作成した拡張DaoMetaDataImplを生成して返す
6.(Quillを使用している場合)
 Seasar.Quill.Dao.Impl.TypicalDaoSettingクラスを拡張
 CreateDaoMetaDataFactoryをoverrideし、5で作成した拡張DaoMetaDataFactoryImplを生成して返す
7.(S2Containerを使用している場合)
 diconファイルにDataMetaDataFactoryImplの代わりに
 5で作成した拡張DaoMetaDataFactoryImplを設定

手順2でOracleParameterへの型指定(pBiko.OracleDbType = OracleDbType.NVarchar2 など)を
行うことで解決できるのではないかと思います。

以上です。
よろしくお願い致します。

2013年2月20日 9:20 李 い <liyi @ kssinet.co.jp>:
> 小谷さんへ
>
> 李です。
>
> >(多分できない要件なのだろうな、ということは承知の上で一応確認させていただ
> きたいのですが、
> >NLS_CHARACTERSETにもUnicodeとなるキャラクタセットを設定して運用することは
> できないでしょうか?
> >(非Unicodeによる入力がある場合は適所で変換をかける・・・など))
>
> NLS_CHARACTERSETの設定は初期時のみ、既存のDBを利用する場合無理ですね。また、
> Unicodeの文字は
> 記号ですが、お客様の要望でUnicode文字を利用することなので変換も難しいだと思
> います。
>
> 一番理想の形は、カラムごとマッピング対象の属性を持つ、個別設定できれば嬉しい
> が、
> 影響範囲は大きく対応は難しいと思います。
>
>
> 以上です。
>
>
> -----Original Message-----
> From: seasar-dotnet-bounces @ ml.seasar.org
> [mailto:seasar-dotnet-bounces @ ml.seasar.org] On Behalf Of kotani.k
> Sent: Tuesday, February 19, 2013 11:09 PM
> To: seasar-dotnet @ ml.seasar.org
> Subject: [seasar-dotnet:2239] Re: 【S2Dao.Net】OracleのNCHARまたはNVRCHAR2の
> 取扱について
>
> 李さん、koalaさん
>
> 小谷です。
>
> ご回答&コメントありがとうございます。
> 不勉強でお恥ずかしい限りです。
>
> koalaさんの
> >System.Data.DbType.stringはOracleDbType.Varchar2にマッピング
> 李さんの
> >NLS_CHARACTERSETはUnicode(たとえばAL32UTF8)でしたら、正常に更新できま
> す。
> を合わせて考えると
> System.Data.DbType.string⇒OracleDbType.Varchar2にマッピング⇒Varcharなので
> NLS_CHARACTERSETに設定された文字コードを使用、という
> 動きになるのかな・・・と勝手に推測しています。
>
> 李さんが書いて下さったコードを元に(そのまま使わせていただくかもしれません
> が)、
> どうするべきか考えてみます。少々お時間を下さい。
>
> (多分できない要件なのだろうな、ということは承知の上で一応確認させていただき
> たいのですが、
> NLS_CHARACTERSETにもUnicodeとなるキャラクタセットを設定して運用することはで
> きないでしょうか?
> (非Unicodeによる入力がある場合は適所で変換をかける・・・など))
>
> 以上です。
>
> 2013年2月19日 10:33 李 い <liyi @ kssinet.co.jp>:
>> 李です。
>>
>> また書き間違いました。
>>
>> >(System.Data.DbType.stringはOracleDbType.Varchar2にマッピングされたら何
>>> 問題がないのに...)
>>>> (System.Data.DbType.stringはOracleDbType.NVarchar2にマッピングされたら何
>>> 問題がないのに...)
>> です。
>>
>> 失礼しました。
>>
>>
>> -----Original Message-----
>> From: seasar-dotnet-bounces @ ml.seasar.org
>> [mailto:seasar-dotnet-bounces @ ml.seasar.org] On Behalf Of 李 い
>> Sent: Tuesday, February 19, 2013 10:13 AM
>> To: seasar-dotnet @ ml.seasar.org
>> Subject: [seasar-dotnet:2237] Re: 【S2Dao.Net】OracleのNCHARまたはNVRCHAR2
>>> 取扱について
>>
>> 小谷さんへ
>>
>> 李です。
>>
>>>>
> http://docs.oracle.com/cd/E16338_01/win.112/b66456/featOraCommand.htm#i10072
>> 22
>> こちらも読んだことがあります。
>>
>> >DBの既存レコードから読み込みの場合、Unicode文字が正しく読み込まれ、画面
>>> 表示できます。
>> >しかし、画面で入力されたUnicode文字をDBに更新する時、「?」に化けてしま
>>> ました。
>> 面白いのは、この現象がDBサーバはのNLS_CHARACTERSETはJA16SJISTILDE(非
> Unicode)
>> の場合は発生します。
>> NLS_CHARACTERSETはUnicode(たとえばAL32UTF8)でしたら、正常に更新できま
> す。
>> (同じOracleDbType.Varchar2にマッピングするのに動きの違いは理解できない
> =_=)
>>
>>
>> ところが、CHAR,VARCHAR2のカラムに対して、OracleDbType.NVarchar2を設定して
>>> 正しく動くみたいです。
>> (System.Data.DbType.stringはOracleDbType.Varchar2にマッピングされたら何も
>>> 題がないのに...)
>>
>>
>> 以上です。
>>
>>
>> -----Original Message-----
>> From: seasar-dotnet-bounces @ ml.seasar.org
>> [mailto:seasar-dotnet-bounces @ ml.seasar.org] On Behalf Of koala
>> Sent: Tuesday, February 19, 2013 9:43 AM
>> To: seasar-dotnet @ ml.seasar.org
>> Subject: [seasar-dotnet:2236] Re: 【S2Dao.Net】OracleのNCHARまたはNVRCHAR2
>>> 取扱について
>>
>>
>> 李さん
>> 小谷さん
>>
>> #李さんと入れ違いになりましたがせっかく書いたのでこのまま投稿します。
>>
>>> S2Dao.NETのupdate処理に渡すEntity内のプロパティのうち、
>>> 文字化けが起きているプロパティの型はどのようになっているでしょうか?
>>> (stringであればUnicode用のSystem.DbType.Stringが使用されるはずなのです
>> が。。。)
>>
>> OracleCommandオブジェクト
>>
> http://docs.oracle.com/cd/E16338_01/win.112/b66456/featOraCommand.htm#i10072
>> 22
>>
>> DbTypeからのOracleDbTypeの判断
>> OracleParameterクラスでは、DbTypeの値を指定すると、表3-7に示されているとお
>>> OracleDbTypeの値が判断されます。
>> 表3-7 DbTypeからのOracleDbTypeの判断
>>
>> によると、System.Data.DbType.stringはOracleDbType.Varchar2にマッピングされ
>>> います。
>> OracleDbType.NVarchar2にマッピングされるSystem.Data.DbTypeは存在しないの
> で、
>> エンティティのプロパティの型では対応できないということはないでしょうか?
>>
>>
>> 以上です。
>>
>>
>> _______________________________________________
>> seasar-dotnet mailing list
>> seasar-dotnet @ ml.seasar.org
>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>
>> _______________________________________________
>> seasar-dotnet mailing list
>> seasar-dotnet @ ml.seasar.org
>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>
>> _______________________________________________
>> seasar-dotnet mailing list
>> seasar-dotnet @ ml.seasar.org
>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
> _______________________________________________
> seasar-dotnet mailing list
> seasar-dotnet @ ml.seasar.org
> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>
> _______________________________________________
> seasar-dotnet mailing list
> seasar-dotnet @ ml.seasar.org
> https://ml.seasar.org/mailman/listinfo/seasar-dotnet


seasar-dotnet メーリングリストの案内