【PetaPoco】PetaPoco + Oracleで使って見た。

  • 2013.02.06 Wednesday
  • 21:59
JUGEMテーマ:コンピュータ

Source and Project

PetaPocoでOracleにつないでみました。結論から言うと、PetaPoco(バージョン 4.0.3)で、Oracle.DataAccess.Clientを利用して、DBに接続しSQLを発行することは可能でした。ただし、Pocoを自動生成するのは、現状のT4ソースコードでは無理なようです。T4のソースコードを何カ所かいじるとPocoを生成することができるようになったのでメモを残す事にしました。

■NuGetからPetaPocoをインストール

■app.config(またはweb.config ない場合は作成する)を書き換える(赤字部分を追記)

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
  <connectionStrings>
    <add
      name="Art55OracleDb"
      connectionString="Data Source=XE;User Id=art55;Password=art55"
      providerName="Oracle.DataAccess.Client"/>
  </connectionStrings>

</configuration>

■Database.ttを開き

前)
ConnectionStringName = "";

後)
ConnectionStringName = "Art55OracleDb";

■Database.ttを右クリックし「カスタムツール」を実行する。

上記の手順だけで、本来ならPocoはできるはずなのですが、作成されません。エラーを追っていくとおかしな部分があるので書き換えます。

■PetaPoco.Core.ttincludeのOracleSchemaReaderクラスを書き換える。(1139行

1308行
前)
const string TABLE_SQL=@"select TABLE_NAME from USER_TABLES";

後)
 const string TABLE_SQL=
 @"select a.TABLE_NAME, b.OWNER as TABLE_SCHEMA, 'Table' as TABLE_TYPE
from USER_TABLES a
inner join ALL_TABLES b on a.TABLE_NAME = b.TABLE_NAME
union
select c.VIEW_NAME as TABLE_NAME, d.OWNER as TABLE_SCHEMA, 'View' as TABLE_TYPE
from USER_VIEWS c
inner join ALL_VIEWS d on c.VIEW_NAME = d.VIEW_NAME";

※とりあえず、ここのSQLでPocoとして作成したいテーブルを取得するためのSQLを書けば良いようです。ポイントはテーブル名にTABLE_NAME、オーナーにTABLE_SCHEMA、Viewも含めたい場合はTABLE_TYPEというカラムにViewと記述すれば良いようです。

■Nullable対応が間違えているので修正
1215行
前)
col.IsNullable=rdr["IsNullable"].ToString()=="YES";

後)
col.IsNullable=rdr["IsNull
able"].ToString()=="Y";

ここまででPocoはとりあえず作れるはずです。ただし、Number型のNullableの対応がおかしいので、それも修正する必要があります。

■PetaPoco.cs内のあるGetConverterメソッドを書き換える。

2094行
前)
    else if (!dstType.IsAssignableFrom(srcType))
    {
        converter = delegate(object src) { return Convert.ChangeType(src, dstType, null); };
    }

後)
    else if (!dstType.IsAssignableFrom(srcType))
    {
        Type innerType = Nullable.GetUnderlyingType(dstType);
        if (innerType != null)
        {
            converter = src => Convert.ChangeType(src, innerType, CultureInfo.InvariantCulture);
        }
        else
        {
            converter = src => Convert.ChangeType(src, dstType, CultureInfo.InvariantCulture);
        }
    }

これで、とりあえず私が見つけた範囲のバグは修正されます。うん。全然だめっぽいという事だけわかりました・・・ただし、ソースコードとT4 Templateで配布されており一切のdllを含めていないため、自分のやりたい範囲で都合のいいように書き換えられるというのは、メリットだと思います。

最後に、とりあえず動かしてみたコード

using System;
using System.Globalization;
using System.Linq;
using Art55OracleDb;

namespace Art55.PetaPocoDemo20130206_001
{
    class Program
    {
        static void Main()
        {
            using (var db = new PetaPoco.Database("Art55OracleDb"))
            {
                db
                .Query<EMP>("select * from emp where job=@Job", new { Job = "SALESMAN" })
                .ToList()
                .ForEach(emp => Console.WriteLine(string.Join(", ", new []
                    {
                        emp.EMPNO.ToString(CultureInfo.InvariantCulture),
                        emp.ENAME,
                        emp.JOB
                    })));
            }
        }
    }
}

実行結果

7499, ALLEN, SALESMAN
7521, WARD, SALESMAN
7654, MARTIN, SALESMAN
7844, TURNER, SALESMAN

まとめ

PetaPoco + Oracleは怪しい・・・。私の力量では手に負えないと思いました(汗)


Source and Project

コメント
コメントする








    
この記事のトラックバックURL
トラックバック

calendar

S M T W T F S
     12
3456789
10111213141516
17181920212223
2425262728  
<< February 2019 >>

あわせて読みたい

あわせて読みたいブログパーツ

selected entries

categories

archives

recent comment

  • 【キーボード】6年前のRealForceを復活させることはできる!?その3
    art55 (05/22)
  • 【キーボード】6年前のRealForceを復活させることはできる!?その3
    分解大好き (05/18)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    art55 (02/04)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    Gen (02/04)
  • 【キーボード】RealForce が壊れて帰ってきた。
    art55 (04/29)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    art55 (02/23)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    かるあ (02/22)
  • 【C#】Dictionaryの実装・データ構造・アルゴリズムを観察する。
    art55 (01/16)
  • 【C#】Dictionaryの実装・データ構造・アルゴリズムを観察する。
    karuakun (01/16)
  • 【NetOffice】【Excel】死なないExcelプロセスをKillする。
    art55 (12/05)

recent trackback

recommend

recommend

recommend

C#プログラマのための.NETアプリケーション最適化技法 (Programmer's SELECTION)
C#プログラマのための.NETアプリケーション最適化技法 (Programmer's SELECTION) (JUGEMレビュー »)
Sasha Goldshtein,Dima Zurbalev,Ido Flatow,サシャ・ゴルドシュタイン,ディマ・ズルバレフ,イド・フラトー

recommend

ろんりと集合
ろんりと集合 (JUGEMレビュー »)
中内 伸光
とてもわかりやすいです。

recommend

recommend

シャノン・ノイマン・ディジタル世界
シャノン・ノイマン・ディジタル世界 (JUGEMレビュー »)
市川 忠男
4章がリレーショナルデータベースな内容になってます。ページ数があまりありませんが、ポイントがものすごく的確にまとまっていて、感動します。

recommend

recommend

東プレ Realforce91UBK-S 静音キーボード 静電容量無接点方式 変荷重 ブラック NG01BS
東プレ Realforce91UBK-S 静音キーボード 静電容量無接点方式 変荷重 ブラック NG01BS (JUGEMレビュー »)

テンキーレス、静音のRealForce91UBK-S。スコスコ感がたまらなく気持ちいいです。家と会社で2台持ってます。

recommend

recommend

プログラミング.NET Framework 第4版 (プログラミングシリーズ)
プログラミング.NET Framework 第4版 (プログラミングシリーズ) (JUGEMレビュー »)
Jeffrey Richter
発売予定美 2013年10月10日。.NET Frameworkとお付き合いする人のバイブルですね。

recommend

recommend

キャット・シッターの君に。
キャット・シッターの君に。 (JUGEMレビュー »)
喜多嶋 隆
私のイラストレータデビュー本です。

recommend

Essential .NET ― 共通言語ランタイムの本質
Essential .NET ― 共通言語ランタイムの本質 (JUGEMレビュー »)
ドン・ボックス,クリス・セルズ,Don Box,Chris Sells,吉松 史彰

links

profile

search this site.

others

mobile

qrcode

powered

無料ブログ作成サービス JUGEM