C#发现之旅第十二讲 基于反射和动态编译的快速ORM框架(下)

对于字符串类型的属性,其默认值就是“DBNull”。而对于其他的整数或者日 期类型的属性,并没有默认值,因此是无条件的插入到数据库中。

我们使用以下的代 码来生成上述代码文本

myWriter.WriteLine("public override int  FillInsertCommand( System.Data.IDbCommand cmd , object objRecord )");
myWriter.BeginGroup("{");
myWriter.WriteLine("if( cmd == null ) throw  new ArgumentNullException(\"cmd\");");
myWriter.WriteLine("if( objRecord  == null ) throw new ArgumentNullException(\"objRecord\");");
myWriter.WriteLine(RecordType.FullName + " myRecord = objRecord as " +  RecordType.FullName + " ;");
myWriter.WriteLine("if( myRecord ==  null ) throw new ArgumentException(\"must type '" + RecordType.FullName  + "' \");");
myWriter.WriteLine("System.Collections.ArrayList  myFieldNames = new System.Collections.ArrayList();");
myWriter.WriteLine ("System.Collections.ArrayList myValues = new System.Collections.ArrayList ();");
for (int iCount = 0; iCount < ps.Length; iCount++)
{
    System.Reflection.PropertyInfo p = ps[iCount];
    if  (p.CanRead == false)
    {
        continue;
     }

    BindFieldAttribute fa = (BindFieldAttribute) Attribute.GetCustomAttribute(
        p, typeof (BindFieldAttribute));
    string FieldName = GetBindFieldName(p);

    myWriter.WriteLine("");
    Type pt =  p.PropertyType;
    object DefaultValue = this.GetDefaultValue(p);
    if (pt.Equals(typeof(string)))
    {
         myWriter.WriteLine("if( myRecord." + p.Name + " != null &&  myRecord." + p.Name + ".Length != 0 )");
         myWriter.BeginGroup("{");
        myWriter.WriteLine ("myFieldNames.Add( \"" + FieldName + "\" );");
         myWriter.WriteLine("myValues.Add( myRecord." + p.Name + " );");
         myWriter.EndGroup("}");
    }
    else if  (pt.Equals(typeof(DateTime)))
    {
         myWriter.WriteLine("myFieldNames.Add( \"" + FieldName + "\" );");
         if (fa.WriteFormat != null && fa.WriteFormat.Length  > 0)
        {
            myWriter.WriteLine ("myValues.Add( myRecord." + p.Name + ".ToString(\"" + fa.WriteFormat +  "\") );");
        }
        else
         {
            myWriter.WriteLine("myValues.Add( myRecord." +  p.Name + ".ToString(\"yyyy-MM-dd HH:mm:ss\") );");
        }

    }
    else
    {
         myWriter.WriteLine("myFieldNames.Add( \"" + FieldName + "\" );");
         myWriter.WriteLine("myValues.Add( myRecord." + p.Name +  " );");
    }
}//for
myWriter.WriteLine("");
myWriter.WriteLine("if( myFieldNames.Count == 0 ) return 0 ;");
myWriter.WriteLine("cmd.Parameters.Clear() ;");
myWriter.WriteLine ("System.Text.StringBuilder mySQL = new System.Text.StringBuilder();");
myWriter.WriteLine("mySQL.Append( \"Insert Into " + TableName + " ( \"  );");
myWriter.WriteLine("mySQL.Append( ConcatStrings( myFieldNames  ));");
myWriter.WriteLine("mySQL.Append( \" ) Values ( \" );");
myWriter.WriteLine("for( int iCount = 0 ; iCount < myValues.Count ;  iCount ++ )");
myWriter.BeginGroup("{");
myWriter.WriteLine("if(  iCount > 0 ) mySQL.Append(\" , \" );");
if (bolNamedParameter)
{
    myWriter.WriteLine("mySQL.Append(\" @Value\" + iCount )  ;");
    myWriter.WriteLine("System.Data.IDbDataParameter parameter  = cmd.CreateParameter();");
    myWriter.WriteLine("parameter.Value =  myValues[ iCount ] ;");
    myWriter.WriteLine ("parameter.ParameterName = \"Value\" + iCount ;");
     myWriter.WriteLine("cmd.Parameters.Add( parameter );");
}
else
{
    myWriter.WriteLine("mySQL.Append(\" ? \") ;");
     myWriter.WriteLine("System.Data.IDbDataParameter parameter =  cmd.CreateParameter();");
    myWriter.WriteLine("parameter.Value =  myValues[ iCount ] ;");
    myWriter.WriteLine("cmd.Parameters.Add(  parameter );");
}
myWriter.EndGroup("}//for");
myWriter.WriteLine("mySQL.Append( \" ) \" );");
myWriter.WriteLine ("cmd.CommandText = mySQL.ToString();");
myWriter.WriteLine("return  myValues.Count ;");
myWriter.EndGroup(")//public override int  FillInsertCommand( System.Data.IDbCommand cmd , object objRecord  )");

时间: 2024-09-28 16:15:30

C#发现之旅第十二讲 基于反射和动态编译的快速ORM框架(下)的相关文章

C#发现之旅第十四讲 基于动态编译的VB.NET脚本引擎(上)

脚本的原理 脚本,也可称为宏,是一种应用系统二次开发的技术,它能在应用系 统提供的一个容器环境中运行某种编程语言,这种编程语言代码调用应用系统提供的编程接 口,使得应用系统暂时"灵魂附体",无需用户干预作而执行一些自动的操作, 此时应用系统称为"宿主". 脚本也采用多种编程语言,比如JavaScript 语言,VBScript语言或者其他的,若采用VB则称为VB脚本. 下图为脚本原理图 下图为常 规编程开发软件的原理图

C#发现之旅第十四讲 基于动态编译的VB.NET脚本引擎(下)

主窗体中还定义了诸如Function_New,Function_Open,Function_Save等等函数用于实现 对文档的新建.打开文件和保存文件等处理.而工具条上的按钮就是调用这些功能函数.定 义这些功能函数的代码如下 /// <summary> /// 执行新建文档 /// </summary> public bool Function_New() { if (QuerySave()) { txtEditor.Text = ""; txtEditor.M

C#发现之旅第十一讲 使用反射和特性构造自己的ORM框架(下)

在InnerReadValue函数中遍历所有的属性绑定信息,调用IDataReader.GetValue函数从数据库中获得原始数据,然后调用FieldBindInfo.FromDataBase函数对这个原始数据进行一些处理,主要是进行格式化和数据类型转换,然后调用PropertyInfo.SetValue函数根据读取的数据设置对象实例的属性值.这样遍历了所有的绑定信息也就完整的填充了对象实例的属性值. 在ReadObjects函数中,遍历所有查询的数据,对每个记录创建一个对象实例,遍历数据库记录

Henry的VB.NET之旅(十二)—事件驱动

Henry的VB.NET之旅(十二)-事件驱动 韩睿 "可视继承原来这么方便!"我心中默默地感叹一声.一会儿之后,我抬头扫了一眼屏幕上的代码后,突然发现了一个新问题,按钮的单击事件程序现在已经变成了: VB.NET程序 VB程序 Private Sub btnProtected_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnProtected.Click MsgBox("

Sql Server之旅——第十二站 sqltext的参数化处理

原文:Sql Server之旅--第十二站 sqltext的参数化处理   说到sql的参数化处理,我也是醉了,因为sql引擎真的是一个无比强大的系统,我们平时做系统的时候都会加上缓存,我想如果没有缓存,就不会有什么 大网站能跑的起来,而且大公司一般会在一个东西上做的比较用心,比较细,sqlserver同样也使用了缓存,其中就包括Data cache 和Plan cache两个大头. 现在我们也知道了Plan cache包括上一篇生成的xml结构和sql text,更有趣的是,sql text

【阿里聚安全·安全周刊】阿里双11技术十二讲直播预约|AWS S3配置错误曝光NSA陆军机密文件

关键词:阿里双11技术十二讲直播丨雪人计划丨亚马逊AWS S3配置错误丨2018威胁预测丨MacOS漏洞丨智能风控平台MTEE3丨黑客窃取<权利的游戏>剧本|Android 8.1 本周资讯top3 [技术直播]承担双11万亿流量,阿里核心技术揭秘:12位大咖告诉你! 分享主题有:<阿里下一代技术架构:云化架构演进之路>.<2017双11供应链的那些事儿>.<分布式存储系统盘古在双11中的战役>.<双11中的智能化网络实践>······ http

JAVA之旅(十二)——Thread,run和start的特点,线程运行状态,获取线程对象和名称,多线程实例演示,使用Runnable接口

JAVA之旅(十二)--Thread,run和start的特点,线程运行状态,获取线程对象和名称,多线程实例演示,使用Runnable接口 开始挑战一些难度了,线程和I/O方面的操作了,继续坚持 一.Thread 如何在自定义的代码中,自定义一个线程呢? 我们查看API文档,我们要启动一个线程,先实现一个子类, package com.lgl.hellojava; public class MyThread extends Thread { @Override public void run()

【预告:直播回顾&amp;资料下载】2017阿里巴巴双11技术十二讲,历数双11精彩技术干货

峰会专题:[2017阿里巴巴双11技术十二讲]https://yq.aliyun.com/promotion/428感谢各位参与此次直播活动,目前相关活动视频.整理文章已经在紧锣密鼓的编辑中,后续会第一时间在此文中发布,敬请期待! 12月13日议题 阿里下一代技术架构:云化架构演进之路讲师:叔同 / 阿里巴巴资深技术专家 演讲视频:即将发布演讲整理文章:即将发布PDF下载:即将发布 2017双11供应链的那些事儿讲师粤谦 / 阿里巴巴资深技术专家 演讲视频:即将发布演讲整理文章:即将发布PDF下

C#发现之旅第十讲 文档对象模型

为了让大家更深入的了解和使用C#,我们将开始这一系列的主题为"C#发现之旅 "的技术讲座.考虑到各位大多是进行WEB数据库开发的,而所谓发现就是发现我们所 不熟悉的领域,因此本系列讲座内容将是C#在WEB数据库开发以外的应用.目前规划的主要内 容是图形开发和XML开发,并计划编排了多个课程.在未来的C#发现之旅中,我们按照由浅入 深,循序渐进的步骤,一起探索和发现C#的其他未知的领域,更深入的理解和掌握使用C#进 行软件开发,拓宽我们的视野,增强我们的软件开发综合能力. 课程说明 本