[seasar-dotnet:2490] Re: QuillでのDB接続について

kotani.k [E-MAIL ADDRESS DELETED]
2016年 5月 10日 (火) 23:56:53 JST


小谷です。

分かりにくいドキュメントでごめんなさい。
App.configの設定内容については特に問題ないかと思います。
その他、S2Containerから移行する場合に必要な作業としては、

   -
   コンポーネントの登録:インターフェースならImplementation(typeof(実装クラス))を設定。クラスならImplementation(引数なし)属性を付ける
   - インターセプターの設定:クラス、またはメソッドにAspect属性を付ける
   - DIの実行:QuillInjectorクラスのInjectメソッドにDIを行いたいクラスのインスタンスを渡す
   - S2DaoInterceptorの適用:S2Dao属性を付ける
   - TransactionInterceptorの適用:Transaction属性を付ける

あたりでしょうか。
Quillの機能としてはむしろ上記以上の機能を特に持ち合わせていないので
覚えることは他のDI系ライブラリよりは大分少ないかと思います。

対象となるクラス数が多い場合は機械的に属性を付与していくようなツールなどを
マクロやスクリプトなどで作ってみる方が効率的かもしれません。

作成されているテストコードは、taknb2nchさんが書かれている通り、Assertで期待しているデータソース数に
App.configで定義しているデータソース数が足りていないことによりエラーとなっているようです。
そのため、Quillの使い方が合っているか誤りがあるか検証できるところまで
テストコードが進んでいないように見えます。
まずはAssertエラーとなっている箇所の条件を見直していただければ
検証をスタートできる状態になるのではないでしょうか。

以上です。


2016年5月10日 19:31 新谷将亮 <ms630928s @ gmail.com>:

> 志水様 taknb2nch様
>
> ご回答いただき、ありがとうございます。
>
> 現在の進め方についてですが、
>
> >②それとも、現行システムにQuillを付け足した環境で接続テストの実行をしているんですかね?
>
> で行っておりました。
>
> Quillの基本すら理解していない状況ですので、
> ご指摘いただいた通り、サンプルプログラムを作成しながら、
> 基本を理解したいと思います。
>
> 理解していない上で質問してしまい、大変申し訳ございませんでした。
>
> また、質問させて頂くこともあるかと思いますが、
> その際は、宜しくお願い致します。
>
> 親身にご回答いただきまして、本当にありがとうございました。
>
> 2016年5月10日 15:00 志水正幸 <ie2m-smz @ asahi-net.or.jp>:
>
>> 志水です。
>>
>>
>> >このまま動作させると、ds_がnullとなったため、
>> >「Seasar.Tests.Quill.QuillContainerTest.TestRegistDataSource()」
>> を参考に変更しました。
>>
>> ◆すいません、上記に関してはちょっとわかりません。
>>
>> ◆これって、どういう環境で実行していますか?
>> ①Seasarとかのテスト用プロジェクトを使用しているんですかね?
>> ②それとも、現行システムにQuillを付け足した環境で接続テストの実行をしているんですかね?
>> ③それとも、新規プロジェクトを作って接続テストのみしているんですかね?
>>
>> → ①の場合、付属のテスト環境などは使用したことがないのでわからないです。
>> ②の場合、実行するのは一旦やめた方がいいと思います。
>>   上記①、②の場合
>> ③のように新規プロジェクトで接続できる環境を作成して
>> 簡単な画面から接続確認した方が、設定方法などが
>> わかるので理解するためや後の実験にも使用できるので良いように思います。
>> 現行環境にQuillを入れいるのではなく、
>> この新規環境に現行システムを移植する方法も検討してもよいのではないでしょうか?
>>
>>
>> >QuillContainerを使用するということは、「Ado.dicon」を使用しないと認識しております。
>> >⇒Ado.diconのみでなく、diconファイル自体がなくなると思っています。
>> >現状、diconファイルが複数存在しています。
>>
>> ◆少なくとも私の環境ではdiconファイルに関して何も意識していませんし、触ったこともありません。
>> 普通に一つのDBを使用する程度ならAppConfigに接続文字列と使用するDB(ORACLE)の指定をするだけでいいと思いま す。
>>
>>
>> >①S2Containerからの移行を行う際に、すべての設定は、AppConfig内に集約されるということでしょうか?
>>
>> ◆すべての設定が何かわからないですが、少なくともDB設定はAppConfig内で行えばいいとおもいます。
>> 例えばlog4netはDLしたプロジェクトをソリューションにいれてコンパイルして使用しています。
>> 既存のxmlを使用していないので、AppConfigでなくassemblyInfoに設定しています。
>> →[assembly: log4net.Config.XmlConfigurator(ConfigFile =
>> "Log4netConfig.xml", Watch = true)]
>>
>> 私はDBFLUTE.NETを使っているため
>> トランザクションは、クラスの更新メソッド実行時に[Transaction]設定しているので
>> 独自のトランザクション開始終了やコミットに関しての設定はわかりません。
>>
>>
>> >②Quillに移行する過程で下記のようにインターフェースに属性を付加しています。
>> > そもそもの認識が間違っているかもしれませんが、
>> > 属性の付加とDB接続は全く関係ないのでしょうか?
>>
>> 私はDBFLUTE.NETを使っているため複数DBの接続を切り替えたりしないのであればDB接続時はなにも意識していません。
>> ※フォームに追加した羽マークのQuillコントロールがうまく制御してくれているのかな?
>> 実行時の接続で「Seasar.Quill.QuillConfig.cs」のSetupDataSourceByQuillSection
>> を通過すると思うんですがここでDSとれてないんですかね?
>>
>>
>>
>>
>> 以上
>>
>>
>> 志水様
>>
>> 回答いただき、ありがとうございます。
>>
>> AppConfigの設定は、ある程度、理解できました。
>>
>> そこで、根本的な質問になってしまうのですが、ご回答いただけると大変助かります。
>>
>> 現状、S2Containerを使用している箇所が、下記のように設定しています。
>>
>> 【Ado.dicon】
>>
>>
>> ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>>
>> <?xml version="1.0" encoding="utf-8" ?>
>> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN"
>> "http://www.seasar.org/dtd/components.dtd">
>> <components namespace="Ado">
>>
>>   <!-- データプロバイダ -->
>>   <component name="Oracle" class="Seasar.Extension.ADO.DataProvider">
>>     <property
>> name="ConnectionType">"Oracle.DataAccess.Client.OracleConnection"</property>
>>     <property
>> name="CommandType">"Oracle.DataAccess.Client.OracleCommand"</property>
>>     <property
>> name="ParameterType">"Oracle.DataAccess.Client.OracleParameter"</property>
>>     <property
>> name="DataAdapterType">"Oracle.DataAccess.Client.OracleDataAdapter"</property>
>>   </component>
>>
>>   <!-- データソース -->
>>   <component name="setConStrinterceptor"
>> class="****(名前空間).SetConnectionStringInterceptor">
>>     <property name="DataSource">DataSource</property>
>>   </component>
>>   <component name="DataSource"
>> class="Seasar.Extension.Tx.Impl.TxDataSource">
>>     <property name="DataProvider">Oracle</property>
>>     <!-- ConnectionStringはServer.configで設定-->
>>     <aspect>setConStrinterceptor</aspect>
>>   </component>
>>
>>   <!-- ローカルトランザクション用のインターセプターで使用します。 -->
>>   <component class="Seasar.Extension.Tx.Impl.TransactionContext" />
>>
>>
>>   <!--
>>   <component class="Seasar.Extension.ADO.Impl.BasicCommandFactory" />
>>   <component class="Seasar.Extension.ADO.Impl.BasicDataReaderFactory" />
>>   -->
>>
>> </components>
>>
>>
>> ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>>
>> 【SetConnectionStringInterceptor 】
>>
>>
>> ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>>
>>   /// <summary>
>>   /// DataSourceにConnectionStringをセットするインターセプター
>>   /// </summary>
>>   public class SetConnectionStringInterceptor : AbstractInterceptor
>>   {
>>     private Seasar.Extension.Tx.Impl.TxDataSource ds_;
>>     //private int intPort;
>>
>>     /// <summary>
>>     /// 対象のデータセット
>>     /// </summary>
>>     public Seasar.Extension.Tx.Impl.TxDataSource DataSource
>>     {
>>       set { ds_ = value; }
>>       get { return ds_; }
>>     }
>>
>>     /// <summary>
>>     /// 処理
>>     /// </summary>
>>     /// <param name="invocation"></param>
>>     /// <returns></returns>
>>     public override object Invoke(IMethodInvocation invocation)
>>     {
>>       if (ds_.ConnectionString == null || ds_.ConnectionString ==
>> string.Empty)
>>       {
>>         ds_.ConnectionString = GetConnectionString(); ← 接続文字列取得
>>       }
>>
>>       object result = invocation.Proceed();
>>
>>       return result;
>>     }
>>
>>   }
>>
>>
>> ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>>
>> このまま動作させると、ds_がnullとなったため、
>> 「Seasar.Tests.Quill.QuillContainerTest.TestRegistDataSource()」
>> を参考に変更しました。
>>
>>
>> QuillContainerを使用するということは、「Ado.dicon」を使用しないと認識しております。
>> ⇒Ado.diconのみでなく、diconファイル自体がなくなると思っています。
>>
>> 現状、diconファイルが複数存在しています。
>>
>> ①S2Containerからの移行を行う際に、すべての設定は、AppConfig内に集約されるということでしょうか?
>>
>> ②Quillに移行する過程で下記のようにインターフェースに属性を付加しています。
>> そもそもの認識が間違っているかもしれませんが、
>> 属性の付加とDB接続は全く関係ないのでしょうか?
>>
>>   [Implementation]
>>   [Aspect(typeof(SetConnectionStringInterceptor))] ←
>> SetConnectionStringInterceptorを付加
>>  ※S2Container使用時は、付加していない
>>   public interface IBhvService
>>   {
>> (中略)・・・SQL発行
>>   }
>>
>> デバッグを行うと、IBhvServiceの中のメソッドが呼ばれた後に、 SetConnectionStringInterceptorの
>> Invoke()の
>> 処理が行われる。
>> ⇒Invoke()内でエラー
>> 現状:ds_のNullエラー
>> 修正後: Assert.GreaterThanOrEqualTo<int>(ds.DataSourceCollection.Count,
>> 7);でエラー
>>
>> 長文になってしまい、申し訳ございませんが、
>> 知識不足もあり、根本的な理解ができておらず、
>> 試行錯誤している状態ですが、宜しくお願い致します。
>>
>> 2016年5月10日 10:35 志水正幸 < <ie2m-smz @ asahi-net.or.jp>
>> ie2m-smz @ asahi-net.or.jp>:
>>
>>> 初めまして
>>> 志水と申します。
>>>
>>> エラー内容に関してはわからないので、質問の回答にはならないのですが
>>> 私の動作環境はNETFrameworkの4.6.1を使用してるので
>>> 環境的には類似していると思い返信させてもらいました。
>>>
>>> DBはSQLServerです。
>>> 参考になるかわかりませんが、私のAppConfigの設定内容です。
>>> ※以前に竹内さんから頂いたメーリングリスト「[seasar-dotnet:2353] Re:
>>> QuillでのSQLServerの接続について」を参考に
>>> 実際の接続文字列の内容は、Properties設定をプログラム内で再設定しています。
>>> メーリングリスト[seasar-dotnet:2353]
>>> の内容はブラウザで「[seasar-dotnet:2353]」を検索すれば確認できると思います。
>>>
>>>
>>> <?xml version="1.0" encoding="utf-8"?>
>>> <configuration>
>>>   <configSections>
>>>     <section name="quill" type="Seasar.Quill.Xml.QuillSectionHandler,
>>> Seasar.Quill" />
>>>     <sectionGroup name="userSettings"
>>> type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0,
>>> Culture=neutral, PublicKeyToken=b77a5c561934e089" >
>>>       <section name="ProjectWin.Properties.Settings"
>>> type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0,
>>> Culture=neutral, PublicKeyToken=b77a5c561934e089"
>>> allowExeDefinition="MachineToLocalUser" requirePermission="false" />
>>>     </sectionGroup>
>>>   </configSections>
>>>
>>>   <startup>
>>>         <supportedRuntime version="v4.0"
>>> sku=".NETFramework,Version=v4.6.1"/>
>>>   </startup>
>>>
>>>
>>>   <quill>
>>>     <dataSources>
>>>
>>>       <dataSource name="Project_45">
>>>         <provider>SqlServer</provider>
>>>
>>> <connectionString>ProjectWin.Helpers.ConnectionStringHelper</connectionString>
>>>         <class>Seasar.Extension.Tx.Impl.TxDataSource</class>
>>>       </dataSource>
>>>
>>>     </dataSources>
>>>     <assemblys>
>>>       <!-- for .NET4.0 -->
>>>       <!--<assembly>MySql.Data, version=6.3.5.0, Culture=neutral,
>>> PublicKeyToken=c5687fc88969c44d</assembly>-->
>>>       <!-- for .NET2.0 -->
>>>       <!--<assembly>MySql.Data, version=1.0.10.1, Culture=neutral,
>>> PublicKeyToken=c5687fc88969c44d</assembly>-->
>>>     </assemblys>
>>>   </quill>
>>>
>>>
>>>   <userSettings>
>>>     <ProjectWin.Properties.Settings>
>>>       <setting name="DatabaseDataSource" serializeAs="String">
>>>         <value>WIN2008-SQLSV\MSSQL2014SERVER</value>
>>>       </setting>
>>>       <setting name="DatabasePort" serializeAs="String">
>>>         <value>1433</value>
>>>       </setting>
>>>       <setting name="DatabasePassword" serializeAs="String">
>>>         <value>ug7ku02IjB4DsAOWfJXeDQ==</value>
>>>       </setting>
>>>       <setting name="DatabaseInitialCatalog" serializeAs="String">
>>>         <value>Project</value>
>>>       </setting>
>>>       <setting name="DatabaseUserID" serializeAs="String">
>>>         <value>Projectdb</value>
>>>       </setting>
>>>       <setting name="Keycd" serializeAs="String">
>>>         <value>1</value>
>>>       </setting>
>>>     </ProjectWin.Properties.Settings>
>>>   </userSettings>
>>> </configuration>
>>>
>>>
>>> 以上
>>>
>>>
>>> 新谷です。
>>>
>>> 久保様、大変申し訳ございません。
>>> 各設定を記載させていただきます。
>>>
>>> 【AppConfig】
>>>
>>> ---------------------------------------------------------------------------------------------------------------------------------------------
>>>
>>> <?xml version="1.0"?>
>>> <configuration>
>>>
>>>   <configSections>
>>>     <section name="log4net"
>>> type="System.Configuration.IgnoreSectionHandler"/>
>>>     <section name="seasar" type="Seasar.Framework.Xml.S2SectionHandler,
>>> Seasar"/>
>>>       <section name="quill"
>>>         type="Seasar.Quill.Xml.QuillSectionHandler, Seasar.Quill" />
>>>   </configSections>
>>>
>>> (中略)
>>>
>>>   <quill>
>>>     <dataSources>
>>>       <dataSource name="ds">
>>>         <provider>Oracle</provider>
>>>         <connectionString>"接続文字列"</connectionString>
>>>         <class>Seasar.Extension.Tx.Impl.TxDataSource</class>
>>>       </dataSource>
>>>     </dataSources>
>>>     <assemblys>
>>>       <assembly>Seasar.Dao</assembly>
>>>       <!-- Oracle Data Provider for .NET を使用する場合に必要です。 -->
>>>       <assembly>
>>>         Oracle.DataAccess, version=2.111.7.0, Culture=neutral,
>>>         PublicKeyToken=89b483f429c47342
>>>       </assembly>
>>>     </assemblys>
>>>   </quill>
>>>
>>> <startup><supportedRuntime version="v4.0"
>>> sku=".NETFramework,Version=v4.6"/></startup></configuration>
>>>
>>>
>>> ---------------------------------------------------------------------------------------------------------------------------------------------
>>>
>>>
>>> 接続文字列の箇所を別のConfigファイルから変更したいと考えています。
>>>
>>> また、エラー内容につきましては、
>>>
>>> インターフェース
>>>
>>>   [Implementation]
>>>   [Aspect(typeof(SetConnectionStringInterceptor))]
>>>   public interface IBhvService
>>>   {
>>> (中略)
>>>   }
>>>
>>>   public override object Invoke(IMethodInvocation invocation)
>>>     {
>>>       QuillContainer container = new QuillContainer();
>>>
>>>       QuillComponent qc =
>>> container.GetComponent(typeof(SelectableDataSourceProxyWithDictionary));
>>>
>>>       Dictionary<int, string> dict = new Dictionary<int, string>();
>>>
>>>       Assert.AreEqual(typeof(SelectableDataSourceProxyWithDictionary),
>>> qc.ComponentType, "1");
>>>       SelectableDataSourceProxyWithDictionary ds =
>>> (SelectableDataSourceProxyWithDictionary)qc.GetComponentObject(
>>>           typeof(SelectableDataSourceProxyWithDictionary));
>>>       Assert.IsNotNull(ds, "2");
>>>       Assert.GreaterThanOrEqualTo<int>(ds.DataSourceCollection.Count, 7);
>>>
>>>
>>>       foreach (string key in ds.DataSourceCollection.Keys)
>>>       {
>>>         IDataSource part = ds.DataSourceCollection[key];
>>>         if (part is TxDataSource)
>>>         {
>>>           //  全てのTxDataSource系のデータソースに
>>>           //  TransactionContextが設定されているか確認
>>>           Assert.IsNotNull(((TxDataSource)part).Context,
>>>               "全てのTxDataSource系のデータソースにTransactionContextが設定されていない");
>>>         }
>>>       }
>>>
>>>       object result = invocation.Proceed();
>>>
>>>       return result;
>>>
>>>     }
>>>
>>> 上記実行で、「Expected left to be greater or equal than right.」とエラーが発生します。
>>>
>>> 参考は 「Seasar.Tests.Quill.QuillContainerTest.TestRegistDataSource()」 です。
>>>
>>> 正直な話、参考にしている箇所も理解できていない状態で参考元が正しいのか?
>>> また、正しかった場合、どこの箇所を変更する必要があるのか?
>>> がわかっていない状況です。
>>>
>>> 大変、大雑把な質問で申し訳ございませんが、
>>> ご回答いただけると大変助かります。
>>>
>>> 以上、宜しくお願い致します。
>>>
>>>
>>> 2016年5月9日 20:36 kubo <dbflute @ gmail.com>:
>>>
>>>> 久保(jflute) です
>>>>
>>>> 新谷さん、こんばんは
>>>>
>>>> > QuillでDB接続(Oracle)が上手くできないため、
>>>>
>>>> どううまくいかないのか具体的に示した方が、
>>>> ML閲覧者も回答しやすいかと思います。
>>>> 具体的なエラーの内容や、実際にやってみた設定内容など。
>>>> (業務上のセキュアな情報はマスクした上で)
>>>> _______________________________________________
>>>> seasar-dotnet mailing list
>>>> seasar-dotnet @ ml.seasar.org
>>>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>>>
>>>
>>>
>>>
>>> _______________________________________________
>>> seasar-dotnet mailing listseasar-dotnet @ ml.seasar.orghttps://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>>
>>>
>>>
>>>
>>> <https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=emailclient> ウイルス
>>> フリー。 www.avast.com
>>> <https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=emailclient>
>>>
>>> _______________________________________________
>>> seasar-dotnet mailing list
>>> seasar-dotnet @ ml.seasar.org
>>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>>
>>>
>>
>>
>> _______________________________________________
>> seasar-dotnet mailing listseasar-dotnet @ ml.seasar.orghttps://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>
>>
>>
>>
>> <https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=emailclient> ウイルス
>> フリー。 www.avast.com
>> <https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=emailclient>
>>
>> _______________________________________________
>> 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
>
>
-------------- next part --------------
HTML$B$NE:IU%U%!%$%k$rJ]4I$7$^$7$?(B...
URL: <http://ml.seasar.org/archives/seasar-dotnet/attachments/20160510/e4b864a1/attachment.html>


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