Example #1
0
 /// <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)
 {
 }
Example #2
0
 /// <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;
 }
Example #3
0
 /// <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)
 {
 }
Example #4
0
 /// <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);
     }
 }