【问题标题】:Inserting to a table table which have Readonly primary key column插入到具有只读主键列的表中
【发布时间】:2019-01-14 11:37:51
【问题描述】:

我正在使用一个使用 sql server 数据库的应用程序。我试图在表中插入一行,如下所示。该表有一个主键“prodNum”。它是自动生成的密钥。

当我尝试向表中插入一行时,如下所示,在intResult = oSglProdTableAdapt.Update(oCableRecDataSet, "ProdTable") 行中,我遇到了一个异常:

{"列 'prodNum' 是只读的。"}

如您所见,在创建数据行时,我什至没有设置“prodNum”列的值。但更新函数也试图写入该列的值。 我尝试在 sql management studio 软件中使用插入查询插入。它工作正常。所以我认为问题出在我的代码上。我有什么遗漏吗?

    ' a record does not exist for the new Cable Product
    ' therefore insert a new data row in the ProdTable table

    ' clear the DataSet
    oCableRecDataSet.Clear()
    ' create the Data Row
    Dim oDR As DataRow = oCableRecDataSet.Tables("ProdTable").NewRow()
    ' populate the datarow with values
    'oDR("ProductIDNum") = 102
    oDR("ProductID") = ProductID
    oDR("DefinedDate") = DefinedDate
    oDR("OperID") = OperID
    oDR("CutsizeBased") = CutsizeBased
    ProdTable.AddDRofProdTable(oDR)
    ' add the datarow to the dataset
    oCableRecDataSet.Tables("ProdTable").Rows.Add(oDR)

' update the Database with values from Dataset with the Data adapter
  intResult = oSglProdTableAdapt.Update(oCableRecDataSet, "ProdTable")

Public Sub AddDRofCableDef(ByRef oDR As DataRow)


    oDR("Upper") = m_Upper
    oDR("Spec") = m_Spec
    oDR("IlUpper") = m_IlUpper
    oDR("IlLower") = m_lIlLower
    oDR("Spec") = m_Spec
    oDR("MeanUpper") = m_MeanUpper
    oDR("MeanLower") = m_MeanLower
    oDR("MeanUL") = m_MeanUL
    oDR("MeanLL") = m_MeanLL
    oDR("SUL") = m_SUL
    oDR("StartZone") = m_StartZone
End Sub

堆栈跟踪如下:

at System.Data.DataRow.set_Item(DataColumn column, Object value) at System.Data.DataRow.set_Item(String columnName, Object value) at ACMS.DBCableRecordsCommands.OnRowUpdated(对象发送者, OleDbRowUpdatedEventArgs args) 在 D:\Software\clsDBCableRecordsCommands.vb: 第 956 行 System.Data.OleDb.OleDbRowUpdatedEventHandler.Invoke(对象发送者, OleDbRowUpdatedEventArgs e) 在 System.Data.OleDb.OleDbDataAdapter.OnRowUpdated(RowUpdatedEventArgs 值)在 System.Data.Common.DbDataAdapter.Update(DataRow[] dataRows,DataTableMapping 表映射)在 System.Data.Common.DbDataAdapter.UpdateFromDataTable(数据表 数据表,数据表映射表映射)在 System.Data.Common.DbDataAdapter.Update(数据集数据集,字符串 srcTable) 在 ACMS.DBCableRecordsCommands.insertCableRecord(DBCableRecords 电缆) 在 D:\Software\clsDBCableRecordsCommands.vb:第 251 行


更新 当我检查生成的数据行时,我注意到一件事,它计算了 ProdNum(Primary key),即使我没有初始化该值。这可能是 sql server 不接受的原因。如何停止数据行生成主键?

【问题讨论】:

  • 你在这行做什么? ProdTable.AddDRofProdTable(oDR)
  • @Steve 我会用那个更新 qstn
  • 您能说明如何加载主数据集吗? oCableRecDataSet
  • @Steve ProdAdapt.FillSchema(oCableRecDataSet, SchemaType.Mapped, "ProdTable")
  • 我猜是生成的代码进化了。检查生成的代码中的 Insert 语句是什么样的。如果它试图在 PK 中插入一个值,请编辑它。请记住,如果您对数据库进行任何更改并重新生成代码,则必须再次对其进行修复。

标签: sql-server database vb.net


【解决方案1】:

我假设“oCableRecDataSet”是你的DataSet的名字,而DataSet只包含一个Table,所以你可以试试这个:

oCableRecDataSet.Tables(0).Columns("produNum").ReadOnly = false
intResult = oSglProdTableAdapt.Update(oCableRecDataSet, "ProdTable")

【讨论】:

  • 但数据集包含多个表。我想到了这个解决方案,但是主键应该是只读的,对吧?在创建 Datarow 时,我没有初始化 oDR("ProdNum")。它设置为自动生成
  • 有没有办法永久更改??在这里我每次做任何事情都要设置它,对吧?
猜你喜欢
  • 1970-01-01
  • 2020-06-26
  • 1970-01-01
  • 2015-04-03
  • 1970-01-01
  • 1970-01-01
  • 2016-11-29
  • 1970-01-01
  • 2021-11-30
相关资源
最近更新 更多