WinForms 中的多个基表不支持动态 SQL 生成

Posted

技术标签:

【中文标题】WinForms 中的多个基表不支持动态 SQL 生成【英文标题】:Dynamic SQL generation is not supported against multiple base tables in WinForms 【发布时间】:2013-12-22 10:22:43 【问题描述】:

我正在使用 VB.NET Windows 应用程序

在我的加载事件中,我提供了这样的代码,用于将不同表中的数据加载到我的DataGridView

为此,我使用如下代码:

Dim cmd As New SqlCommand("select M.Model,c.Colname,ma.Make from Model_tbl M join Color_tbl C on c.colid=M.mdlid join Make_tbl ma on ma.mkid=c.colid  where mdlid=5", con.connect)
        Dim builder As SqlClient.SqlCommandBuilder = New SqlCommandBuilder(da)

        da.SelectCommand = cmd
        da.Fill(ds, "MyTable")
        If (ds.Tables(0).Rows.Count > 0) Then
            DGV.DataSource = ds.Tables("MyTable")

        End If 

单击更新按钮时,我想将数据从我的DataGridView 更新到不同的表。所以我在我的更新按钮事件中写了这样的代码。

 Me.Validate()
        Me.da.Update(Me.ds.Tables("MyTable"))
        Me.ds.AcceptChanges()

但在这一行

Me.da.Update(Me.ds.Tables("MyTable")) 

我收到一个错误:

不支持对多个基表进行动态 SQL 生成。

我的代码有什么问题?

【问题讨论】:

【参考方案1】:

当 SELECT 命令包含两个或多个表之间的 JOINS 时,SqlCommandBuilder 无法生成 DataAdapter 更新命令所需的 UPDATE/INSERT 语句。

在 MSDN 你可以阅读

SqlCommandBuilder 自动生成single-table commands 用于协调对 DataSet 所做的更改与关联的 SQL Server 数据库。

解决方法是自己提供属性的命令

SqlDataAdapter.UpdateCommand 
SqlDataAdapter.InsertCommand 
SqlDataAdapter.DeleteCommand 

【讨论】:

当我给出这个显示时:属性访问必须分配给属性或使用它的值。

以上是关于WinForms 中的多个基表不支持动态 SQL 生成的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server相关

SQL 视图

sql左右连接的区别

简述oracle视图

具有多个基表和完整性能的 Microsoft SQL Server (MSSQL) 可更新视图

视图基表中的 SQL 更新行