【问题标题】:NewSequentialID and typed DataAdaptersNewSequentialID 和类型化 DataAdapter
【发布时间】:2012-01-19 14:23:42
【问题描述】:

我在尝试使用类型化数据适配器在 sql server 中创建新行时遇到问题,其中主键设置为 GUID,默认值为 NewSequentialID()

friendInviteID 列是一个 GUID,默认值为 NewSequentialID()

        Using myDT As New DAL.mbrFriendInvites.mbrFriendInvitesDataTable
            Using myTA As New DAL.mbrFriendInvitesTableAdapters.mbrFriendInvitesTableAdapter

                Dim row As DAL.mbrFriendInvites.mbrFriendInvitesRow = myDT.NewmbrFriendInvitesRow
                With row
                    .friendInviteID = Nothing
                    .mbrID = 11
                    .appID = 2
                    .contactEmail = "blah@blah.com"
                    .contactName = "blah blah"
                    .timesSent = 0
                End With

                myDT.AddmbrFriendInvitesRow(row)

                Dim result As Integer = myTA.Update(myDT)
                HttpContext.Current.Response.Write("rows updated: " & result)

            End Using
        End Using

当我使用上述方法插入新行时,SQL Server 将friendInviteID 的值设置为:00000000-0000-0000-0000-000000000000

它似乎不想使用 NewSequentialID() 默认值。

我可以手动创建一个 GUID 并以这种方式插入它,但这不会创建一个 SequentialID。

我错过了什么?

【问题讨论】:

  • 您在哪里使用标量函数作为默认值,在 SQL-Server 或您的类型化数据集中?如果它真的是一个强类型的 DataSet,那么还有一个自动生成的函数 brFriendInvitesRow.setfriendInviteIDNull() 你应该使用。
  • 在 SQLServer 中设置为默认值。如果我在 sql server management studio 中打开表并手动向表中添加一行,它将自动插入一个 sequenceID - 所以我知道它在 sql server 中工作。没有 setfriendInviteIDNull 因为它是主键,不能为空。
  • 如果在您的数据集中它不能是 null,则应该引发异常,或者它解释了为什么 nothing 被转换为默认 GUID。您应该尝试在 DataAdapter 中允许 null。
  • 我尝试将其设置为允许在数据适配器中使用 Null,但它仍然会引发错误:列 'friendInviteID' 不允许使用 Null。
  • 我在这里同意@Tim。我正要写同样的东西。 DataSet 需要将该列的 AllowDbNull 设置为 true。 IIRC。

标签: asp.net visual-studio-2010 sql-server-2005


【解决方案1】:

更改您的 TableAdapter 的 InsertCommand 以便它创建 GUID 或调用任何返回它的标量值 UDF:

Click here for full-view

如果您只是想在 sql-server 中创建 GUID - 您也可以使用 newid():

INSERT INTO Test (idTest, Value, Test)
VALUES    (newid(),@Value,@Test); 

您也可以将use a Stored-Procedure 作为InsertCommand 的CommandType,它会执行所有操作并通过输出参数返回实际值。

我最近问自己如何检索这些主键:Retrieve identity value from inserted record's primary key

如果您需要有关此问题的更多信息,我会看看我是如何实现它的。无论如何,你需要 InputOutput 作为 Direction 为你的 InsertCommand 的参数然后。

【讨论】:

  • 我不喜欢修改自动生成的适配器——当它们被其他人覆盖时会很痛苦。我想我可以编写一个存储过程来返回一个新的sequentialID,然后在插入行时使用它。 GUID 似乎不支持默认值,这似乎很奇怪
  • 有很多东西在类型化的DataSet 中没有实现或者实现很差。过时且不再受支持是有原因的。你经常需要解决一些问题。你有没有看到我已经编辑了我的答案。在这种情况下,最好的方法(使用类型化数据集时)是使用插入行并返回所有动态值的 SP。但在我看来,uniqueidentifier 对于主键来说是一个糟糕的选择(正如@gbn 已经指出的那样)。
  • 我假设无法通过SCOPE_IDENTITY返回唯一标识符,因此无法设置返回值。也许这就是将00000000-0000-0000-0000-000000000000 发送到数据库的原因。 stackoverflow.com/a/1510529/284240
  • 我正在使用 VS 2010 并且不知道类型化数据集已过时??!他们用什么替换了 - 链接到 sql?我不需要另一个数据抽象层 :( 在顶部。
  • 数据集仍然占有一席之地,例如,如果您需要快速(测试)结果或小型项目。或者,如果您出于某种原因需要将数据加载到内存中(比较不同的数据库等)。另一种选择是在没有抽象层的代码隐藏中使用原始 ADO.NET。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-18
  • 2012-12-27
  • 1970-01-01
  • 2017-07-18
  • 2019-11-14
  • 2023-03-14
  • 1970-01-01
相关资源
最近更新 更多