MS Access テーブルのすべてのフィールド名を一覧表示できるかどうか教えてください。
14 に答える
私はミリ秒アクセスであまりにも多くの作業をしています。
これを行う唯一の方法は、vba を使用し、たとえばレコードセットを定義し、フィールドをループすることです。
例えば:
Sub ListFields()
dim rst as new adodb.recordset
rst.open "SELECT * FROM SomeTable", CurrentProject.Connection, adOpenForwardOnly, adLockReadOnly
' Note: adOpenForwardOnly and adLockReadOnly are the default values '
' for the CursorType and LockType arguments, so they are optional here '
' and are shown only for completeness '
dim ii as integer
dim ss as string
for ii = 0 to rst.fields.count - 1
ss = ss & "," & rst.fields(ii).name
next ii
Debug.Print ss
End Sub
文字列変数ss
には、"SomeTable" という名前のテーブル内のすべての列名のコンマ区切りリストが含まれます。
ロジックを少し再フォーマットすることで、必要に応じてこのデータを別のテーブルに挿入し、クエリを実行できるようになります。
これは役に立ちますか?
Documenter ツールを使用するだけです。Database Tools > Database Documenter
に進み、テーブルを選択して [OK] を押します。
手っ取り早く汚い方法に Excel が関係しています。以下をせよ:
- テーブルをデータシート ビューで開きます。
- Access バージョンの特定の手順を使用して、Excel ファイルにエクスポートします。
- Excel ファイルを開きます (まだ開いていない場合)。
- ヘッダーを含む最初の行を選択してコピーします。
- ワークブックに別のシートを追加します (存在しない場合)。
- A1をクリックします。
- 形式を選択して貼り付け > 転置
フィールドは 1 つの列に貼り付けられます。フィールド インデックス番号を調べるには、セル B1 に「0」と入力し、フィールド番号の最後の行までシリーズを入力します。
さらに、特に数十のフィールドを含む従来のフラット ファイルの場合、列をアルファベット順に並べ替えることができます。フラットファイルをリレーショナル モデルに変換しようとしているとき、これは本当に多くの時間を節約します。
私は同じ要件を探してここに来て、このスレッドを参照した後、要件のコードの下にドラフトしました。ソース テーブルのフィールド名が配列に追加され、後でフィールド名が 2 番目のテーブルに割り当てられます。ここで共有するだけで、後で誰かを助けるかもしれません..
Public Sub FieldName_Change()
Dim intNumberOfFields, intX As Integer
Dim txtTableName,txttmpTableName txtFieldName() As String
intNumberOfFields = GetFieldNames(txtTableName, txtFieldName())
For intX = 1 To intNumberOfFields
CurrentDb.TableDefs(txttmpTableName).Fields("F" & intX).Name = txtFieldName(intX)
Next intX
End Sub
Public Function GetFieldNames(ByVal txtTableName As String, ByRef txtFiledName() As String) As Integer
Dim rs As DAO.Recordset
Dim n As Long
Dim sResult As String
Set rs = CurrentDb.OpenRecordset(txtTableName)
ReDim txtFiledName(rs.Fields.Count)
With rs
For n = 0 To .Fields.Count - 1
txtFiledName(n + 1) = .Fields(n).Name
Next n
.Close
GetFieldNames = n
End With
Set rs = Nothing
End Function
これを試してみてください...
private void Button_OldDDLDump_Click(object sender, EventArgs e)
{
string _cnstr = "connectionstringhere";
OleDbConnection _cn = new OleDbConnection(_cnstr);
try
{
_cn.Open();
System.Data.DataTable _dt = null;
try
{
_dt = _cn.GetSchema("tables");
m_msghelper.AppendArray( DataTableHelper.DataTableToString(_dt) );
}
catch (Exception _ex)
{
System.Diagnostics.Debug.WriteLine(_ex.ToString());
}
finally
{
_dt.Dispose();
}
}
catch (Exception _ex)
{
System.Diagnostics.Debug.WriteLine(_ex.ToString());
}
finally
{
_cn.Close();
}
}
ここでデータベース構造を文字列配列にダンプするヘルパー メソッド..
public static class DataTableHelper
{
public static string[] DataTableToString( System.Data.DataTable dt )
{
List<string> _retval = new List<string>();
foreach (System.Data.DataRow row in dt.Rows)
{
foreach (System.Data.DataColumn col in dt.Columns)
{
_retval.Add( string.Format("{0} = {1}", col.ColumnName, row[col]) );
}
_retval.Add( "============================");
}
return _retval.ToArray();
}
}
この作業は昔の方が簡単だったようです。おそらく、この答えはバージョンに大きく依存しています。Access 2007 DB に対する簡単なテストで動作します。
select
Specs.SpecName AS TableName,
Columns.FieldName
from
MSysIMEXColumns Columns
inner join MSysIMEXSpecs Specs on Specs.SpecID = Columns.SpecID
order by
Specs.SpecName,
Columns.FieldName
table_name='table' である information_schema.columns から column_name を選択します