[seasar-dotnet:1557] Re: [DBFlute.NET][S2Container.NET] IDbDataParameter の DbType を変更する場合

kubo [E-MAIL ADDRESS DELETED]
2010年 2月 16日 (火) 13:11:20 JST


久保(jflute)です。

> JA16SJISTILDEです。それは把握しております。
> 可能ならばそちらにしたいのですが、同じDBに相乗りしているシステムがOracle8iクライアントを利用していまして・・・
> Oracle8iクライアントから、
> Oracle9iサーバーのJA16SJISTILDEに接続すると、レスポンス速度が著しく悪くなるという現象がありまして、JA16SJISにしてアプリで対応せざるを得ないという状況です。
> (8iには~TILDEがありませんので当然と言えば当然ですが・・・むしろ動く方がびっくり)

そんな現象が...
ありがとうございます。

TILDEが発生するのはVARCHARだけで、
NVARCHARでは発生していない、でOKでしょうか?
また、一律AnsiStringを利用するに設定しても
NVARCHARの処理に特に問題はないでしょうか?
(そもそもアプリでNVARCHAR使ってないならいいです。
もし、すぐにわかるレベルであれば教えて頂ければと)

2010/2/16 西山はじめ <[E-MAIL ADDRESS DELETED]>:
> 西山(hajimeni)です。
>
> 回答ありがとうございます。
>
>> StringTypeに関しては、アプリ起動時に
>> ValueTypes.RegisterValueType()で差し替えが可能かも。
>
> そんな機能があったのですね。試してみます。
>
>> InternalProcedureHandlerに関しては、現状では
>> テンプレートを直すしか方法はないです。
>
> 了解いたしました。
>
>> JA16SJISじゃなくて、全角チルダ問題を回避するための
>> Oracleが提供するSJISのエンコーディングってありません
>> でしたっけ?それを使って回避できないのかなと。
>> (今回の件で適用できるかどうかは別にして)
>
> JA16SJISTILDEです。それは把握しております。
> 可能ならばそちらにしたいのですが、同じDBに相乗りしているシステムがOracle8iクライアントを利用していまして・・・
> Oracle8iクライアントから、
> Oracle9iサーバーのJA16SJISTILDEに接続すると、レスポンス速度が著しく悪くなるという現象がありまして、JA16SJISにしてアプリで対応せざるを得ないという状況です。
> (8iには~TILDEがありませんので当然と言えば当然ですが・・・むしろ動く方がびっくり)
>
> ///
> /// 本当はDBのCharsetはUTFにしたいのですが・・・
> ///
>
> 2010年2月16日11:52 kubo <[E-MAIL ADDRESS DELETED]>:
>> 久保(jflute)です。
>>
>> 西山さん、こんにちは
>>
>> 自分も確証があるわけではないですが、
>> 把握してる限りで、そのニ箇所ですね。
>> プロシージャだけ特別ですが、あとは
>> 基本StringTypeを直してしまえば他全ての処理で
>> そのようになるはずです。
>>
>> StringTypeに関しては、アプリ起動時に
>> ValueTypes.RegisterValueType()で差し替えが可能かも。
>> InternalProcedureHandlerに関しては、現状では
>> テンプレートを直すしか方法はないです。
>>
>> 後学のために:
>>
>> JA16SJISじゃなくて、全角チルダ問題を回避するための
>> Oracleが提供するSJISのエンコーディングってありません
>> でしたっけ?それを使って回避できないのかなと。
>> (今回の件で適用できるかどうかは別にして)
>>
>> もし、NOだとすると、
>> データプロバイダ次第で、DbTypeを調整する必要があるって
>> のはちょっと色々と不都合があるので改善が必要かもですね。
>> (NVarcharか否かを判定して、内部で自動でStringTypeを
>> 切り替えるとか...逆にどのデータプロバイダでもそれで
>> OKならわかりやすいのですが、データプロバイダごとに
>> 最適な方法が変わるとつらいですね)
>>
>>
>> 2010/2/16 西山はじめ <[E-MAIL ADDRESS DELETED]>:
>>> 西山(hajimeni)です。
>>> お世話になっております。
>>>
>>> DBFlute.NET利用時に、IDbDataParameter の DbType を変更する場合、次の箇所を直せば大丈夫でしょうか。
>>> String型の時だけ DbType.String ではなく、 DbType.AnsiString を指定したいと思っています。
>>>
>>> ・Seasar.Extension.ADO.Types.StringTypeのBindValueメソッドを次のように変更。
>>> BindValue(cmd, columnName, value, DbType.AnsiString);
>>>
>>> ・Sample.DBFlute.AllCommon.S2Dao.Internal.SqlHandler.InternalProcedureHandler
>>> のGetDbValueType内のメソッドを変更。
>>> ・・・(略)
>>> if (type == typeof(String) || type.FullName == "System.String&")
>>>    return DbType.AnsiString;
>>> ・・・(略)
>>>
>>> 環境は次のとおりです。
>>> Oracle9i(9.2.0.6)
>>>  (文字コード:JA16SJIS)
>>> S2Container.NET 1.3.16.1
>>> DBFlute.NET 0.8.9.2
>>>
>>> というのも、どうやらOracleとの接続に利用しているサードパーティ製のdllでは、
>>> DbType.AnsiString → Varchar
>>> DbType.String → NVarchar
>>> と解釈するため、データベースの文字コードが「JA16SJIS」の場合、「~」が上手く検索出来ない(いわゆる全角チルダ問題)
>>> が発生してしまいます。
>>> DbType.String を指定した場合、単純に検索した結果が文字化けするのではなく、検索結果そのものが存在しなくなってしまいます。
>>>
>>> 回避策はどうやら、DbType.AnsiString を指定するしかないとのことです。
>>>
>>> 出来れば、.NETのTypeと DbTypeのマッピングが変更出来ればよいのですが、割りと早めに修正しなければならない為、直接手をいれることにしました。
>>>
>>> 以上よろしくお願いいたします
>>> --
>>> --
>>> 西山はじめ
>>> _______________________________________________
>>> seasar-dotnet mailing list
>>> [E-MAIL ADDRESS DELETED]
>>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>>
>> _______________________________________________
>> seasar-dotnet mailing list
>> [E-MAIL ADDRESS DELETED]
>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>
>
>
>
> --
> --
> 西山はじめ
> _______________________________________________
> seasar-dotnet mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>


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