拜读websharp时,发现的几处问题(二)

     4.在持久管理对象PersistanceManager.cs的实现SingleTablePM.cs文件的ExecuteNonQuery方法,在实例化参数时
     仅指定对应的字段名及字段值,未指定当前参数的DbType类型,这样所有参数的类型都会默认为DbType.AnsiString
     当然这在MSSqlServer里可能没问题(测试过,未发现异常),但在Oracle数据库中除字符类型外的Data,Number等都会
     出错,所以此处我认为必须加入DbType类型。关于每个字段的DbType我们在生成实体时就已经存在,所以应当直接读取对应字段的DbType就可以了,由于时间关系,未去深究此种方法的实现,暂由下面代码代替实现:

 1 None.gif       private   void  ExecuteNonQuery(EntityData entity,SqlStruct sql)
 2 ExpandedBlockStart.gifContractedBlock.gif  dot.gif {
 3InBlock.gif  QueryParameterCollection qpc=new QueryParameterCollection();
 4InBlock.gif 
 5InBlock.gif  OpenConnection();
 6InBlock.gif 
 7InBlock.gif  object objvalue ;
 8InBlock.gif  System.Data.DbType dbtype;
 9InBlock.gif 
10InBlock.gif  foreach(DataRow row in entity.Tables[0].Rows)
11ExpandedSubBlockStart.gifContractedSubBlock.gif  dot.gif
12InBlock.gif   for(int i=0;i<sql.ParamFields.Length;i++)
13ExpandedSubBlockStart.gifContractedSubBlock.gif   dot.gif{
14InBlock.gif    objvalue = row[sql.ParamFields[i].FieldName];
15InBlock.gif 
16InBlock.gif    // XXX 2006-2-24 9:31:13 修改多加入DbType参数
17InBlock.gif    dbtype = GetDbType(objvalue.GetType());
18InBlock.gif    qpc.Add(sql.ParamFields[i].ParamName,objvalue,dbtype);
19InBlock.gif    
20ExpandedSubBlockEnd.gif   }

21InBlock.gif   dao.ExecuteNonQuery(sql.SqlString,qpc);
22InBlock.gif   qpc.Clear();
23ExpandedSubBlockEnd.gif  }

24ExpandedBlockEnd.gif }

25 None.gif 
26 ExpandedBlockStart.gifContractedBlock.gif  /**/ /// <summary>
27InBlock.gif /// 方法名称: GetDbType
28InBlock.gif /// 内容描述: 根据.net中类型type获取数据库对应类型DbType
29InBlock.gif /// 实现流程: 
30InBlock.gif /// 作    者: XXX
31InBlock.gif /// 日    期: 2006-2-23 14:25:07
32InBlock.gif /// </summary>
33InBlock.gif /// <param name="type"></param>
34ExpandedBlockEnd.gif /// <returns></returns>

35 None.gif   private   static  System.Data.DbType GetDbType(Type type)
36 ExpandedBlockStart.gifContractedBlock.gif  dot.gif {
37InBlock.gif  DbType result = DbType.String;
38InBlock.gif 
39InBlock.gif  if( type.Equals(typeof(int)) ||  type.IsEnum)
40InBlock.gif   result = DbType.Int32;
41InBlock.gif  else if( type.Equals(typeof(long)))
42InBlock.gif   result = DbType.Int32;
43InBlock.gif  else if( type.Equals(typeof(double)) || type.Equals( typeof(Double)))
44InBlock.gif   result = DbType.Decimal;
45InBlock.gif  else if( type.Equals(typeof(DateTime)))
46InBlock.gif   result = DbType.DateTime;
47InBlock.gif  else if( type.Equals(typeof(bool)))
48InBlock.gif   result = DbType.Boolean;
49InBlock.gif  else if( type.Equals(typeof(string) ) )
50InBlock.gif   result = DbType.String;
51InBlock.gif  else if( type.Equals(typeof(decimal)))
52InBlock.gif   result = DbType.Decimal;
53InBlock.gif  else if( type.Equals(typeof(byte[])))
54InBlock.gif   result = DbType.Binary;
55InBlock.gif  else if( type.Equals(typeof(Guid)))
56InBlock.gif   result = DbType.Guid;
57InBlock.gif 
58InBlock.gif  return result;
59InBlock.gif 
60ExpandedBlockEnd.gif }

61 None.gif


     5.在SqlGenerator的实现中,oracle与SqlServer的参数形式也是不同的,有“:”与“@”之分,所以也做以修改,在抽象类SqlGenerator
     根据不同数据为类型设置不同参数形式,代码如下:
     在Websharp.ORM.Service项目的SqlGenerator.cs文件中修改加入如下代码:

 1 None.gif
 2 None.gif  public   static   string  GetDataType(DatabaseProperty pp)
 3 ExpandedBlockStart.gifContractedBlock.gif  dot.gif {
 4InBlock.gif  // 修改完成多数据库类型操作
 5InBlock.gif  string strDatabaseType = "@";
 6InBlock.gif
 7InBlock.gif  switch(pp.DatabaseType)
 8ExpandedSubBlockStart.gifContractedSubBlock.gif  dot.gif{
 9InBlock.gif   case(DatabaseType.MSSQLServer):
10InBlock.gif    strDatabaseType = "@";
11InBlock.gif    break;
12InBlock.gif   case(DatabaseType.Oracle):
13InBlock.gif    strDatabaseType = ":";
14InBlock.gif    break;
15InBlock.gif   case(DatabaseType.OleDBSupported):
16InBlock.gif    strDatabaseType = "@";
17InBlock.gif    break;
18InBlock.gif   default:
19InBlock.gif    strDatabaseType = "@";
20InBlock.gif    break;
21ExpandedSubBlockEnd.gif  }

22InBlock.gif  return strDatabaseType ;
23ExpandedBlockEnd.gif }

24 None.gif
25 None.gif  public   static  SqlGenerator Instance(DatabaseProperty pp)
26 ExpandedBlockStart.gifContractedBlock.gif  dot.gif {
27InBlock.gif  string strDatabaseType = "";
28InBlock.gif  strDatabaseType = GetDataType(pp);
29InBlock.gif
30InBlock.gif  DefaultSqlGenerator.mstr_DataType = strDatabaseType;
31InBlock.gif  return DefaultSqlGenerator.Instance();
32ExpandedBlockEnd.gif }

33 None.gif
34 None.gif


 在DefaultSqlGenerator中加入如下代码:
 public static string mstr_DataType = ":";    
 其它参数项修改全部由此表态变量替换
 parameters[i] = mstr_DataType + columns[i];

转载于:https://www.cnblogs.com/linfuguo/archive/2006/02/24/336706.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值