【问题标题】:vb.net - using a CTE Query in VB.net?vb.net - 在 VB.net 中使用 CTE 查询?
【发布时间】:2017-08-07 13:04:01
【问题描述】:

我有一个带有 CTE 的有效 SQL 查询,我需要在我的 vb.net 应用程序中使用该查询,但问题是我收到一条错误消息:

"Invalid SQL statement; expected 'DELETE', 'INSERT', 'PROCEDURE', 'SELECT', or 'UPDATE'"

代码是这样的:

    Dim da As New OleDbDataAdapter
    Dim ds As New DataSet
    Dim dt As New DataTable
    Dim sqlcmd As String = (";WITH q AS 
                                        (
                                         SELECT a.* 
                                         FROM SampleData AS a
                                         WHERE EXISTS (SELECT 1
                                                       FROM SampleData AS b
                                                       WHERE  a.Name = b.Name 
                                                         AND  a.Account= b.Account 
                                                         AND  a.Amount = -b.Amount)
                                         )
                            DELETE FROM q OUTPUT DELETED.* INTO SampleData2")



    If connDB.State = ConnectionState.Closed Then
        connDB.Open()
    End If

    Try

        ds.Tables.Add(dt)
        da = New OleDbDataAdapter(sqlcmd, connDB)
        da.Fill(dt)

对此有任何帮助吗?我找不到任何解决方案。

【问题讨论】:

  • 如果没有初始的; 会怎样?
  • 它返回相同的错误:(
  • 其他查询是否使用相同的设置?就像您将查询更改为“SELECT 1”之类的简单查询?
  • 是的,我试过删除 CTE 并且它可以工作,但是当我添加它时它返回一个错误
  • SampleData2 是什么?它真的是 SQL Server 吗?如果是,为什么不使用 SqlClient 类?可以使用存储过程吗?

标签: sql-server vb.net ado.net


【解决方案1】:

这是我的函数,它与一个简单的 CTE 一起工作,使用这个函数来测试你的表达式,只需替换你的 CTE 看看,你可能需要修复你的查询。

Public Sub RecursiveData()
    Dim connectionString As String = "Initial Catalog=DBName;Data Source=ServerName;uid=user;password=mypassword;Connection Timeout=50000"

    Dim cteQuery As String = ";WITH   cte " & vbCrLf &
        " AS(SELECT 1 AS n " & vbCrLf &
        " UNION ALL " & vbCrLf &
        " SELECT n + 1 " & vbCrLf &
        " FROM   cte " & vbCrLf &
        " WHERE  n <50 " & vbCrLf &
        " ) " & vbCrLf &
        " SELECT n " & vbCrLf &
        " FROM cte where n <= 5; "

    Using _con As New SqlConnection(connectionString)
        Using _cmd As New SqlCommand(cteQuery, _con)

            _con.Open()

            Using rdr As SqlDataReader = _cmd.ExecuteReader()
                While rdr.Read()
                    Console.WriteLine(rdr.GetValue(0).ToString())
                End While

                rdr.Close()
            End Using

            _con.Close()
        End Using
    End Using

End Sub

【讨论】:

    猜你喜欢
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-30
    • 1970-01-01
    相关资源
    最近更新 更多