Ejemplo n.º 1
0
        /// <summary>
        /// 指定された型情報から全件更新クエリを生成します。
        /// </summary>
        /// <typeparam name="T">テーブルの型</typeparam>
        /// <param name="properties">更新対象の列</param>
        /// <returns>生成されたSQL</returns>
        /// <remarks>
        /// [作成例]
        ///
        ///  update TableName
        /// set
        ///     Column1 = :Column1
        ///     Column2 = :Column2
        /// </remarks>
        public static string CreateUpdateAllSql <T>(params Expression <Func <T, object> >[] properties)
        {
            //--- パラメーター
            var table       = This.GetTableAttribute <T>();
            var columnNames = properties == null || properties.Length == 0
                            ? This.GetProperties <T>().Select(x => x.Name)
                            : properties.GetMemberNames();
            var setParams = columnNames.Select(x => string.Format("\t{0} = :{0}", x));
            var separator = string.Format(",{0}", Environment.NewLine);

            //--- SQL生成
            var builder = new StringBuilder();

            builder.AppendFormat("update {0}.{1}", table.Schema, table.Name);
            builder.AppendLine();
            builder.AppendLine("set");
            builder.Append(string.Join(separator, setParams));
            return(builder.ToString());
        }
Ejemplo n.º 2
0
 /// <summary>
 /// 指定された型情報から主キーに付属しているシーケンスのインクリメントクエリを生成します。
 /// </summary>
 /// <typeparam name="T">テーブルの型</typeparam>
 /// <returns>生成されたSQL</returns>
 /// <remarks>
 /// [作成例]
 ///
 /// select * sequence.nextval from dual
 /// </remarks>
 public static string CreateNextAutoIdSql <T>()
 {
     try
     {
         var keyType = typeof(KeyAttribute);
         var autoKey = This.GetProperties <T>()
                       .Where(x => x.GetCustomAttributesData().Any(y => y.AttributeType == keyType)) //--- 主キーのみ
                       .Select(x => new
         {
             ColumnName = x.Name,
             Sequence   = x.GetCustomAttribute <SequenceAttribute>(false),
         })
                       .Single(x => x.Sequence != null);
         return(string.Format("select {0}.nextval from dual", autoKey.Sequence.FullName));
     }
     catch
     {
         throw new ArgumentException("主キーが1つでシーケンスが利用されている型が指定されていません。");
     }
 }
Ejemplo n.º 3
0
        /// <summary>
        /// 指定された型情報からレコードの挿入クエリを生成します。
        /// </summary>
        /// <typeparam name="T">テーブルの型</typeparam>
        /// <returns>生成されたSQL</returns>
        public static string CreateInsertSql <T>(DB dB = DB.SQLServer)
        {
            //--- 列情報などのパラメーターを生成
            var properties  = This.GetProperties <T>();
            var columnNames = properties.Select(x => string.Format("\t{0}", x.Name));

            IEnumerable <string> values = null;

            switch (dB)
            {
            case DB.SQLServer:
                values = properties.Select(x => string.Format("\t@{0}", x.Name));
                break;

            case DB.Oracle:
                values = properties.Select(x => string.Format("\t:{0}", x.Name));
                break;
            }
            //var values = properties.Select(x => string.Format("\t:{0}", x.Name));

            var table     = This.GetTableAttribute <T>();
            var separator = string.Format(",{0}", Environment.NewLine);

            //--- SQL組み立て
            var builder = new StringBuilder();

            builder.AppendFormat("insert into {0}.{1}", table.Schema, table.Name);
            builder.AppendLine();
            builder.AppendLine("(");
            builder.AppendLine(string.Join(separator, columnNames));
            builder.AppendLine(")");
            builder.AppendLine("values");
            builder.AppendLine("(");
            builder.AppendLine(string.Join(separator, values));
            builder.Append(")");
            return(builder.ToString());
        }