由来话说这个功能想法由来与java的Hibernate功能,我需要一个类和数据库映射,很简单的写一个实体类简单配置一下就ok了,
很是方便,
[flash=500,400]http://s1.knowsky.com/20160211/52lgianiwfv54.gif[/flash][flash=500,400]http://s1.knowsky.com/20160211/jxmt5ns3oov54.gif[/flash]1packagecom.game.po.log;23importcom.game.engine.utils.Config;4importcom.game.po.player.Role;5importcom.game.structs.player.Player;6importjava.io.Serializable;7importjavax.persistence.Column;8importjavax.persistence.GeneratedValue;9importjavax.persistence.GenerationType;10importjavax.persistence.Id;11importjavax.persistence.MappedSuperclass;1213/**14*15*@authorVicky16* @mail eclipser@163.com17* @phone 1361807494318*/19@MappedSuperclass20publicabstractclassBaseLogimplementsSerializable {2122PRivatestaticfinallongserialVersionUID = 1L;2324@Id25@GeneratedValue(strategy =GenerationType.AUTO)26protectedlongid;2728//所属用户ID29@Column30privatelonguserid;3132//所属用户名称33@Column34privateString username;3536//创建的服务器ID37@Column38privateintserverid;3940//服务器名称41@Column(length = 64)42privateString servername;4344//渠道名称45@Column(length = 64)46privateString serverweb;4748//角色ID49@Column50privatelongplayerid;5152//角色名称53@Column(length = 64)54privateString playername;5556//登录的服务器IP57@Column(length = 64)58privateString loginIP;5960//日志创建的服务器ID61@Column(nullable =false)62privateintcreateServerID;6364//日志创建的服务器名称65@Column(nullable =false, length = 64)66privateString createServerName;6768//日志创建的服务器渠道69@Column(nullable =false, length = 64)70privateString createServerWeb;7172//创建时间73@Column(nullable =false)74privatelongcreateTime =System.currentTimeMillis();7576publicBaseLog() {77}7879publicBaseLog(Player player) {80//初始化日志字段信息81if(player !=null) {82this.userid =player.getUserId();83this.username =player.getUsername();84this.serverid =player.getServerId();85this.servername =player.getServername();86this.serverweb =player.getServerweb();87this.loginIP =player.getLoginIP();88this.playerid =player.getId();89this.playername =player.getName();90}91this.createServerID =Config.serverID;92this.createServerName =Config.ServerName;93this.createServerWeb =Config.ServerWeb;94}9596publicBaseLog(Role role) {97if(role !=null) {98this.userid =role.getUserid();99this.username =role.getUsername();100this.serverid =role.getServerid();101this.servername =role.getServername();102this.serverweb =role.getServerweb();103this.loginIP =role.getLoginIP();104this.playerid =role.getPid();105this.playername =role.getName();106}107108this.createServerID =Config.serverID;109this.createServerName =Config.ServerName;110this.createServerWeb =Config.ServerWeb;111}112113publiclonggetId() {114returnid;115}116117//public void setId(long id) {118//this.id = id;119//}120121publiclonggetUserid() {122returnuserid;123}124125publicvoidsetUserid(longuserid) {126this.userid =userid;127}128129publicString getUsername() {130returnusername;131}132133publicvoidsetUsername(String username) {134this.username =username;135}136137publicintgetServerid() {138returnserverid;139}140141publicvoidsetServerid(intserverid) {142this.serverid =serverid;143}144145publicString getServername() {146returnservername;147}148149publicvoidsetServername(String servername) {150this.servername =servername;151}152153publicString getServerweb() {154returnserverweb;155}156157publicvoidsetServerweb(String serverweb) {158this.serverweb =serverweb;159}160161publicString getLoginIP() {162returnloginIP;163}164165publicvoidsetLoginIP(String loginIP) {166this.loginIP =loginIP;167}168169publiclonggetPlayerid() {170returnplayerid;171}172173publicvoidsetPlayerid(longplayerid) {174this.playerid =playerid;175}176177publicString getPlayername() {178returnplayername;179}180181publicvoidsetPlayername(String playername) {182this.playername =playername;183}184185publicintgetCreateServerID() {186returncreateServerID;187}188189publicvoidsetCreateServerID(intcreateServerID) {190this.createServerID =createServerID;191}192193publicString getCreateServerName() {194returncreateServerName;195}196197publicvoidsetCreateServerName(String createServerName) {198this.createServerName =createServerName;199}200201publicString getCreateServerWeb() {202returncreateServerWeb;203}204205publicvoidsetCreateServerWeb(String createServerWeb) {206this.createServerWeb =createServerWeb;207}208209publiclonggetCreateTime() {210returncreateTime;211}212213publicvoidsetCreateTime(longcreateTime) {214this.createTime =createTime;215}216217@Override218publicinthashCode() {219inthash = 7;220hash = 23 * hash + (int) (this.id ^ (this.id >>> 32));221returnhash;222}223224@Override225publicbooleanequals(Object obj) {226if(obj ==null) {227returnfalse;228}229if(getClass() !=obj.getClass()) {230returnfalse;231}232finalBaseLog other =(BaseLog) obj;233if(this.id !=other.id) {234returnfalse;235}236returntrue;237}238239}
View Code
就这样简单的写个实体类,加上注解,就完成了数据库映射配置,程序启动后Hibernate自动完成数据库和实体类的更新。
反而EF或者linq都让我觉得有些麻烦。
实体类映射数据库,数据库映射实体类。
我为什么需要这样呢?所谓我就想我能不能简单实现这个功能?因为有几个需求:
我需要一些日志记录类,这些类我希望他自动生成,并且能快速的实时的存入数据库。
EF,linq之类的也能完成这样的需求,但是蛮复杂的,而且我是游戏服务器开发人员,
不能完全随意的更改代码重启程序更新数据库等操作
所以我产生了这样一个需求在某种特定的条件下我只需要传入一个实体类,希望把这个实体类的数据自动存入数据库。
于是我开始不断的百度,无奈中国无法google,别告诉FQ哈。没有找到我需要的,或者说是满足我需求的现成货。
那么我只能自己动手了。
设计思路[flash=500,400]http://s1.knowsky.com/20160211/w4lzo5pgblf55.png[/flash]
通过实体类的反射转化sql,然后执行数据库映射,和数据存储,读取。
废话不多说根据 Hibernate ,EF,Linq 的实现机制肯定是需要加注解的,因为需要满足不同需求嘛,当然也可以不用加。
1///<summary>2///数据库关联类标识符3///</summary>4publicclassEntityAttribute : Attribute5{67publicstringName {get;set; }89publicstringDescription {get;set; }10}
实体类标识
1///<summary>2///属性字段3///</summary>4publicclassColumnAttribute : Attribute5{6publicColumnAttribute()7{89}10///<summary>11///数据库对应的字段名称12///</summary>13publicstringDBName {get;set; }14///<summary>15///原始字段名16///</summary>17publicstringName {get;set; }18///<summary>19///数据类型20///</summary>21publicstringDBType {get;set; }22///<summary>23///长度24///</summary>25publicintLength {get;set; }2627///<summary>28///是否是数据库主键29///</summary>30publicboolIsP {get;set; }3132///<summary>33///是否允许为null34///</summary>35publicboolIsNotNull {get;set; }3637///<summary>38///自增39///</summary>40publicboolIsAuto {get;set; }4142///<summary>43///将会被忽略的属性44///</summary>45publicboolIsTemp {get;set; }46///<summary>47///描述48///</summary>49publicstringDescription {get;set; }5051///<summary>52///记录字段的参数53///</summary>54publicstringValue {get;set; }55}
属性字段标识
还需要一个发生实体类的时候存储实体类信息的
1publicclassDBCache2{3publicDBCache()4{5ColumnPs =newList<ColumnAttribute>();6Columns =newList<ColumnAttribute>();7}8publicType Instance {get;set; }910publicstringTableName {get;set; }11///<summary>12///主键列13///</summary>14publicList<ColumnAttribute> ColumnPs {get;set; }15///<summary>16///所有列17///</summary>18publicList<ColumnAttribute> Columns {get;set; }1920}
满足基本所有需求了。
1///<summary>2///3///</summary>4[EntityAttribute(Name ="user")]5publicclassDBClassB6{7///<summary>8///9///</summary>10[ColumnAttribute(DBName ="ID", Length =4, IsP =true, IsAuto =true)]11publicintID {get;set; }12///<summary>13///14///</summary>15publicstringName {get;set; }1617[ColumnAttribute]18publicbyteSex {get;set; }1920[ColumnAttribute(IsTemp =true)]21publicstringTempName {get;set; }2223}
测试类。
上面是使用方法和辅助注解实现。
功能如何实现呢?功能需要反射实体类,把实体类的反射信息存储到 DBCache 中。
然后根据 DBCache 转化sql语句,来实现数据库执行映射。
这里我就以 sqlite 数据库为例实现功能为了实现多数据库功能版本切换,我们需要一个接口,
1///<summary>2///sql语句生成器3///</summary>4publicinterfaceICreateSqlScript : Sz.ScriptPool.IBaseScript5{67///<summary>8///想要实现自动创建表实体类必须实现 添加 EntityAttribute 特性9///</summary>10///<param name="key"></param>11voidInitTables(stringkey);1213///<summary>14///创建表和更新表结构15///</summary>16///<param name="dbObject">@实例对象</param>17///<returns></returns>18stringCreateTableSql(objectdbObject,stringkey);1920///<summary>21///修改表结构22///</summary>23///<param name="dbObject"></param>24///<param name="key"></param>25///<returns></returns>26stringUpdateTableSql(objectdbObject,stringkey);2728///<summary>29///删除表30///</summary>31///<param name="dbObject"></param>32///<param name="key"></param>33///<returns></returns>34stringDelTableSql(objectdbObject,stringkey);3536///<summary>37///创建 Inster sql38///</summary>39///<param name="dbObject">实例对象</param>40///<returns></returns>41intInsterIntoSql(objectdbObject,stringkey);4243///<summary>44///45///</summary>46///<param name="dbObject"></param>47///<param name="key"></param>48///<returns></returns>49DataTable SelectSql(objectdbObject,stringkey);5051///<summary>52///53///</summary>54///<typeparam name="T"></typeparam>55///<param name="dbObject"></param>56///<param name="key"></param>57///<returns></returns>58List<T> SelectSql<T>(objectdbObject,stringkey)whereT :new();5960///<summary>61///创建 Update sql62///</summary>63///<param name="dbObject">实例对象</param>64///<returns></returns>65stringUpdateSql(objectdbObject,stringkey);6667///<summary>68///创建 Delete sql69///</summary>70///<param name="dbObject">实例对象</param>71///<returns></returns>72stringDeleteSql(objectdbObject,stringkey);7374///<summary>75///76///</summary>77///<param name="dbObject">实例对象</param>78///<returns></returns>79voidGetProperty(objectdbObject,refDBCache cache);8081}
然后通过脚本对象实现对接口的实现,如果不是很清楚我的脚本的机制的可以看看我之前的文章,一步一步开发Game服务器(三)加载脚本和服务器热更新(二)完整版
1///<summary>2///3///</summary>4publicclassCreateSqliteScript : ICreateSqlScript5{67conststringNameKey ="Sqlite";8conststringexts =".dll,.exe,";910publicvoidInitTables(stringkey)11{12if(!NameKey.Equals(key))13{14return;15}16varasss =AppDomain.CurrentDomain.GetAssemblies();17foreach(variteminasss)18{19try20{21if(!item.ManifestModule.IsResource())22{23if(item.ManifestModule.FullyQualifiedName.ToLower().EndsWith(".exe")24|| item.ManifestModule.FullyQualifiedName.ToLower().EndsWith(".dll"))25{26try27{28//获取加载的所有对象模型29Type[] instances =item.GetExportedTypes();30foreach(varitemTypeininstances)31{32if(!itemType.IsClass ||itemType.IsAbstract)33{34continue;35}36if(itemType.IsDefined(typeof(EntityAttribute),false))37{38//生成实例39objectobj =item.CreateInstance(itemType.FullName);40CreateTableSql(obj, key);41}42}43}44catch(Exception ex)45{46Logger.Error("初始化表处理错误", ex);47}48}49}50}51catch(Exception ex)52{53Logger.Error("初始化表处理错误", ex);54}55}56}5758#regionpublic string CreateTableSql(object dbObject, string key)59publicstringCreateTableSql(objectdbObject,stringkey)60{61if(!NameKey.Equals(key))62{63returnnull;64}65DBCache cache =newDBCache();66this.GetProperty(dbObject,refcache);67StringBuilder builder =newStringBuilder();68if(cache !=null)69{70//builder.AppendLine("--如果表不存在那么创建表");71//builder.AppendLine(" begin");72builder.AppendLine().Append("CREATE TABLE if not exists").Append(cache.TableName).AppendLine("(");73boolisdouhao =false;74for(inti =0; i < cache.Columns.Count; i++)75{76varitem =cache.Columns[i];77if(!item.IsTemp)78{79if(isdouhao) builder.AppendLine(",");80builder.Append("").Append(item.DBName).Append("");81if(item.IsP)//主键82{83builder.Append("INTEGER PRIMARY KEY");84if(item.IsAuto)85{86//自增87builder.Append("AUTOINCREMENT");88}89}90elseif(item.IsAuto)91{92//自增93builder.Append("INTEGER AUTOINCREMENT");94}95else{ builder.Append(item.DBType).Append("").Append("(").Append(item.Length).Append(")"); }96if(item.IsNotNull) { builder.Append("NOT NULL"); }97else{ builder.Append("NULL"); }98isdouhao =true;99}100}101builder.AppendLine(")");102//builder.AppendLine(" end");103104//builder.AppendLine(" begin");105//builder.AppendLine(" --如果表存在检查字段");106//for (int i = 0; i < cache.Columns.Count; i++)107//{108//var item = cache.Columns[i];109//if (!item.IsTemp)110//{111//builder.Append("alter table ").Append(cache.TableName).Append(" add ").Append(item.Name).Append(" ");112//if (item.IsP)//主键113//{114//builder.Append("INTEGER PRIMARY KEY");115//if (item.IsAuto)116//{117////自增118//builder.Append(" AUTOINCREMENT");119//}120//}121//else if (item.IsAuto)122//{123////自增124//builder.Append("INTEGER AUTOINCREMENT");125//}126//else127//{128//builder.Append(item.DBType).Append("").Append("(").Append(item.Length).Append(")");129//}130131//if (item.IsNotNull)132//{133//builder.Append(" NOT NULL");134//}135//else136//{137//builder.Append(" NULL");138//}139//builder.AppendLine(";");140//}141//}142//builder.AppendLine(" end");143}144stringcreatesql =builder.ToString();145Logger.Info(createsql);146try147{148Logger.Info("创建表完成"+Sz.DBPool.Helpers.SqliteHelper.ExecuteNonQuery(createsql));149}150catch(Exception e)151{152Logger.Error("创建表错误:"+createsql, e);153}154155returnbuilder.ToString();156}157#endregion158159#regionpublic string InsterIntoSql(object dbObject, string key)160publicintInsterIntoSql(objectdbObject,stringkey)161{162if(!NameKey.Equals(key))163{164return-1;165}166DBCache cache =newDBCache();167this.GetProperty(dbObject,refcache);168StringBuilder builder =newStringBuilder();169if(cache !=null)170{171boolisdouhao =false;172builder.Append("insert into").Append(cache.TableName).Append("(");173for(inti =0; i < cache.Columns.Count; i++)174{175varitem =cache.Columns[i];176if(!item.IsTemp && !item.IsP)177{178if(isdouhao) { builder.Append(","); }179builder.Append(item.DBName);180isdouhao =true;181}182}183builder.Append(") values (");184isdouhao =false;185for(inti =0; i < cache.Columns.Count; i++)186{187varitem =cache.Columns[i];188if(!item.IsTemp && !item.IsP)189{190if(isdouhao) { builder.Append(","); }191builder.Append(item.Value);192isdouhao =true;193}194}195builder.AppendLine(");");196builder.AppendLine("select last_insert_rowid()");197}198stringinstersql =builder.ToString();199Logger.Info(instersql);200try201{202intret =Convert.ToInt32(Sz.DBPool.Helpers.SqliteHelper.ExecuteScalar(instersql));203if(ret >0)204{205Logger.Info("新增数据成功");206returnret;207}208}209catch(Exception e)210{211Logger.Error("添加数据出错:"+instersql, e);212}213Logger.Info("新增数据成功");214return0;215}216#endregion217218#regionpublic string UpdateSql(object dbObject, string key)219220publicstringUpdateSql(objectdbObject,stringkey)221{222if(!NameKey.Equals(key))223{224returnnull;225}226DBCache cache =newDBCache();227this.GetProperty(dbObject,refcache);228StringBuilder builder =newStringBuilder();229if(cache !=null)230{231builder.Append("update").Append(cache.TableName).Append("set");232boolisdouhao =false;233for(inti =0; i < cache.Columns.Count; i++)234{235varitem =cache.Columns[i];236if(!item.IsTemp && !item.IsP)237{238if(isdouhao) builder.Append(",");239builder.Append(item.DBName).Append("=").Append(item.Value);240isdouhao =true;241}242}243builder.Append("where");244for(inti =0; i < cache.Columns.Count; i++)245{246varitem =cache.Columns[i];247if(item.IsP)248{249builder.Append(item.DBName).Append("=").Append(item.Value);250
break;251}252}253}254stringupdatesql =builder.ToString();255Logger.Info(updatesql);256try257{258intret =Sz.DBPool.Helpers.SqliteHelper.ExecuteNonQuery(updatesql);259if(ret >0)260{261Logger.Info("更新数据成功");262return"更新成功";263}264}265catch(Exception e)266{267Logger.Error("更新数据出错:"+updatesql, e);268}269Logger.Info("更新数据失败");270return"更新数据失败";271}272#endregion273274#regionpublic string DeleteSql(object dbObject, string key)275publicstringDeleteSql(objectdbObject,stringkey)276{277if(!NameKey.Equals(key))278{279returnnull;280}281DBCache cache =newDBCache();282this.GetProperty(dbObject,refcache);283StringBuilder builder =newStringBuilder();284if(cache !=null)285{286builder.Append("delete from").Append(cache.TableName).Append("where");287boolisdouhao =false;288for(inti =0; i < cache.Columns.Count; i++)289{290varitem =cache.Columns[i];291if(!item.IsTemp)292{293if(!"0".Equals(item.Value) && !"''".Equals(item.Value) && !string.IsNullOrWhiteSpace(item.Value))294{295if(isdouhao) { builder.Append ("and"); }296builder.Append(item.DBName).Append("=").Append(item.Value);297isdouhao =true;298}299}300}301}302stringdeletesql =builder.ToString();303Logger.Info(deletesql);304try305{306intret =Sz.DBPool.Helpers.SqliteHelper.ExecuteNonQuery(deletesql);307if(ret >0)308{309return"删除成功";310}311}312catch(Exception)313{314return"删除失败";315}316return"删除失败";317}318#endregion319320#regionpublic void GetProperty(object dbObject, ref DBCache cache)321publicvoidGetProperty(objectdbObject,refDBCache cache)322{323Type @type =dbObject.GetType();324if(@type.IsClass)325{326//if (@type.Namespace != null && @type.Namespace.StartsWith("Sz.DBPool"))327{328if(cache ==null)329{330cache =newDBCache();331cache.Instance =@type;332}333if(@type.IsDefined(typeof(EntityAttribute),false))334{335object[] entityDBs = @type.GetCustomAttributes(typeof(EntityAttribute),false);336if(entityDBs.Length >0)337{338EntityAttribute entity = (EntityAttribute)entityDBs[0];339if(!string.IsNullOrWhiteSpace(entity.Name))340{341cache.TableName =entity.Name;342}343}344}345if(string.IsNullOrWhiteSpace(cache.TableName))346{347cache.TableName =@type.Name;348}349350varmembers = @type.GetProperties(BindingFlags.NonPublic | BindingFlags.Public |BindingFlags.Instance);351352foreach(varpropertyInfoinmembers)353{354//Console.WriteLine(@type.FullName + " " + propertyInfo.PropertyType.FullName + " " + propertyInfo.Name);355if(@type.FullName.Contains("System")) {continue; }356object[] columnDBs = propertyInfo.GetCustomAttributes(typeof(ColumnAttribute),false);357objectvalue = propertyInfo.GetValue(dbObject,null);358ColumnAttribute column =null;359if(columnDBs.Length >0) { column = (ColumnAttribute)columnDBs[0]; }360else{ column =newColumnAttribute(); }361booliscontinue =false;362if(string.IsNullOrWhiteSpace(column.DBType))363{364switch(propertyInfo.PropertyType.Name)365{366case"Bool":367column.DBType ="bit";368
break;369case"Byte":370column.DBType ="INTEGER";371
break;372case"Int16":373column.DBType ="INTEGER";374
break;375case"Int32":376column.DBType ="INTEGER";377
break;378case"Int64":379column.DBType ="INTEGER";380
break;381case"String":382if(column.Length ==0)383{384column.Length =255;385}386column.DBType ="TEXT";387
break;388default:389GetProperty(value,refcache);390iscontinue =true;391
break;392}393}394else395{396GetProperty(value,refcache);397iscontinue =true;398}399400if(iscontinue) {continue; }401402switch(propertyInfo.PropertyType.Name)403{404case"Bool":405column.Length =1;406column.Value =value.ToString();407
break;408case"Byte":409column.Length =1;410column.Value =value.ToString();411
break;412case"Int16":413column.Length =2;414column.Value =value.ToString();415
break;416case"Int32":417column.Length =4;418column.Value =value.ToString();419
break;420case"Int64":421column.Length =8;422column.Value =value.ToString();423
break;424case"String":425if(column.Length ==0)426{427column.Length =255;428}429430if(value ==null)431{432if(column.IsNotNull)433{434column.Value =null;435}436else437{438column.Value ="''";439}440}441else442{443column.Value ="'"+ value +"'";444}445
break;446}447448column.Name =propertyInfo.Name;449450if(string.IsNullOrWhiteSpace(column.DBName))451{452column.DBName =propertyInfo.Name;453}454455if(column.IsP)456{457cache.ColumnPs.Add(column);458}459cache.Columns.Add(column);460}461}462}463}464#endregion465466467publicstringUpdateTableSql(objectdbObject,stringkey)468{469if(!NameKey.Equals(key))470{471returnnull;472}473returnnull;474}475476publicstringDelTableSql(objectdbObject,stringkey)477{478if(!NameKey.Equals(key))479{480returnnull;481}482returnnull;483}484485#regionpublic DataTable SelectSql(object dbObject, string key)486publicDataTable SelectSql(objectdbObject,stringkey)487{488if(!NameKey.Equals(key))489{490returnnull;491}492DBCache cache =newDBCache();493this.GetProperty(dbObject,refcache);494StringBuilder builder =newStringBuilder();495if(cache !=null)496{497boolisdouhao =false;498stringwheresql ="";499500builder.Append("Select * from").Append(cache.TableName);501for(inti =0; i < cache.Columns.Count; i++)502{503varitem =cache.Columns[i];504if(!item.IsTemp)505{506if(!"0".Equals(item.Value) && !"''".Equals(item.Value) && !string.IsNullOrWhiteSpace(item.Value))507{508if(isdouhao) { wheresql += ("and"); }509wheresql += item.DBName + ("=") +(item.Value);510isdouhao =true;511}512}513}514if(!string.IsNullOrWhiteSpace(wheresql))515{516builder.Append("where").Append(wheresql);517}518for(inti =0; i < cache.Columns.Count; i++)519{520varitem =cache.Columns[i];521if(item.IsP)522{523builder.Append("order by").Append(item.DBName).Append("desc");524
break;525}526}527}528stringselectSql =builder.ToString();529Logger.Info(selectSql);530531try532{533DataTable table =Sz.DBPool.Helpers.SqliteHelper.ExecuteQuery(selectSql);534535returntable;536}537catch(Exception e)538{539Logger.Error("查询数据库错误:"+selectSql, e);540}541returnnull;542}543#endregion544545#regionpublic List<T> SelectSql<T>(object dbObject, string key) where T : new()546publicList<T> SelectSql<T>(objectdbObject,stringkey)whereT :new()547{548if(!NameKey.Equals(key))549{550returnnull;551}552List<T> ts =newList<T>();553DataTable table =this.SelectSql(dbObject, key);554if(table !=null)555{556DBCache cache =newDBCache();557this.GetProperty(dbObject,refcache);558foreach(DataRow itemintable.Rows)559{560T t =newT();561for(inti =0; i < cache.Columns.Count; i++)562{563varcolumn =cache.Columns[i];564if(!column.IsTemp)//非临时的565{566objectcolumnValue =item[column.DBName];567//反射568PropertyInfo info =t.GetType().GetProperty(column.Name);569//赋值570info.SetValue(t, Convert.ChangeType(columnValue, info.PropertyType),null);571}572}573ts.Add(t);574}575}576returnts;577}578#endregion579580}
这个脚本针对sqlite实现了数据库的映射,数据的插入,更新,删除,读取,读取反射加载实体类集合等功能
并且这段代码是通过了一个小在线运行项目的完整测试的。由于是部署客户内网运行,所以不方便提供给各位测试了。
接下来按照惯例看看执行效果,1staticvoidMain(string[] args)2{3vardbconnect = System.Configuration.ConfigurationManager.ConnectionStrings["DBConnect"];45Helpers.SqliteHelper.SetConnectionString(dbconnect.ConnectionString);6ScriptPool.ScriptManager.Instance.LoadCSharpFile(newstring[] {@"..\..\..\Sz.DBPool.Scripts\"});7vartemps = Sz.ScriptPool.ScriptManager.Instance.GetInstances<ICreateSqlScript>();8DBClassB db =newDBClassB();9System.Diagnostics.Stopwatch watch =newSystem.Diagnostics.Stopwatch();10watch.Start();11//Helpers.SqliteHelper.Transaction();12//for (int i = 0; i < 2000; i++)13{1415foreach(varitemintemps)16{17try18{19stringcreatesql = item.CreateTableSql(db,"Sqlite");20if(createsql ==null)21{22continue;23}24item.InsterIntoSql(db,"Sqlite");25item.SelectSql(db,"Sqlite");26}27catch(Exception e)28{29Logger.Debug("dd", e);30}31}32}33//Helpers.SqliteHelper.Commit();34watch.Stop();35Logger.Debug(watch.ElapsedMilliseconds +"");3637Console.ReadLine();38}
[flash=500,400]http://s1.knowsky.com/20160211/r4faskgv0y055.jpg[/flash]
创建数据库表返回值为-1的原因是因为已经创建过表了。
看到这里也许很多园友会喷,你这有意义嘛?有意思嘛?其实我觉得存在即合理,只要你需要就有意义,如果不需要就没有意义。
就想你一个门户网站根本不需要登录的,结果你非要做一个登录,那就完全没意思,所以不需要喷。
当然这个功能要写强大了肯定需要更多的人力和时间。也希望有帮助的园友,如果愿意可以一起开发维护这个东西。效率的话,看控制吧。控制得好就非常高的效率。.
如果愿意的园友,回复留言,我可以提供源码或者svn一起维护,MySQL,sqlserver等版本。