2016-11-10 9 views
0

TRelationCodeを含むテーブルをループするコードに問題があります。それが見つかると、それからRelationCodeを取得し、それを新しいRelationCodeに変換して新しいRelationCodeに更新する必要があります。テーブルをループして、それぞれにTRelationcodeを持つクエリを照会します

新しいRelationCodeを作成するために、私はMakeRelationCode(OldRelation)という関数を作成しました。

しかし、今では古いコードを新しいものに更新する必要があります。

答えて

1

私は単純なSQLコマンドと少しのVBロジックを好むので、SqlDataAdapterパートはスキップしました。これはパフォーマンスにのみ影響し、グリッドに何かを表示し、双方向バインディングが必要な場合にのみ必要です。

次のコードはテストされていないので、タイプミスなどがないかチェックしてください。 すべてを1つのメソッドに入れます。

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で記述することができれば、全体的なコーディングも簡単になります。

+0

パフォーマンスは問題ではありませんでしたが、そうでなければ私はこのように構築しませんでした。一度だけだから:) –

+0

これは一度だけのことであれば、T-SQLでそれを行うべきです。それは簡単です。しかし、とにかく私のコードを試すことができます:) –

関連する問題