【发布时间】: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