/// <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()); }
/// <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つでシーケンスが利用されている型が指定されていません。"); } }
/// <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()); }