循环遍历表并查询其中包含TRelationcode的每个表

时间:2016-11-10 12:07:11

标签: sql vb.net loops updating

我在使用包含TRelationCode的表循环的代码时遇到问题。当它找到一个必须从中获取RelationCode然后将其转换为新的RelationCode并将其更新为新的。

为了创建新的RelationCode,我创建了一个名为MakeRelationCode(OldRelation)的函数。我有这个代码循环遍历表:

Dim query As String = "use fmsStage; SELECT * FROM INFORMATION_SCHEMA.columns WHERE COLUMN_NAME = 'TRelationcode'"
Dim myCmd As SqlDataAdapter = New SqlDataAdapter(query, con)
Dim myData As New DataSet()
myCmd.Fill(myData)

For Each table As DataTable In myData.Tables
    For Each row As DataRow In table.Rows
        For Each col As DataColumn In table.Columns

        Next
    Next
Next

但现在我需要将旧代码更新为新代码。

1 个答案:

答案 0 :(得分:1)

我更喜欢简单的SQL命令和一些vb逻辑,因此我跳过了SqlDataAdapter部分。这只会降低性能,只有在网格中显示某些内容并且需要双向绑定时才是必需的。

以下代码未经测试且输入为盲,请检查拼写错误等。 我把所有东西放在一个方法中。

Dim tableNames As New List(Of String)
'Key: Old code, Value: New code'
Dim trelationcodes As New Dictionary(Of String, String)

Using conn As New SqlClient.SqlConnection("YourConnectionString") 'Change connection string to your needs'
    Dim qTableNames = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.columns WHERE COLUMN_NAME = 'TRelationcode'"
    conn.Open()

    'Get table names with TRelationcode column'
    Using commTableNames As New SqlClient.SqlCommand(qTableNames, conn)
        Dim dataReader = commTableNames.ExecuteReader()
        While dataReader.Read()
            tableNames.Add(dataReader.GetString(0))
        End While
    End Using

    'Select all distinct old TRelationcode which will be updated'
    Dim qTrelationcodesOld = "SELECT DISTINCT TRelationcode FROM {0}"
    For Each tableName In tableNames
        'Get all old TRelationcodes from table found previuosly'
        Using commTrelationcodesOld As New SqlClient.SqlCommand()
            commTrelationcodesOld.Connection = conn
            commTrelationcodesOld.CommandText = String.Format(qTrelationcodesOld, tableName)
            Dim dataReader = commTrelationcodesOld.ExecuteReader()
            While dataReader.Read()
                Dim code = dataReader.GetString(0)
                If Not trelationcodes.ContainsKey(code) Then
                    trelationcodes.Add(code, "") 'Value will be set later'
                End If
            End While
        End Using

        'Get new TRelationcodes'
        For Each tRelCodeOld In trelationcodes.Keys
            trelationcodes(tRelCodeOld) = MakeRelationCode(tRelCodeOld)
        Next

        'Set new TRelationcodes'
        Dim uTRelationcode = "UPDATE {0} SET TRelationcode = @newCode WHERE TRelationcode = @oldCode"
        For Each tRelCodes In trelationcodes
            Using commTrelationcodesNew As New SqlClient.SqlCommand()
                commTrelationcodesNew.Connection = conn
                commTrelationcodesNew.CommandText = String.Format(uTRelationcode, tableName)
                commTrelationcodesNew.Parameters.Add("@oldCode", SqlDbType.VarChar).Value = tRelCodes.Key 'Varchar correct?'
                commTrelationcodesNew.Parameters.Add("@newCode", SqlDbType.VarChar).Value = tRelCodes.Value 'Varchar correct?'
                commTrelationcodesNew.ExecuteNonQuery()
            End Using
        Next
    Next
End Using

代码远离最佳,例如我跳过了异常处理 最关注的部分是您的MakeRelationCode功能。如果内部逻辑可以在存储过程中用T-SQL编写,那么整个编码也将被简化。