此文章帮了我的大忙
http://blog.csdn.net/blue_morning/article/details/5056936
太感谢了!
一张公司结构表:
ID: uniqueidentifier (PK)
ParentID: uniqueidentifier
Name: Varchar(50)
通过SQLDataSource绑定到GridView,启用GridView编辑功能运行后不编辑ParentID字段,任意修改Name的值后
点更新,出现如下错误:
不允许从数据类型 sql_variant 到 uniqueidentifier 的隐式转换。请使用 CONVERT函数来运行此查询
第一个想法是:把string转换为uniqueidentifier时出错了。检查ASPX代码:
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 = newGuid(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 ,最后的转换是由SQLServer来完成的(我推测是这样)。
2、同样的类型转换@ID做为Where条件参数可以进行正确的转换,但是@ParentID做为更新值就不行,
这应该是一个BUG。
[引用][举报]
- 还有一个办法,在updateparameter里面把ParentID参数的DbType设为Guid,Type设为Empty就可以了。我摸索出来的
- 1楼 jhonke 2010-06-0618:53发表[回复][引用][举报]
- 你好,我出现了你同样的问题,我使用了CONVERT。还是那样。
UpdateCommand="UPDATE [Product] SET [Name]=CONVERT(uniqueidentifier, @Name), [ProductNumber] =@ProductNumber, [Color]= @Color...