Files
2026-07-10 15:25:05 +08:00

190 lines
7.6 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections.Generic;
using System.Data;
using System.Text;
using Zhaizj.Framework.Data;
using Zhaizj.Framework.Log;
using Zhaizj.Framework.ORM.Caching;
namespace Zhaizj.Framework.ORM.Operation {
internal class UpdateOperation {
private static readonly ILog logger = LogManager.GetLogger( typeof( UpdateOperation ) );
public static Result Update( IEntity obj ) {
if (obj == null) throw new ArgumentNullException();
EntityInfo ei = Entity.GetInfo( obj );
return Update( obj, ei );
}
private static Result Update( IEntity obj, EntityInfo entityInfo ) {
Result result = Validator.Validate( obj, "update" );
if (result.IsValid == false) return result;
List<IInterceptor> ilist = MappingClass.Instance.InterceptorList;
for (int i = 0; i < ilist.Count; i++) {
ilist[i].BeforUpdate( obj );
}
updateSingle( obj, entityInfo );
if (entityInfo.Parent != null) {
IEntity objParent = Entity.New( entityInfo.Parent.Type.FullName );
setParentValueFromChild( objParent, obj );
updateSingle( objParent, Entity.GetInfo( objParent ) );
}
CacheUtil.CheckCountCache( "insert", obj, entityInfo );
for (int i = 0; i < ilist.Count; i++) {
ilist[i].AfterUpdate( obj );
}
result.Info = obj;
// update cache timestamp
CacheTime.updateTable( entityInfo.Type );
return result;
}
public static void Update( IEntity obj, String[] arrPropertyName ) {
if (obj == null) throw new ArgumentNullException();
Update( obj, arrPropertyName, Entity.GetInfo( obj ) );
}
public static void Update( IEntity obj, String[] arrPropertyName, EntityInfo entityInfo ) {
if (obj == null) throw new ArgumentNullException();
StringBuilder builder = new StringBuilder( String.Empty );
builder.Append( "update " );
builder.Append( entityInfo.TableName );
builder.Append( " set " );
for (int i = 0; i < arrPropertyName.Length; i++) {
String columnName = entityInfo.GetColumnName( arrPropertyName[i] );
builder.Append( columnName );
builder.Append( "=" );
builder.Append( entityInfo.Dialect.GetParameter( columnName ) );
builder.Append( "," );
}
builder.Append( " where Id=" );
builder.Append( entityInfo.Dialect.GetParameter( "Id" ) );
String commandText = builder.ToString().Replace( ", where", " where" );
logger.Info( LoggerUtil.SqlPrefix+entityInfo.Name + "[" + entityInfo.TableName + "] Update Sql" + commandText );
List<IInterceptor> ilist = MappingClass.Instance.InterceptorList;
for (int i = 0; i < ilist.Count; i++) {
ilist[i].BeforUpdate( obj );
}
IDbCommand cmd = DataFactory.GetCommand( commandText, DbContext.getConnection( entityInfo ) );
for (int i = 0; i < arrPropertyName.Length; i++) {
Object parameterValue = obj.get( arrPropertyName[i] );
String columnName = entityInfo.GetColumnName( arrPropertyName[i] );
DataFactory.SetParameter( cmd, columnName, parameterValue );
}
int id = obj.Id;
DataFactory.SetParameter( cmd, "Id", id );
cmd.ExecuteNonQuery();
for (int i = 0; i < ilist.Count; i++) {
ilist[i].AfterUpdate( obj );
}
// update cache timestamp
CacheTime.updateTable( entityInfo.Type );
CacheUtil.CheckCountCache( "insert", obj, entityInfo );
}
public static void UpdateBatch( IEntity obj, String action, String condition ) {
if (obj == null) throw new ArgumentNullException();
UpdateBatch( obj, action, condition, Entity.GetInfo( obj ) );
}
private static int UpdateBatch( IEntity obj, String action, String condition, EntityInfo entityInfo ) {
if (obj == null) throw new ArgumentNullException();
if (strUtil.IsNullOrEmpty( action )) {
logger.Info( "no sql is executed : action String is empty" );
return 0;
}
//action = action.Trim().ToLower();
//if (!action.StartsWith( "set" )) {
// action = "set " + action;
//}
// http://www.Zhaizj.Framework.com/rubywu
// http://www.Zhaizj.Framework.com/Forum1/Topic/1706
if (!action.Trim().ToLower().StartsWith( "set" )) {
action = "set " + action;
}
condition = condition.Trim().ToLower();
if (!condition.StartsWith( "where" )) {
condition = "where " + condition;
}
String sql = String.Format( "update {0} {1} {2}", entityInfo.TableName, action, condition );
logger.Info(LoggerUtil.SqlPrefix+ "update sql : " + sql );
List<IInterceptor> ilist = MappingClass.Instance.InterceptorList;
for (int i = 0; i < ilist.Count; i++) {
ilist[i].BeforUpdateBatch( obj.GetType(), action, condition );
}
IDbCommand cmd = DataFactory.GetCommand( sql, DbContext.getConnection( entityInfo ) );
int rowAffected = cmd.ExecuteNonQuery();
logger.Info( "update : " + rowAffected + " records affected" );
for (int i = 0; i < ilist.Count; i++) {
ilist[i].AfterUpdateBatch( obj.GetType(), action, condition );
}
// update cache timestamp
CacheTime.updateTable( entityInfo.Type );
return rowAffected;
}
private static void updateSingle( IEntity obj, EntityInfo entityInfo ) {
IDbCommand cmd = DataFactory.GetCommand( getUpdateSql( entityInfo ), DbContext.getConnection( entityInfo ) );
OrmHelper.SetParameters( cmd, "update", obj, entityInfo );
DataFactory.SetParameter( cmd, "Id", obj.Id );
cmd.ExecuteNonQuery();
}
private static String getUpdateSql( EntityInfo entityInfo ) {
StringBuilder builder = new StringBuilder( "update " );
builder.Append( entityInfo.TableName );
builder.Append( " set " );
for (int i = 0; i < entityInfo.SavedPropertyList.Count; i++) {
EntityPropertyInfo info = entityInfo.SavedPropertyList[i];
if (((info.Name.ToLower() != "id") && info.SaveToDB) && !info.IsList) {
builder.Append( info.ColumnName );
builder.Append( "=" );
builder.Append( entityInfo.Dialect.GetParameter( info.ColumnName ) );
builder.Append( ", " );
}
}
builder.Remove( builder.Length - 2, 2 );
builder.Append( " where Id=" );
builder.Append( entityInfo.Dialect.GetParameter( "Id" ) );
logger.Info( LoggerUtil.SqlPrefix+" [update sql] " + builder.ToString() );
return builder.ToString();
}
private static void setParentValueFromChild( IEntity objParent, IEntity objChild ) {
List<EntityPropertyInfo> eplist = Entity.GetInfo( objParent ).SavedPropertyList;
foreach (EntityPropertyInfo info in eplist) {
objParent.set( info.Name, objChild.get( info.Name ) );
}
}
}
}