我正在尝试编写一个程序来打印(在字符串变量中)有关 mdb 数据库的以下信息:
表名 表的总列数
列列表如下:
列名:列数据类型:
为此,我使用了两种自定义类型(公共类),当然还有列表。这是我到目前为止的代码(顺便说一下,由于这里收集的问题和答案,它已经进行了不小的调整):
以下是我创建的用于定义我正在使用的两种新类型的类:
public class ClmnInfo
{
public string strColumnName { get; set; }
public string strColumnType { get; set; }
}
public class TblInfo
{
public string strTableName { get; set; }
public int intColumnsQty { get; set; }
public List<ClmnInfo> ColumnList { get; set; }
}
这是实际获取数据的代码。请记住,我使用 OleDB 连接到实际数据并且一切正常,除了我将在下面描述的问题。作为示例,我目前正在使用一个简单的 1 个表 db 测试此代码,其中包含 12 个字符串类型的列,保存为 1 个 int32(Access 中的 Long Int)。
//Here I declare and Initialize all relevant variables and Lists
TblInfo CurrentTableInfo = new TblInfo();
ClmnInfo CurrentColumnInfo = new ClmnInfo();
List<TblInfo> AllTablesInfo = new List<TblInfo>();
//This loop iterates through each table obtained and imported previously in the program
int i = 0;
foreach (DataTable dt in dtImportedTables.Tables)
{
CurrentTableInfo.strTableName = Globals.tblSchemaTable.Rows[i][2].ToString(); //Gets the name of the current table
CurrentTableInfo.intColumnsQty = dt.Columns.Count; //Gets the total number of columns in the current table
CurrentTableInfo.ColumnList = new List<ClmnInfo>(); //Initializes the list which will house all of the columns
//This loop iterates through each column in the current table
foreach (DataColumn dc in dt.Columns)
{
CurrentColumnInfo.ColumnName = dc.ColumnName; // Gets the current column name
CurrentColumnInfo.ColumnType = dc.DataType.Name; // Gets the current column data type
CurrentTableInfo.ColumnList.Add(CurrentColumnInfo); // adds the information just obtained as a member of the columns list contained in CurrentColumnInfo
}
//BAD INSTRUCTION FOLLOWS:
AllTablesInfo.Add(CurrentTableInfo); //This SHOULD add The collection of column_names and column_types in a "master" list containing the table name, the number of columns, and the list of columns
}
我调试了代码并观察了所有变量。它工作得很好(表名和列数量被正确注册,以及该表的 column_names、column_types 列表),但是当“坏”指令被执行时,AllTablesInfo 的内容根本不是它们应该是的. 表名是正确的,列数也是正确的,列列表甚至应该有 12 个成员,但列表的每个成员都是相同的,即我正在检查的数据库的 LAST 列。谁能向我解释为什么 CurrentTableInfo 在添加到 AllTablesInfo 列表时会以这种方式被覆盖?