Files
lserp_cs_5.0/插件库/Zhaizj.Framework/Data/TableBuilder/TableBuilderBase.cs
T
2026-07-10 15:25:05 +08:00

227 lines
8.5 KiB
C#

using System;
using System.Data;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using Zhaizj.Framework.ORM;
using Zhaizj.Framework.Log;
namespace Zhaizj.Framework.Data {
internal class TableBuilderBase {
private static readonly ILog logger = LogManager.GetLogger( typeof( TableBuilderBase ) );
public List<String> CheckMappingTableIsExist( IDbCommand cmd, String db, List<String> existTables, MappingClass mapping ) {
foreach (DictionaryEntry entry in mapping.ClassList) {
EntityInfo entity = entry.Value as EntityInfo;
if (entity.Database.Equals( db ) == false) continue;
if (!isTableCreated( existTables, entity )) {
existTables = createTable( entity, cmd, existTables, mapping.ClassList );
}
}
return existTables;
}
private List<String> createTable( EntityInfo entity, IDbCommand cmd, List<String> existTables, IDictionary clsList ) {
StringBuilder sb = new StringBuilder();
sb.AppendFormat( "Create Table {0} (", getFullName( entity.TableName, entity ) );
addColumn_PrimaryKey( entity, sb, clsList );
addColumns( entity, sb );
String str = sb.ToString().Trim().TrimEnd( new char[] { ',' } ) + " )";
cmd.CommandText = str;
logger.Info( "create table:" + str );
if (cmd.Connection == null) throw new Exception( "connection is null" );
if (cmd.Connection.State == ConnectionState.Closed) {
cmd.Connection.Open();
}
cmd.ExecuteNonQuery();
existTables.Add( entity.TableName );
logger.Info( LoggerUtil.SqlPrefix + String.Format( "create table {0} ({1})", entity.TableName, entity.FullName ) );
return existTables;
}
private void addColumns( EntityInfo entity, StringBuilder sb ) {
for (int i = 0; i < entity.SavedPropertyList.Count; i++) {
EntityPropertyInfo ep = entity.SavedPropertyList[i];
String columnName = getFullName( ep.ColumnName, entity );
if ((ep.SaveToDB && !ep.IsList) && !(ep.Name == "Id")) {
addColumnSingle( entity, sb, ep, columnName );
}
}
}
private void addColumnSingle( EntityInfo entity, StringBuilder sb, EntityPropertyInfo ep, String columnName ) {
if (ep.Type == typeof( int )) {
addColumn_Int( sb, ep, columnName );
}
else if (ep.Type == typeof( DateTime )) {
addColumn_Time( sb, columnName );
}
else if (ep.Type == typeof( decimal )) {
addColumn_Decimal( entity, sb, ep, columnName );
}
else if (ep.Type == typeof( double )) {
addColumn_Double( entity, sb, columnName );
}
else if (ep.Type == typeof( float )) {
addColumn_Single( entity, sb, columnName );
}
else if (ep.Type == typeof( String )) {
addColumn_String( entity, sb, ep, columnName );
}
else if (ep.IsEntity) {
addColumn_entity( sb, columnName );
}
}
//------------------------------------------------------------------------------------------------------------------------
protected virtual void addColumn_PrimaryKey( EntityInfo entity, StringBuilder sb, IDictionary clsList ) {
// 不是自动编号
if (!DbConfig.Instance.IsAutoId || isAddIdentityKey( entity.Type ) == false) {
sb.Append( " Id int primary key default 0, " );
}
else {
sb.Append( " Id int identity(1,1) primary key, " );
}
}
private Boolean isAddIdentityKey( Type t ) {
if (OrmHelper.IsEntityBase( t.BaseType )) return true;
if (t.BaseType.IsAbstract) return true;
return false;
}
protected virtual void addColumn_Int( StringBuilder sb, EntityPropertyInfo ep, String columnName ) {
sb.Append( columnName );
if (ep.Property.IsDefined( typeof( TinyIntAttribute ), false )) {
sb.Append( " tinyint default 0, " );
}
else {
sb.Append( " int default 0, " );
}
}
protected virtual void addColumn_Time( StringBuilder sb, String columnName ) {
sb.Append( columnName );
sb.Append( " DateTime, " );
}
protected virtual void addColumn_Decimal( EntityInfo entity, StringBuilder sb, EntityPropertyInfo ep, String columnName ) {
if (ep.MoneyAttribute != null) {
sb.Append( columnName );
sb.Append( " money default 0, " );
}
else {
DecimalAttribute da = ep.DecimalAttribute;
if (da == null) throw new Exception( "DecimalAttribute not found=" + entity.FullName + "_" + ep.Name );
sb.Append( columnName );
sb.Append( " decimal(" + da.Precision + "," + da.Scale + ") default 0, " );
}
}
protected virtual void addColumn_Double( EntityInfo entity, StringBuilder sb, string columnName ) {
sb.Append( columnName );
sb.Append( " float default 0, " );
}
protected virtual void addColumn_Single( EntityInfo entity, StringBuilder sb, string columnName ) {
sb.Append( columnName );
sb.Append( " real default 0, " );
}
protected virtual void addColumn_String( EntityInfo entity, StringBuilder sb, EntityPropertyInfo ep, String columnName ) {
if (ep.LongTextAttribute != null) {
addColumn_LongText( entity, sb, columnName );
}
else if (ep.SaveAttribute != null) {
addColumn_ByColumnAttribute( entity, sb, ep, columnName );
}
else {
addColumn_ShortText( sb, columnName, 250 );
}
}
protected virtual void addColumn_LongText( EntityInfo entity, StringBuilder sb, String columnName ) {
sb.Append( columnName );
sb.Append( " ntext, " );
}
protected virtual void addColumn_ShortText( StringBuilder sb, String columnName, int length ) {
sb.Append( columnName );
sb.Append( " nvarchar(" );
sb.Append( length );
sb.Append( "), " );
}
protected virtual void addColumn_ByColumnAttribute( EntityInfo entity, StringBuilder sb, EntityPropertyInfo ep, String columnName ) {
if (ep.SaveAttribute.Length < 255) {
addColumn_ShortText( sb, columnName, ep.SaveAttribute.Length );
}
else if ((ep.SaveAttribute.Length > 255) && (ep.SaveAttribute.Length < 4000)) {
addColumn_MiddleText( entity, sb, ep, columnName );
}
else {
addColumn_LongText( entity, sb, columnName );
}
}
protected virtual void addColumn_MiddleText( EntityInfo entity, StringBuilder sb, EntityPropertyInfo ep, String columnName ) {
addColumn_ShortText( sb, columnName, ep.SaveAttribute.Length );
}
protected virtual void addColumn_entity( StringBuilder sb, String columnName ) {
sb.Append( columnName );
sb.Append( " int default 0, " );
}
//------------------------------------------------------------------------------------------------------------------------
private String getFullName( String name, EntityInfo entity ) {
if (DbConst.SqlKeyWords.Contains( name.ToLower() )) {
String message = String.Format( "'{0}' is reserved word. Entity:{1}, Table:{2}", name, entity.FullName, entity.TableName );
logger.Info( message );
throw new Exception( message );
}
return name;
}
private Boolean isTableCreated( IList existTables, EntityInfo entity ) {
for (int i = 0; i < existTables.Count; i++) {
if (string.Compare( existTables[i].ToString(), entity.TableName.Replace( "[", "" ).Replace( "]", "" ), true ) == 0) {
logger.Info( "table map : " + entity.FullName + " => " + existTables[i] );
return true;
}
}
return false;
}
}
}