/// <summary> /// DBトランザクションからインスタンスを生成します。 /// </summary> /// <param name="transaction">DBトランザクション</param> /// <param name="timeout">タイムアウト時間</param> /// <param name="builder">Dapperで実行するSQL/パラメータを組み立てるオブジェクト(省略時はシステムデフォルトのオブジェクトを使用)</param> public QueryRunner(IDbTransaction transaction, int?timeout = null, QueryBuilder builder = null) : this(transaction.Connection, transaction, timeout, builder) { }
/// <summary> /// インスタンスを生成します。 /// </summary> /// <param name="connection">DB接続</param> /// <param name="transaction">DBトランザクション</param> /// <param name="timeout">タイムアウト時間</param> /// <param name="builder">Dapperで実行するSQL/パラメータを組み立てるオブジェクト(省略時はシステム既定のオブジェクトを使用)</param> private QueryRunner(IDbConnection connection, IDbTransaction transaction, int?timeout, QueryBuilder builder) { this.Connection = connection; this.Transaction = transaction; this.Timeout = timeout; this.Builder = builder ?? QueryBuilder.DefaultInstance; }
/// <summary> /// DB接続からインスタンスを生成します。 /// </summary> /// <param name="connection">DB接続</param> /// <param name="timeout">タイムアウト時間</param> /// <param name="builder">Dapperで実行するSQL/パラメータを組み立てるオブジェクト(省略時はシステム既定のオブジェクトを使用)</param> public QueryRunner(IDbConnection connection, int?timeout = null, QueryBuilder builder = null) : this(connection, null, timeout, builder) { }
/// <summary> /// ※QueryBuilderからの呼び出し用:式木として記述されているメソッド・引数にもとづき、SQL条件式を生成しパラメータをバインドします /// </summary> /// <param name="methodName">式木のメソッド名</param> /// <param name="arguments">式木に指定された引数</param> /// <param name="builder">QueryBuilderオブジェクト</param> /// <param name="parameters">パラメータオブジェクト</param> /// <param name="column">条件式生成対象カラム(nullの場合は生成されるSQL自体が真偽値を返す)</param> /// <param name="opIsNot">条件式をnotで生成する場合はtrue</param> /// <returns>生成されたSQL条件式</returns> public string BuildSql(string methodName, ReadOnlyCollection <Expression> arguments, QueryBuilder builder, DynamicParameters parameters, TableInfo.Column column, bool opIsNot) { if (methodName == NameOf.Like) { // ToSql.Like(string): Like演算子を組み立てる var value = ExpressionHelper.EvaluateValue(arguments[0]); return(column.Name + (opIsNot ? " not" : "") + " like " + builder.AddParameter(parameters, column.PropertyInfo.Name, value)); } else if (methodName == NameOf.In) { if (arguments[0].Type == typeof(string)) { // ToSql.In(string): INサブクエリとして指定された文字列を直接埋め込む return(column.Name + (opIsNot ? " not" : "") + " in(" + ExpressionHelper.EvaluateValue(arguments[0]) + ")"); } else { // ToSql.In(コレクション): In演算子を組み立てる return(builder.BuildWhereIn(parameters, column, opIsNot, ExpressionHelper.EvaluateValue(arguments[0]))); } } else if (methodName == NameOf.Between) { // ToSql.Between(値1, 値2): Between演算子を組み立て、パラメータを2つバインドする。nullの可能性は考慮しない var value1 = ExpressionHelper.EvaluateValue(arguments[0]); var value2 = ExpressionHelper.EvaluateValue(arguments[1]); return(column.Name + (opIsNot ? " not" : "") + " between " + builder.AddParameter(parameters, column.PropertyInfo.Name, value1) + " and " + builder.AddParameter(parameters, column.PropertyInfo.Name, value2)); } else if (methodName == NameOf.Eval) { // ToSql.Eval(string, [object[]]):指定されたSQL文字列を直接埋め込む var sb = new StringBuilder( (column == null ? (opIsNot ? "not " : "") : (column.Name + (opIsNot ? "<>" : "="))) + ExpressionHelper.EvaluateValue(arguments[0]) ); // object[] に相当する部分が指定されていればその部分も組み立てる var bindvalueAndSubsequentsql = (arguments.Count == 2 ? ExpressionHelper.EvaluateValue(arguments[1]) as object[] : null); for (var i = 0; bindvalueAndSubsequentsql != null && i < bindvalueAndSubsequentsql.Length; i++) { var value = bindvalueAndSubsequentsql[i]; if (i % 2 == 0) { // paramsとしては偶数(メソッド引数としては2,4,6,8,…,2n番目):指定されている値をバインド sb.Append(builder.AddParameter(parameters, null, value)); } else if (bindvalueAndSubsequentsql[i] is string) { // paramsとしては奇数(メソッド引数としては3,5,7,9,…,2n+1番目):指定されている文字列をSQLとみなして付加 sb.Append(value); } else { // SQLリテラルを指定すべき箇所で誤って文字列以外が指定されている:例外をthrow var badParamName = "argument" + (i + 1); throw new ArgumentException(badParamName + "(" + (value ?? "null") + "): No SQL statemnt specified.", badParamName); } } return(sb.ToString()); } else { throw new InvalidExpressionException(methodName); } }