Datagridview - Oracle Update错误"动态SQL生成失败。"

时间:2016-11-18 08:54:40

标签: sql vb.net oracle datagridview

我使用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中可以为用户进行更改,因此我只需要更新该字段。

1 个答案:

答案 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查询。