如何将服务器自动生成的值存储到主键列

Posted

技术标签:

【中文标题】如何将服务器自动生成的值存储到主键列【英文标题】:How to store server auto generated value to Primary key column 【发布时间】:2018-08-08 13:25:48 【问题描述】:

我正在开发一个使用 sql server 数据库的应用程序。我将主键的自动生成值存储到数据集中。我正在使用下面的代码。但问题是我的主键列,即 ProdNum 是只读的。为此,它不允许设置该值。我该如何克服这个问题?


Private Sub OnRowUpdated(ByVal sender As Object, ByVal args As Data.OleDb.OleDbRowUpdatedEventArgs)
        ' Include a variable and a command to retrieve the identity value from the Access database.
        Dim newID As Integer = 0
        Dim idCMD As OleDb.OleDbCommand = New OleDb.OleDbCommand("SELECT @@IDENTITY", args.Command.Connection(), args.Command.Transaction)
        If args.StatementType = StatementType.Insert Then
            ' Retrieve the identity value and store it in the ProductIDNum column.
            newID = CInt(idCMD.ExecuteScalar())
            ' place in the identity column of the local table in the dataset
            'args.Row("ProdNum") = newID
        End If
    End Sub

【问题讨论】:

您发布的内容有点含糊,但是,“只读”是什么意思?你的意思是它是一个IDENTITY 列吗?如果您在其他地方(例如在应用程序中)为行生成 ID,则不要将您的列声明为 IDENTITY 列。或者,有一个IDENTITY 列和一个附加的“SomeOtherID”列。 IDENTITY 的设计目的是让您不提供值。如果您提供一个,那么您(可能)没有正确使用它 这里没有足够的细节来理解你想要做什么。我认为您对身份属性的工作方式感到非常困惑。 您可以使用OUTPUT (OUTPUT Clause (Tranasct-SQL))。但是,在UPDATE 之后,ID 不会改变,所以不知道为什么需要反馈。 标识值是在将行插入数据库时​​创建的。由于您正在更新现有行,因此值已经存在,您只需从网格中的 DataRow 中获取它。 INSERTUPDATE 是非常不同的东西!好的,在那种情况下,我对OUTPUT 的声明似乎是 相关的...... 【参考方案1】:

我不确定您是否可以使用 OleDb 执行此操作(对于 Access,您不能,但这是不同的 OLE DB 提供程序)但是如果您使用 SqlClient 则无需处理任何事件,因为您可以简单地将SELECT添加到您的适配器CommandText中的INSERTInsertCommand,例如

INSERT INTO Thing (Name, Description) VALUES (@Name, @Description);
SELECT ThingId = SCOPE_IDENTITY();

这一直对我有用。

【讨论】:

以上是关于如何将服务器自动生成的值存储到主键列的主要内容,如果未能解决你的问题,请参考以下文章

当主键列是mysql中不同表的外键时,如何将主键列更改为自动递增

防止自动递增整数主键?

以编程方式获取自动增量主键列

将自动增量主键插入现有表

将自动增量主键插入现有表

将自动增量主键插入现有表