【问题标题】:Cannot insert null where field is Guid (object in SqlDataSource)无法在字段为 Guid 的地方插入 null(SqlDataSource 中的对象)
【发布时间】:2009-04-09 13:50:07
【问题描述】:

我有一个表链接到 ASP.NET 成员模式中的另一个表。

问题是,ASP.NET 表的所有 PK 都是唯一标识符,所以我的也必须如此。当我添加一个 SqlDatasource 并调用它的 Insert() 方法时,我收到以下错误:

无法将值 NULL 插入到列“DiscountCode”、表“CreamDb.dbo.CustomInfo1”中;列不允许空值。插入失败。 声明已终止。

uniqueidentifier 也被视为对象(其数据类型),但没有 Guid 数据类型。我以前遇到过这个问题,但是架构要简单得多,所以我可以修复它。

我该如何解决这个问题?如果我去掉标记中的数据类型部分(所以只留下字段/参数名称而不是数据类型的东西),我会得到另一个错误,所以这是不可能的。

谢谢

【问题讨论】:

    标签: asp.net


    【解决方案1】:

    “没有 Guid 数据类型”是什么意思? System.Guid 有什么问题?难道你不能只使用Guid.NewGuid(),适当地设置字段,然后进行插入吗?

    编辑:只是为了提供更多内容:将事件处理程序附加到Inserting 事件,然后通过SqlDataSourceCommandEventArgs.Command 返回的DbCommand 填充该字段。或者更改 INSERT 命令使用的 SQL 以要求数据库为您填充 GUID 字段。

    【讨论】:

    • 嗨,我的意思是在标记 (aspx) 中您没有要使用的 Guid 数据类型。只有对象存在。您可以通过添加对表执行 CRUD 的 sql 数据源来尝试此操作,然后检查标记并查看参数数据类型的智能感知。
    • 这不是 C# 问题,它纯粹是 .NET。我不应该编写任何自定义代码,因为 sqldatasource 应该为我处理繁重的工作。
    • 嗯,在我看来,SqlDataSource 为您完成了相当多的繁重工作,您只需编写一小段代码即可在它创建新的值时填写正确的值排。 (我对 SqlDataSource 没有太多经验,但这应该很容易。)
    • +1 我同意 Jon 的观点,通过附加到插入事件,您只需要一个简单的行来将参数添加到命令中。更改sql也很简单。也就是说,还有第三种选择,即更改表,使其默认获得新的 guid。
    • 有这方面的例子吗?
    【解决方案2】:

    在处理对 ASP.NET 成员资格提供程序的数据的引用时,一种流行的方法是,不是为 GUID 保留适当的外键,而是在表中存储诸如 LoweredUserName 之类的内容。然后,使用 Membership Provider 的 API 与您需要的对象进行交互。在某些情况下,您需要一个 ObjectDataSource 抽象层来完成 CRUD 场景。

    【讨论】:

    • 我手头没有,但我回家后可以提供。我将编辑一些细节以帮助您(和其他人)开始使用 ObjectDataSource。
    【解决方案3】:

    将 SQL Sever 中列的默认值设置为“newid()”。

    Asp.net 不会发送该值,并且该字段将获得一个新的 guid。

    【讨论】:

    • 这样做会导致此错误:INSERT 语句与 FOREIGN KEY 约束“FK_aspnet_Users_CustomInfo”冲突。冲突发生在数据库“CreamGlobal”、表“dbo.CustomInfo”、列“ID”中。声明已终止。
    • 您可能没有一个插入或需要明确设置现有的,我的回答只会让您一直得到一个新的。乔恩的答案就是要解决这个问题。
    猜你喜欢
    • 2016-03-11
    • 2012-10-17
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 2017-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多