【SubSonic 2.2】写入数据库时字符串被自动截断

问题现象

数据库中 AgentName 字段类型为 NVarChar(50),在程序中赋值给 AgentName 属性的字符串的长度为200。程序执行的结果是该字符串的前100个字符被写入数据库,后100个字符被抛弃了,过程中没有发生任何异常。对于敏感数据,自动截断而不进行错误提示,有可能对数据库中的数据逻辑造成破坏。

 

问题分析 - ActiveRecord

按照问题现象,使用 ActiveRecord 的方式写入数据库,结果出现异常:“System.Exception: Can't save: Agent Name exceeds the maximum length of 100”。关键代码如下:

----------------

PresaleRealEstateAgent agent = new PresaleRealEstateAgent();
agent.AgentName = ....;
agent.Save();

----------------

 

问题分析 - Query Tool

为了更深层次的修改准备提交数据库的数据,使用 Query Tool 成为必要。关键代码如下:

----------------

PresaleRealEstateAgent agent = new PresaleRealEstateAgent();
agent.AgentName = ....;

QueryCommand qc = agent.GetSaveCommand();
DbCommand command = qc.ToDbCommand();
command.ExecuteNonQuery();

----------------

通过断点可以发现,上述代码中的 command 变量中 Parameters 属性中各元素的 Size 属性被 SubSonic 自动设置了,设置的值即数据库中对应的字段长度。.net 框架的 DbCommand 类,在把命令提交到数据库时,会根据 Parameter 的 Size 属性,自动把字符串类型的 Parameter 截断为不超过 Size 长度的字符串。

posted on 2011-01-17 23:38  CsharpStyle  阅读(763)  评论(0编辑  收藏  举报