【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) 编辑 收藏 举报