【问题标题】:Datagridview - Oracle Update error "Dynamic SQL generation failed."Datagridview - Oracle 更新错误“动态 SQL 生成失败”。
【发布时间】:2016-11-18 20:22:19
【问题描述】:

我正在使用 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.:在实际情况下,只有 Table3 中的“VALIDITY”列可以为用户更改,所以我只需要更新那个字段。

【问题讨论】:

  • 检查这是否有帮助 stackoverflow.com/questions/1666425/…
  • @phonetic_man,感谢您的链接。我的假设可能是对的,应该用 JOIN 构造 SQL。虽然我无法为它找出正确的合成器:(

标签: sql vb.net oracle datagridview


【解决方案1】:

这对我来说太复杂了,当您想对连接表记录执行更新时,看起来 Oracle 提供的使用数据集的建议并不容易。所以我尝试了一种不同的方法,它对我有用。因为我需要从返回 Datagridview 的 SQL 查询中只更新 1 列,所以我这样做了:

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

【讨论】:

    猜你喜欢
    • 2015-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 2017-04-02
    相关资源
    最近更新 更多