C# 使用GetSchema检索表的列

C# 使用GetSchema检索表的列,c#,mysql,sql,C#,Mysql,Sql,我想检索列表matchingTableList中所有表的列列表: foreach (var table in matchingTableList) { Console.WriteLine("Analyzing " + table); var sourceTableRows = sqlSourceConnection.GetSchema("Columns", new[] {SourceDatabase, null, table, null}); var destTableR

我想检索列表matchingTableList中所有表的列列表:

foreach (var table in matchingTableList)
{
    Console.WriteLine("Analyzing " + table);
    var sourceTableRows = sqlSourceConnection.GetSchema("Columns", new[] {SourceDatabase, null, table, null});
    var destTableRows = sqlDestConnection.GetSchema("Columns", new[] { DestDatabase, null, table, null });
    Console.WriteLine("Number of fields " + sourceTableRows.Rows.Count);
    //iterate through every field in the table
    foreach (var row in sourceTableRows.Rows)
    {
        Console.WriteLine("Analyzing col " + row);
        //if the field is not present, add it to the list containing the added fields for the current table
        if (destTableRows.Columns.Contains((row.ToString()))) continue;
        if (!changedTablesAddedFields[table].Contains(row.ToString()))
        {
            changedTablesAddedFields[table].Add(row.ToString());
        }
    }
}
sourceTableRows.Rows的计数始终为0,即使这些表在数据库中有列。 我错过了什么

EDIT1:我可以在执行此操作时检索值

var sourceTableRows = sqlSourceConnection.GetSchema("Columns", new[] {null, null, table, null});
var destTableRows = sqlDestConnection.GetSchema("Columns", new[] { null, null, table, null });
但为什么会这样呢

EDIT2:我发现这是MSSQL的语法:

var sourceTableRows = sqlSourceConnection.GetSchema("Columns", new[] {SourceDatabase, null, table, null});
var destTableRows = sqlDestConnection.GetSchema("Columns", new[] { DestDatabase, null, table, null });
MySQL需要这样做:

var sourceTableRows = sqlSourceConnection.GetSchema("Columns", new[] { null, SourceDatabase, table, null});
var destTableRows = sqlDestConnection.GetSchema("Columns", new[] { null, DestDatabase, table, null });
尽管如此,当我试图用

var rowName = (string) row[2];

我得到的唯一信息是表名。我调试了应用程序,但在row变量中找不到列名称。我缺少什么?

请尝试以下代码段(用于SqlCE,但适用于SQL Server的其他版本:只使用相应的SQL对象)。另外,请注意注释,因为它们基本上解释了代码操作逻辑:

        // `ConnectionString` specifies the Database
        SqlCeConnection connectionSql = new SqlCeConnection(ConnectionString);
        connectionSql.Open();

        // create new `DataAdapter` on `connectionSql` and Your `SelectQuery` text
        SqlCeDataAdapter dataAdapterSql = new SqlCeDataAdapter();
        dataAdapterSql.SelectCommand = new SqlCeCommand(SelectQuery, connectionSql);

        // create DataSet
        DataSet dataSet= new DataSet();

        // retrieve TableSchema
        DataTable[] _dataTablesSchema = dataAdapterSql.FillSchema(dataSet, SchemaType.Source);

        // there is only one Table in DataSet, so use 0-index
        DataTable  sourceDataTable = _dataTablesSchema[0];

        // use DataAdapter to Fill Dataset
        dataAdapterSql.Fill(sourceDataTable );
您还可以使用快捷方式缩短代码:

    // there is only one Table in DataSet, so use 0-index
    DataTable sourceDataTable= = dataAdapterSql.FillSchema(dataSet, SchemaType.Source)[0];
希望这会有所帮助。Rgds


另外,在您自己的代码中,作为调试建议:放置一个换行符,并确保
sourceDataTable=null

这里的DestDatabase是什么?Destination database,一个包含数据库名称的字符串。对不起,SourceDatabase。如果你说错话了,你就得不到名单,这不是错的。这与我在创建sql连接时使用的值相同。好吧,我尝试了这段代码(至少只使用源代码部分),无论是否使用数据库(目录)名称,它都能正常工作。因此,也许这里有一些不同的东西在起作用。我认为您需要启动调试器并检查传递的值。我使用的是MySQL,因此代码并不适合我的情况。