本帖最后由 hlszl 于 2016-9-11 00:16 编辑
简述我遇到的问题:
UI内建立baasData组件,与自建的SQL Server中的数据库对应(数据源已连通);baas.net中新建对应的service的.w文件,并根据数据库表生成标准的CRUD查询和保存的方法。然后在UI脚本中使用。
问题现象:数据组件,能从数据库中读出数据,但不能新建数据并保存到数据库中,但js中给我返回的是Success。后续的更新删除等操作,因为第一步新建一条数据记录并保存就无法调通,就没试;
学习baas.net的联动调试文档,直接跟踪X5BaasService内的代码运行,发现自动生成的标准保存代码 com.justep.baas.action.CRUD.save(paramsObject, context); 执行了ret返回为null,但却没有抛出任何异常,因而代码认为执行成功...;摸不清楚情况,使用SQL Server Profiler观察对应数据库的访问情况:在执行save时,只有可怜两条链接信息,根本没有其他动作执行。实在没办法,看到文档中还可以调试Com.Justep.Baas.dll的代码(幸好WeX5这点好,有代码全部可跟),把问题跟出来了:
几个问题和现象,大致如下(可能跟我具体环境有关系,但代码应该确实有问题,X5的开发大神们给个解释或后续建议吧)
问题1.
断点单步调试跟踪CRUD.save方法内部实现(花费一些观察时间),不改动3.5的任何代码情况下,最后执行结果,会抛出异常;但是如果我不打断点或快速执行几个断点(调试观察过程走的很快),CRUD.save方法就不会抛出异常;这点我最后也没搞明白原因,也没有时间。后续大神给看看啥原因。
异常内容报的是:"如果分配给命令的连接位于本地挂起事务中,ExecuteReader 要求命令拥有事务。命令的 Transaction 属性尚未初始化。 "
这部分我自己没有接触过,只能网上查类似问题资料,对比人家代码发现,Util.cs的代码中
public static void SaveData(DbConnection conn, DbTransaction tran, Table table, ICollection<string> columns)....
if (table.GetRows(RowState.NEW).Count > 0) { DbCommand newCommand = conn.CreateCommand();
newCommand.CommandText = CreateNewSQL(table, columns); foreach (Row row in table.GetRows(RowState.NEW)) { newCommand.Parameters.Clear(); newCommand.Parameters.AddRange(CreateNewParameters(newCommand, row, columns).ToArray()); //这里没有为newCommand.transaction赋值,是NULL,别人出这类异常,一般都是这里有问题 newCommand.ExecuteNonQuery(); } } ..... 但是DbConnection相关的transaction又是函数在外面(CRUD.save里)的建立生成的,所以我抱着试一下的心理,重新改写Util.SaveData函数:
public static void SaveData(DbConnection conn, DbTransaction tran, Table table, ICollection<string> columns) ... newCommand.Parameters.Clear(); newCommand.Parameters.AddRange(CreateNewParameters(newCommand, row, columns).ToArray()); newCommand.Transaction = tran; newCommand.ExecuteNonQuery(); ... (同理也改了Update和Delete的代码部分,没有试验结果)
这样确实解决了之前抛出的这个异常,并在处理第2个问题后,能顺利在UI里为baasData组件新建数据记录,并真正保存在数据库里。 想让X5的开发大神们给我确认下,3.5的baas.net是否真的本身存在功能问题,功能的测试完成度是什么情况,能否投入实用?还是我自己的特例问题?(按理说,这大问题谁都会碰上才对,还是说只有用SQL Server数据源的才会碰上?) 问题2. 在问题1的解决过程中,实际上代码改完后没有立即成功,还是抛出了异常,是关于Sql语句中的“?” 的,虽然我不熟悉这块,但意识到可能是参数标识问题(我用的是SQL Server做数据源的),果然发现Util. CreateNewSQL中,字串处理中的参数标识是MySql的“?”......改成“@”后,功能正常。
至此,终于能使用baas.net 向数据库表里新建数据记录了。。。。
代码没有全改完,去全面测试,不知道相关的Bug有没有全部处理。但是,这些问题改完后,让我对我选择“WeX5前端 + .net 做后端 + Sql Server做数据源”的架构前途,信心上一片晦暗不明啊。。。。本以为选择自己熟悉的技能领域能加快速度,奈何内有大坑?
X5的开发大神们,谁来给我些信心?究竟我选的这条路上,这样的坑还多吗?有一些咱不怕,怕是太多了搞不过来耽误事啊。。。
|