起步软件技术论坛
搜索
 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2350|回复: 0

[分享] 分享一次Baas.net 加Oracle.ManagedDataAccess的奇怪错误解决经历

[复制链接]

10

主题

37

帖子

90

积分

初级会员

Rank: 2

积分
90
QQ
发表于 2015-11-26 14:04:25 | 显示全部楼层 |阅读模式
经过一段时间使用,感觉WeX5真是不错的平台。在此把自己遇到的一次奇怪经历分享给大家,算是做点贡献。
背景:使用Baas.Net 作为数据报务,使用Oracle.ManagedDataAccess V4.121.2.0  连接Oracle12C的数据库。

在进行创建记录的时没有问题,但在更新时候就是失败,也不报错。
经调试中,发现执行到justep.baas.Data.Util.SaveData 函数,到Update部分代码时,明明数据是正确的,但就是不更新。
                DbCommand updateCommand = conn.CreateCommand();
                updateCommand.CommandText = CreateUpdateSQL(table, tableName, columns, sqlParamPrefix);
                foreach (Row row in table.GetRows(RowState.EDIT))
                {
                    updateCommand.Parameters.Clear();
                    updateCommand.Parameters.AddRange(createUpdateParameters(updateCommand, row, columns, idColumn).ToArray());
                   count += updateCommand.ExecuteNonQuery();          此处不报错,但返回一直为0。调试中确定所传参数均正确。
                }

被这个问题困扰了很长时间。接下来说说解决这个问题的过程。
一、先是在网上查了半边,得知“BindByName”的问题。默认Oracle的Command绑带参数是按照顺序,必须对Command设置BindByName=true才会按参数名进行绑定。于是添加代码如下:
     if (updateCommand is Oracle.ManagedDataAccess.Client.OracleCommand)
     {
            (updateCommand as Oracle.ManagedDataAccess.Client.OracleCommand).BindByName = true;
    }
  本以为解决问题了,谁知,执行到   count += updateCommand.ExecuteNonQuery();   时,直接在这条语句卡不住不动了,也不报错,也不退出。在VS里手动进行中断,运行的语句还停留在这句上。这下更麻烦了,


二、先是检查每个参数的数值及类型均没有问题。以为传参数没传好,先是减少参数个数,不行;干脆不传参数了,直接修改SQL语句如下:
updateCommand.CommandText = "UPDATE \"GCXMXunCha\" SET \"MingCheng\" ='aaaaafasa' WHERE \"Id\" = ‘20151125221838209075805d1f20720'";
这条语句在sqldeveloper中执行没有问题,但在baas.net中就是不行,还是卡在 count += updateCommand.ExecuteNonQuery();
,一到这语句就不动了。气个半死!
冷静下来,喝口水,分析一下原因:
1.是不是oracle的库有缺陷,导致不能执行ExecuteNonQuery?但用这个库+EF完全没有问题啊,应该不是。
2.是不是因为加了TransactionScope,把这个去掉,也不行?
3.是不是因为WebApplication在其它地方打开的连接太多没有关闭?那好吧,单独建个WinForm,就为跑这两个语句:
updateCommand.CommandText = "UPDATE \"GCXMXunCha\" SET \"MingCheng\" ='aaaaafasa' WHERE \"Id\" = ‘20151125221838209075805d1f20720'";
count += updateCommand.ExecuteNonQuery();    发现还是执行到这够话就不动了。靠!
4.再次在网上看有没有关于Oracle.ManagedDataAccess的BUG,没找到什么有用的 内容。
5.正束手无策之际,突然想,换个Id更新一下看看,结果一下成功,updateCommand.ExecuteNoneQuery()返回1.
这下激动了,再换回之前的Id,又不行了。想想是不是数据库中的数据有什么问题,就在sqldeveloper中改Id值'20151125221838209075805d1f20720'.
先加了个1,保存。再把1去掉,保存。执行前面两个语句,竟然成功了。(此时心里一万句草泥马奔过,这算哪门子错误?)


三、最终,发现改了这个该死的’‘Id以后,再也没有此问题。
原因到目前还没想明白,感觉是不是数据库的某些状态方面存在Bug。


四、baas.net+Oracle.ManagedDataAccess 时候,最好都加上BindByName=true。分析之前之所以新建记录时没问题,是因为insert语句的参数顺序正好与command.prapmeters中的顺序一致,但当生成update语句时,由于sql语句中:Id参数出现两次,这时没有BindByName=true的话显然参数个数都对不上(但竟然不报错),此时执行就不成功。
























您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|X3技术论坛|Justep Inc.    

GMT+8, 2025-4-19 20:30 , Processed in 0.051036 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表