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

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


久保(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 メーリングリストの案内