From 11c96396505a6f610e6f5066ba4b111328478b02 Mon Sep 17 00:00:00 2001 From: Elivo Date: Mon, 27 Oct 2025 14:58:35 +0800 Subject: [PATCH] =?UTF-8?q?SqlClient=EF=BC=9A=E5=BB=BA=E8=A1=A8=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E5=A4=9A=E4=B8=AA=E4=B8=BB=E9=94=AE=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Apewer.Source/Source/SqlClient.cs | 61 ++++++++++++++++++++++++++----- Apewer/Source/ColumnAttribute.cs | 7 ++++ 2 files changed, 59 insertions(+), 9 deletions(-) diff --git a/Apewer.Source/Source/SqlClient.cs b/Apewer.Source/Source/SqlClient.cs index 9393f11..cb4fb2b 100644 --- a/Apewer.Source/Source/SqlClient.cs +++ b/Apewer.Source/Source/SqlClient.cs @@ -131,7 +131,7 @@ namespace Apewer.Source } // 执行:添加列。 - if (newColumns.IsEmpty()) return TextUtility.Empty; + if (newColumns.IsEmpty()) return null; foreach (var column in newColumns) { var type = Declaration(column); @@ -139,11 +139,13 @@ namespace Apewer.Source var execute = Execute(sql, null, false); if (!execute.Success) return execute.Message; } - return TextUtility.Empty; + + return null; } else { var sqlcolumns = new List(); + var primaryKey = new List(); foreach (var column in structure.Columns) { // 检查 Independent 特性。 @@ -152,18 +154,59 @@ namespace Apewer.Source var type = Declaration(column); if (!column.Independent) { - if (column.PrimaryKey) type = type + " primary key"; if (column.Incremental) type += " identity"; + if (column.PrimaryKey) + { + primaryKey.Add(column); + type += " not null"; + } } if (string.IsNullOrEmpty(type)) return TextUtility.Merge("类型 ", column.Type.ToString(), " 不受支持。"); sqlcolumns.Add(type); } if (sqlcolumns.Count < 1) return $"无法对类型 {model.FullName} 创建表:没有定义任何字段。"; - var sql = TextUtility.Merge("create table [", table, "](", string.Join(", ", sqlcolumns.ToArray()), "); "); - var execute = Execute(sql, null, false); - if (execute.Success) return TextUtility.Empty; - return execute.Message; + + // 无主键时直接建表,有主键时使用事务。 + if (primaryKey.Count < 1) + { + // 执行建表。 + var sql = TextUtility.Merge("create table [", table, "](", string.Join(", ", sqlcolumns.ToArray()), "); "); + var execute = Execute(sql, null, false); + if (!execute.Success) + { + if (ThrowAdoException) throw new SqlException(execute.Message); + else return execute.Message; + } + + return null; + } + else + { + return this.InTransaction(() => + { + // 执行建表。 + var sql = TextUtility.Merge("create table [", table, "](", string.Join(", ", sqlcolumns.ToArray()), "); "); + var execute = Execute(sql, null, false); + if (!execute.Success) + { + if (ThrowAdoException) throw new SqlException(execute.Message); + else return execute.Message; + } + + // 添加主键。 + var sql_pk_fields = primaryKey.Map(x => $"[{x.Field}]").Join(", "); + var sql_pk = $"alter table [{table}] add constraint [pk_{table}] primary key clustered ({sql_pk_fields}) "; + var execute_pk = Execute(sql_pk, null, false); + if (!execute_pk.Success) + { + if (ThrowAdoException) throw new SqlException(execute_pk.Message); + else return execute_pk.Message; + } + + return null; + }); + } } } @@ -204,7 +247,7 @@ namespace Apewer.Source var sql = sb.ToString(); var execute = Execute(sql, ps, false); - if (execute.Success) return TextUtility.Empty; + if (execute.Success) return null; return execute.Message; } @@ -248,7 +291,7 @@ namespace Apewer.Source var sql = $"update {table} set {string.Join(", ", items.ToArray())} where [{structure.Key.Field}]='{key}'"; var execute = Execute(sql, ps, false); - if (execute.Success) return TextUtility.Empty; + if (execute.Success) return null; return execute.Message; } diff --git a/Apewer/Source/ColumnAttribute.cs b/Apewer/Source/ColumnAttribute.cs index a10604b..f0938b3 100644 --- a/Apewer/Source/ColumnAttribute.cs +++ b/Apewer/Source/ColumnAttribute.cs @@ -93,6 +93,13 @@ namespace Apewer.Source #endregion + /// + public override string ToString() + { + var primaryKey = PrimaryKey ? ", PrimaryKey" : ""; + return $"[ {_field} ] Type = {_type} {Length}{primaryKey}"; + } + /// 生成 Json 对象。 public Json ToJson() {