3

ODBC (特に AS/400) 経由で外部データ ソースにリンクするとき、データ ディクショナリが利用できない反対側で不可解なフィールド名に出くわすことがよくあります。他のデータベースからフィールドの説明を取得できるというまれなイベントでは、各説明を一度に 1 つずつテーブル デザイン フォームにコピー/貼り付けするのではなく、一度にすべてインポートできるようにしたいと考えています。

システム テーブルでこれを見つけることができなかったので、このメタデータがどこに保存されているかわかりません。それがどこにあり、バッチで更新できるかどうかについてのアイデアはありますか?

更新: OpenSchema メソッド (以下のコードを参照) を使用してスキーマを読み取ることができましたが、これは読み取り専用のデータセットを返すため、説明を更新することができません。

Function UpdateFieldDescriptions()
Dim cn As New ADODB.Connection
Dim rs As ADODB.Recordset
Dim rs2 As Recordset
Dim strSQL As String
Dim strDesc As String

Set cn = CurrentProject.Connection
Set rs = cn.OpenSchema(adSchemaColumns)

While Not rs.EOF
    If Left(rs!table_name, 4) <> "MSys" Then
        Debug.Print rs!table_name, rs!column_name, rs!Description
        strSQL = "SELECT Description " & _
            "FROM tblColumnDescriptions a " & _
            "WHERE a.Name = """ & rs!table_name & """ AND " & _
            "a.Column = """ & rs!column_name & """;"
        Set rs2 = CurrentDb.OpenRecordset(strSQL)
        While Not rs2.EOF
            strDesc = rs2.Fields(0)
            rs!Description = strDesc ' <---This generates an error
        Wend
    End If
    rs.MoveNext
Wend

rs.Update
rs.Close
Set rs = Nothing
Set rs2 = Nothing
Set cn = Nothing

End Function
4

2 に答える 2

4

ADO の代わりに DAO を使用します。

Sub SetFieldDesc(TblName As String, FldName As String, Description As String)
Dim db As DAO.Database, td As DAO.TableDef, fld As DAO.Field

    Set db = CurrentDb()
    Set td = db.TableDefs(TblName)
    Set fld = td.Fields(FldName)

    On Error Resume Next
    fld.Properties("Description") = Description
    If Err.Number = 3270 Then 'Property not found.'
        fld.Properties.Append fld.CreateProperty("Description", dbText, Description)
    End If
End Sub
于 2009-08-26T19:08:26.027 に答える
1

役立つかもしれないいくつかのメモ。以下に、adSchemaColumnsのフィールドの説明を示します。

   Function ListFieldDescriptions()
   ''List field descriptions
   Dim cn As New ADODB.Connection, cn2 As New ADODB.Connection
   Dim rs As ADODB.Recordset, rs2 As ADODB.Recordset

       Set cn = CurrentProject.Connection

       Set rs = cn.OpenSchema(adSchemaTables, _
           Array(Empty, Empty, Empty, "tablenamehere"))

       While Not rs.EOF
           Debug.Print rs!table_name; "   desc=  "; rs!Description
           Set rs2 = cn.OpenSchema(adSchemaColumns, _
               Array(Empty, Empty, "" & rs!table_name & ""))
           While Not rs2.EOF
               Debug.Print "     " & rs2!Column_Name
               Debug.Print "     " & rs2!Data_Type
               Debug.Print "     " & rs2!Description
               Debug.Print "     " & rs2!Is_Nullable
               rs2.MoveNext
           Wend
       rs.MoveNext
       Wend
       rs.Close
       Set cn = Nothing

   End Function    

差出人:http ://wiki.lessthandot.com/index.php/ADO_Schemas

于 2009-06-01T16:06:03.660 に答える