用于比较数据库结构MS ACCESS与SQL Server的工具?

时间:2019-03-20 04:33:45

标签: sql-server compare

我最近将MS Access数据库迁移到了SQL Server,大多数情况下导入情况都很好,但是我希望通过一些工具(如果有)找到一些数据类型差异。

到目前为止,我发现的工具将MS Access与MS Access进行了比较,或者仅将SQL Server与SQL Server进行了比较。

1 个答案:

答案 0 :(得分:0)

问题在于Access(或JET Red)没有用于处理其数据模型的单一规范API,而是主要通过OLE-DB驱动程序或ODBC驱动程序进行操作。我认为(但无法确认)Office Access GUI程序可能自己的内部API绕过了OLE-DB或ODBC抽象,不幸的是,GUI程序在诸如Table之类的东西中没有使用特定的技术术语。设计器(例如Number > Integer不说它是16、32还是64位整数,而Number > Replication ID根本不是数字,而是Win32 GUID)。

截至2019年,与JET Red的较低级ODBC API相比,Microsoft似乎已取消了优先级 OLE-DB,但这没关系,因为ODBC仍为我们提供了确定优先级的必要细节。数据库表的设计。

无论如何-好消息是,您不一定需要将Access(JET Red)数据库与SQL Server数据库进行比较的工具,因为您可以轻松获取ODBC表规范。

类似这样的东西:

Dictionary<String,DataTable> jetTables = new Dictionary<String,DataTable>();

using( OleDbConnection jetConnection = new OleDbConnection( "your-access-connection-string") )
{
    await jetConnection.OpenAsync().ConfigureAwait(false);

    DataTable schemaTable = connection.GetOleDbSchemaTable(
        OleDbSchemaGuid.Tables,
        new object[] { null, null, null, "TABLE" }
    );

    foreach( DataRow row in schemaTable.Rows.Cast<DataRow>() )
    {
        String tableName = (String)row.ItemArray[2];

        DataTable tableSchema = connection.GetOleDbSchemaTable(
            OleDbSchemaGuid.Tables,
            new object[] { null, null, tableName, "TABLE" }
        );

        jetTables.Add( tableName, tableSchema );
    } 
}

Dictionary<String,DataTable> sqlTables = new Dictionary<String,DataTable>();

using( SqlConnection sqlConnection = new SqlConnection( "your-sql-server-connection-string" ) )
{
    await sqlConnection.OpenAsync().ConfigureAwait(false);

    DataTable allTables = new DataTable();
    using( SqlCommand cmd1 = sqlConnection.CreateCommand() )
    {
        cmd1.CommandText = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES";

        using( SqlDataReader rdr1 = await cmd1.ExecuteReaderAsync.ConfigureAwait(false) )
        {
            allTables.Load( rdr1 );
        }
    }

    foreach( DataRow row in allTables.Rows.Cast<DataRow>() )
    {
        String tableName = (String)row.ItemArray[0];

        using( SqlCommand cmd2 = sqlConnection.CreateCommand() )
        {
            cmd2.CommandText = "SELECT COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @tableName";
            cmd2.Parameters.Add( "@tableName", SqlDbType.NVarChar ).Value = tableName;

            using( SqlDataReader rdr2 = await cmd2.ExecuteReaderAsync.ConfigureAwait(false) )
            {
                DataTable dt = new DataTable();
                dt.Load( rdr2 );
                sqlTables.Add( tableName, dt );
            }
        } 
    }
} 

然后根据需要将jetTablessqlTables进行比较。