[seasar-dotnet:933] Re: 作成したDaoインタフェースのメソッド呼び出しで例外発生

koyak [E-MAIL ADDRESS DELETED]
2008年 10月 11日 (土) 15:01:02 JST


小谷です。

詳細な環境のご連絡ありがとうございます。

設定を拝見したところ「TransactionContext」というコンポーネントの設定がないようです。
Ado.diconに以下の設定を追加して試してみていただけないでしょうか。

  <!-- ローカルトランザクション用のインターセプターで使用します。 -->
  <component class="Seasar.Extension.Tx.Impl.TransactionContext" />

お使いのAdo.diconの中で設定されているTxDataSourceというデータソースは
トランザクションを管理するためにTransactionContextというコンポーネントを
必要とします。

トランザクション管理を行わないのであれば「Seasar.Extension.Tx.Impl.TxDataSource」
となっている部分を「Seasar.Extension.ADO.Impl.DataSourceImpl」に
変更していただいても問題は解決できるのではないかと思います。


2008/10/11 14:31 Yoshihiro OSHITA <[E-MAIL ADDRESS DELETED]>:
> S2Dao.NETを使い始めたばかりの初心者です。
> MLの投稿も初めていたします。
> SQLiteのDBアクセスに対してS2Dao.NETを利用してみようと思い、Consoleアプリのサンプルを作成してみました。
> しかし、作成したDaoインタフェースのメソッド呼び出しで例外発生し、原因が分からずに困っています。
> 長くなりますが、環境などを詳細に書きますと以下のようになっています。
>
> 環境----------------------------------
> OS:Windows XP SP3
> 言語:C#(.NET Framework3.5)
> 開発環境:VisualStudio 2008
> DB:SQLite(SQLite.dll 1.0.59.0)
> S2Dao.NET:1.3.11
> --------------------------------------
>
> 構成----------------------------------
> 【ソリューション】
> MyS2DaoSample
>    ┗━【プロジェクト】MyS2DaoSample
>       ┣━【参照】Seasar.dll、Seasar.Dao.dll、SQLite.dll
>
>    ┣━【設定ファイル】app.config、app.dicon,Dao.dicon,S2Dao.dicon,Ado.dicon(それぞれ、「常にコピーする」に設定)
>       ┣━【クラス】ILibraryDao.cs, Library.cs, Program.cs
>       ┗━【DBファイル】Library.SQ3
>
> --------------------------------------
>
> app.config----------------------------
> <configuration>
>   <configSections>
>     <section name="seasar" type="Seasar.Framework.Xml.S2SectionHandler,
> Seasar" />
>   </configSections>
>   <seasar>
>     <configPath>App.dicon</configPath>
>     <assemblys>
>       <assembly>Seasar.Dao</assembly>
>       <assembly>System.Data.SQLite</assembly>
>     </assemblys>
>   </seasar>
> </configuration>
> --------------------------------------
>
> App.dicon-----------------------------
> <components>
>   <include path="Dao.dicon"/>
> </components>
> --------------------------------------
>
> Dao.dicon-----------------------------
> <components namespace="Dao">
>   <include path="S2Dao.dicon"/>
>   <component class="MyS2DaoSample.ILibraryDao">
>     <aspect>S2Dao.Interceptor</aspect>
>   </component>
> </components>
> --------------------------------------
>
> S2Dao.dicon---------------------------
> <components namespace="S2Dao">
>   <include path="Ado.dicon" />
>   <component class="Seasar.Extension.ADO.Impl.BasicDataReaderFactory" />
>   <component class="Seasar.Extension.ADO.Impl.BasicCommandFactory" />
>   <component class="Seasar.Dao.Impl.FieldAnnotationReaderFactory" />
>   <component class="Seasar.Dao.Impl.DaoMetaDataFactoryImpl" />
>   <component name  ="Interceptor"
>     class ="Seasar.Dao.Interceptors.S2DaoInterceptor"/>
> </components>
> --------------------------------------
>
> Ado.dicon-----------------------------
> <components namespace="Ado">
>   <component name="SQLiteClient" class="Seasar.Extension.ADO.DataProvider">
>     <property
> name="ConnectionType">"System.Data.SQLite.SQLiteConnection"</property>
>     <property
> name="CommandType">"System.Data.SQLite.SQLiteCommand"</property>
>     <property
> name="ParameterType">"System.Data.SQLite.SQLiteParameter"</property>
>     <property
> name="DataAdapterType">"System.Data.SQLite.SQLiteDataAdapter"</property>
>   </component>
>
>   <component name="DataSource"
> class="Seasar.Extension.Tx.Impl.TxDataSource">
>     <property name="DataProvider">SQLiteClient</property>
>     <property name="ConnectionString">
>       "Data
> Source=Library.SQ3;New=True;Compress=False;Synchronous=Off;UTF8Encoding=False;Version=3"
>     </property>
>   </component>
>
> </components>
> --------------------------------------
> このような設定ファイルを作成しました。
> これに対して、作成したDaoインタフェースのソースは、
> ILibraryDao.cs ===========================
> namespace MyS2DaoSample {
>     [Bean(typeof(Library))]
>     public interface ILibraryDao   {
>         Library[] GetAllLibraries();
>         int Insert(Library library);
>         int Update(Library library);
>         int Delete(Library library);
>     }
> }
> =======================================
> のようになっており、Entityクラスは、
> Library.cs ===============================
> namespace MyS2DaoSample{
>     [Table("lib_mgmt_list_tbl")]
>     public class Library
>     {
>         private String _libID;
>         private String _libName;
>         private String _userName;
>         private DateTime _creationTime;
>         private DateTime _lastAccessTime;
>         private DateTime _lastWriteTime;
>
>         public Library() {}
>
>         public String LibID  {
>             get { return _libID; }
>             set { _libID = value; }
>         }
>
>         public String LibName {
>             get { return _libName; }
>             set { _libName = value; }
>         }
>
>         public String UserName {
>             get { return _userName; }
>             set { _userName = value; }
>         }
>
>         public DateTime CreationTime {
>             get { return _creationTime; }
>             set { _creationTime = value; }
>         }
>
>         public DateTime LastAccessTime {
>             get { return _lastAccessTime; }
>             set { _lastAccessTime = value; }
>         }
>
>         public DateTime LastWriteTime {
>             get { return _lastWriteTime; }
>             set { _lastWriteTime = value; }
>         }
>     }
> }
> =======================================
> のようにしました。これをMain関数で
> Program.cs ===============================
> namespace MyS2DaoSample{
>     class Program {
>         static void Main(string[] args) {
>             try {
>                 SingletonS2ContainerFactory.ConfigPath = "App.dicon";
>                 SingletonS2ContainerFactory.Init();
>                 IS2Container container =
> SingletonS2ContainerFactory.Container;
>                 ILibraryDao libraryDao =
> (ILibraryDao)container.GetComponent(typeof(ILibraryDao));
>
>                 Library[] libs = libraryDao.GetAllLibraries();
>                 Console.WriteLine("終了");
>             }
>               (略)
>           }
>        }
> }
> =======================================
> のようにして、GetAllLibrariesメソッドを呼びました。
> ここで、「オブジェクト参照がオブジェクトインスタンスに設定されていません。」
> という例外が発生します。StackTraceは、
> =======================================
> 場所 Seasar.Extension.Tx.Impl.TxDataSource.GetConnection()
> 場所 Seasar.Dao.Dbms.DbmsManager.GetDbms(IDataSource dataSource)
> 場所 Seasar.Dao.Impl.DaoMetaDataImpl.Initialize()
> 場所 Seasar.Dao.Impl.DaoMetaDataFactoryImpl.CreateDaoMetaData(Type daoType)
> 場所 Seasar.Dao.Impl.DaoMetaDataFactoryImpl.GetDaoMetaData(Type daoType)
> 場所 Seasar.Dao.Interceptors.S2DaoInterceptor.Invoke(IMethodInvocation
> invocation)
> 場所 Seasar.Framework.Aop.Proxy.AopProxy.Invoke(IMessage msg)
> 場所 System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData&
> msgData, Int32 type)
> 場所 MyS2DaoSample.ILibraryDao.GetAllLibraries()
> 場所 MyS2DaoSample.Program.Main(String[] args)
> 場所 C:\Documents…\Visual Studio
> 2008\Projects\MyS2DaoSample\MyS2DaoSample\Program.cs:行 22
> =======================================
> のようになっております。
> 原因について、ご教授いただけないでしょうか?
> _______________________________________________
> seasar-dotnet mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>
>


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