我使用Datagridview向我显示来自2个表的连接记录。显示的数据来自连接表中的一个表+数据(表3)。 SQL查询在Datagridview中返回结果(在Oracle中也可以正常工作),但更新失败,并且" 动态SQL生成失败。没有找到基表或找到多个基表"。这是我的桌子设计:
Table1:
ID_TABLE1
ITEM_NAME
ITEM_DESCRIPTION
Table3: (this is a joined view for Table1 and Table2)
ID_TABLE3
ID_TABLE1_FK
ID_TABLE3_FK
VALIDITY
DATE_CONNECTION
我的代码(正如Oracle建议的那样):
Public Class Form2
Private da As OracleDataAdapter
Private cb As OracleCommandBuilder
Private ds As DataSet
Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Saving.Enabled = False 'this deals with error with updating (from Oracle site)
Dim SQL As String = "SELECT ID_TABLE1, ID_TABLE3, SERIAL_NO, ITEM_NAME, ITEM_DESCRIPTION, VALIDITY, DATE_CONNECTION from TABLE1, TABLE2 WHERE TABLE3.ID_TABLE1_FK=" & Form1.DataGridView1.CurrentRow.Cells(0).Value.ToString
Try
Oracleconn() 'connection to my DB
Dim cmd = New OracleCommand(SQL, Oracleconn)
cmd.CommandType = CommandType.Text
da = New OracleDataAdapter(cmd)
cb = New OracleCommandBuilder(da)
ds = New DataSet()
da.Fill(ds)
My_DGV.DataSource = ds.Tables(0)
Saving.Enabled = True
Catch ex As Exception
MessageBox.Show(ex.Message)
Finally
'No closing of connection here because of working with Dataset (Oracle suggestion)
End Try
End Sub
Private Sub Saving
da.Update(ds.Tables(0))
Saving.Enabled = True
End Sub
End Class
那么,我的SQL查询是错误还是什么?任何帮助将不胜感激!
P.S。:在实际情况下只有列"有效性"从表3中可以为用户进行更改,因此我只需要更新该字段。
答案 0 :(得分:0)
这对我来说太复杂了,看起来Oracle提供的使用数据集的建议在您想要对连接表记录执行更新时并不容易。所以我尝试了一种不同的方法,它对我有用。因为我需要的是只从SQL查询中更新1列,返回到Datagridview,我这样做了:
For Each row As DataGridViewRow In My_.Rows
cmd.Parameters.Add(New OracleParameter("validity", row.Cells(6).Value))
cmd.CommandText = "UPDATE TABLE3 SET VALIDITY= : validity WHERE ID_TABLE1_FK='" & row.Cells(1).Value & "'"
cmd.ExecuteNonQuery()
cmd.Parameters.Clear()
Next
如果有人知道我原来问题的答案 - 那么如何对da.Update(ds.Tables(0))做同样的事情,请告诉我。我认为需要使用JOIN方法正确更改SQL查询。