jfluteです
BasicCommandFactory.csは、Github上で発見しました。
(ブランチに隠れてて素直に見つからなかった...)
https://github.com/seasarorg/s2container.net/blob/s2container.net-v1.4-for.NET4.0/s2container.net/source/Seasar/Seasar.Extension.ADO/Impl/BasicCommandFactory.cs
// CommandTimeoutのプロパティ定義
public int CommandTimeout { get; set; } = -1;
...
// IDbCommandの生成: Tn側のクラスでオーバーライドされるのでこっちは動かないはず
public virtual IDbCommand CreateCommand(IDbConnection con, string sql)
{
var cmd = con.CreateCommand();
cmd.CommandText = ChangeSignSql(cmd, sql);
if (CommandTimeout > -1)
{
cmd.CommandTimeout = CommandTimeout;
}
return cmd;
}
...
// 実行するときに呼ばれる。インスタンス変数は何も使ってないので何を影響はなさそう
public virtual int ExecuteNonQuery(IDataSource dataSource, IDbCommand cmd)
{
return CommandUtil.ExecuteNonQuery(dataSource, cmd);
}
> ExecuteNonQuery実行時のcmdのCommandTimeout は変更した内容が正しく入っていた
ここがすべてを物語るはずで、セットする元データ次第で効く効かないが変わるとは思えませんもんね。
(どっちのやり方にしても、最終的に IDbCommand に CommandTimeout は入っていると)
ここまで来たら完全に論理的な矛盾を抱えていますから、
どこかしら前提と思ってしまっているロジックが実は違った、分析で間違ったところがあった、
ということがあるかもしれません。状況を変えて試し実行して要因を増やしていく方が良いですね。
例えば、TnBasicCommandFactory@CreateCommand() の中の、
「ここを通ったときは効いている」という S2Dao original logic. 側の else の方で、
if分岐を外して以下のように書き換えて実行してみると、どうなるでしょう?
(StatementConfigは利用せずに)
cmd.CommandTimeout = 0 ; // S2Dao original logic.
また、その else では完全に何もせず(CommandTimeout設定しない)、
デバッガーで private int commandTimeout の値を0にした場合、どうなるでしょう?
cmd.CommandTimeout のセット処理が影響しているのか?
BasicCommandFactoryのCommandTimeout が直接的にどこかで盛況しているのか?
その辺の切り分けができればと。