执行SQL命令作为SQL命令的嵌套循环

时间:2016-02-12 17:52:19

标签: sql sql-server vb.net

我正在构建一个使用SQL查询来获取要删除的表的列表的函数。然后我想迭代每个结果行并执行命令。

Public Shared Sub DropTables(DbConnectionString As String)
    Dim sqlConnection As New SqlConnection(DbConnectionString)
    Dim cmd As New SqlCommand
    Dim reader As SqlDataReader
    cmd.CommandText = "SELECT 'DROP TABLE ' + name + ';' from sysobjects where name like 'SM_%' and type='U';"
    cmd.CommandType = CommandType.Text
    cmd.Connection = sqlConnection
    sqlConnection.Open()
    reader = cmd.ExecuteReader()
    If reader.HasRows Then
        Do While reader.Read()
            Using nonQuery As SqlCommand = sqlConnection.CreateCommand()
                nonQuery.CommandText = reader.GetString(0)
                nonQuery.ExecuteNonQuery()
            End Using
        Loop
    Else
        Console.WriteLine("No rows found.")
    End If
    sqlConnection.Close()
End Sub

我的问题是我在此行收到此错误:nonQuery.ExecuteNonQuery()

There is already an open DataReader associated with this Command which must be closed first.

但我正在使用不同的数据阅读器。

1 个答案:

答案 0 :(得分:3)

我建议不要嵌套数据库连接。当然,为了这个目的,我确定你没有得到如此多的结果,以至于你超过了连接限制,但这通常是不好的做法。

最好返回要删除的表名列表。然后,在处理完初始连接(使用这些表名称)后,可以遍历表名并创建drop table命令。