一张公司结构表:
ID: uniqueidentifier (PK)
ParentID: uniqueidentifier
Name: Varchar(50)
通过SQLDataSource绑定到GridView,启用GridView编辑功能运行后不编辑ParentID字段,任意修改Name的值后
点更新,出现如下错误:
不允许从数据类型 sql_variant 到 uniqueidentifier 的隐式转换。请使用 CONVERT 函数来运行此查询
第一个想法是:把string转换为uniqueidentifier时出错了。检查ASPX代码:
<UpdateParameters>
<asp:Parameter Name="ParentID" Type="Object" />
<asp:Parameter Name="Name" Type="String" />
<asp:Parameter Name="ID" Type="Object" />
</UpdateParameters>
Type="Object"我估计是这错了。我尝试在这写Type="uniqueidentifier",结果不行,错误提示是:
系统不支持uniqueidentifier.
第二个想法:在SQLDataSource的BeforeUpdate事件中把这个参数的值强制转换为uniqueidentifier
protected void SqlDataSource1_Updating(object sender, SqlDataSourceCommandEventArgs e)
{
for (int i = 0; i < e.Command.Parameters.Count; i++)
{
if (e.Command.Parameters[i].ParameterName == "@ParentID")
e.Command.Parameters[i].Value = new Guid(e.Command.Parameters[i].Value.ToString());
}
}
结果还是不行。
第三步:上Google查询,无解。
最后突然想起来SQL中也有Convert这个函数,难道是要修改SQL语句?!
打开ASPX,将SQLDataSource的UpdateCommand进行如下修改
UpdateCommand="UPDATE [T_COMP]
SET [ParentID] = CONVERT(uniqueidentifier, @ParentID), [Name] = @Name
//原来的SET [ParentID] = @ParentID, [Name] = @Name
WHERE [ID] = @ID"
再次运行并测试,通过。
郁闷啊,两个小时过去了。希望通过这篇文章大家不要再像我一样浪费时间。
最后做一个简单小结:
1、.NET传参数给数据库时,数据类型都应该是sql_variant ,最后的转换是由SQL Server来完成的(我推测是这样)。
2、同样的类型转换@ID做为Where条件参数可以进行正确的转换,但是@ParentID做为更新值就不行,
这应该是一个BUG。