我需要编写Access 97 .mdb文件

时间:2009-07-23 16:06:48

标签: ms-access ms-access-97

我需要将数据从SQL Server 2005 DB导出到Access 97 .mdb文件。需要它的客户端需要它是Access 97,因为他们导入它的系统需要Access 97文件格式(不要让我开始)。有关如何从SQL或.Net(或VB6或Ruby或Python ..)编写旧的Access文件的任何建议吗?

提前致谢, 利

6 个答案:

答案 0 :(得分:4)

我让Sql 2005为你做。

在Sql Management Stuidio中,右键单击源数据库,然后右键单击“任务”,再单击“导出数据”。您可以使用它直接导出到Access数据库,只需按照提示操作即可。或者您可以将其输出为可用于放入Access的文件格式。

答案 1 :(得分:2)

您需要做的是导入A​​ccess文件以获取您安装的任何Access版本(只要它是2000 ... 2003; Access 2007无法写入Access 97文件)。我假设你已经知道如何做到这一点。

然后,您可以通过COM创建一个Access对象,并要求它将您的新.mdb文件转换为新的Access 97数据库。在VBScript中,代码如下所示(如果您使用VBA,VB.Net或其他语言,则根据需要进行调整):

const acFileFormatAccess97 = 8

dim app
set app = CreateObject("Access.Application")
app.ConvertAccessProject "y:\mydatabase.mdb", "y:\mydatabase97.mdb", acFileFormatAccess97

如果安装了Access 97,则上述命令将不起作用,因为Access在该版本中没有ConvertAccessProject函数。当然,无论如何你都不需要转换文件。

答案 2 :(得分:0)

This可能会给你一个起点。 并且this article有点旧,但你可能能够拿起一些东西。我只能找到使用Jet 4.0的那些,与之前的文章中的Access 2000兼容。使用MS Access驱动程序可能会为您提供所需的内容。

创建数据库后,在ADO.NET中使用常规的ODBC / OLE DB相关内容来创建表,并使用您的数据填充它们。

答案 3 :(得分:0)

我认为从SQL Server做到这一点很疯狂。只需为SQL Server创建一个ODBC DSN,然后将表导入Access 97 MDB并完成它。您可能想要这样做的唯一原因是,如果您想要自动执行它并重复执行它,但也可以在Access中自动执行(TransferDatabase可以执行ODBC导入),并且只需要那么多行代码是要导入的表。

答案 4 :(得分:0)

这是一个很好的问题!我实际上希望能够以程序化的方式做这种事情,但在过去,我只是遇到了麻烦。但是,多年来我的.NET技能已经成熟了一些,我想我会尝试编写一个可以作为Console应用程序执行的解决方案。这可以作为Windows服务器或sql server上的计划任务(使用Sql Server代理)实现。我不明白为什么在没有以下代码的情况下无法从Sql Server自动化,但我真的很开心,所以我只需要把它放在那里。 Sql和Access中的表是一个狗列表,带有ID,名称,品种和颜色。通用的东西。这实际上可以在我的桌面上在Sql Server的本地实例和Access之间工作(2007,但我不知道为什么它不适用于97)。请随意批评。

BTW,有以下几点:

using System.Data;
using System.Data.OleDb;
using System.Data.SqlClient;

下面:

static void Main(string[] args)
{
    SqlConnectionStringBuilder cstrbuilder = new SqlConnectionStringBuilder();
    cstrbuilder.DataSource = "localhost";
    cstrbuilder.UserID = "frogmorton";
    cstrbuilder.Password = "lillypad99";
    cstrbuilder.InitialCatalog = "Dogs";
    SqlConnection sconn = new SqlConnection(cstrbuilder.ToString());
    sconn.Open();
    SqlCommand scmd = new SqlCommand("select * from Dogs", sconn);

    SqlDataReader reader = scmd.ExecuteReader();

    if (reader.HasRows)
    {

        OleDbConnectionStringBuilder sb = new OleDbConnectionStringBuilder();
        sb.Provider = "Microsoft.Jet.OLEDB.4.0";
        sb.PersistSecurityInfo = false;
        sb.DataSource = @"C:\A\StackOverflog\DogBase.mdb";
        OleDbConnection conn = new OleDbConnection(sb.ToString());
        conn.Open();
        OleDbCommand cmd = new OleDbCommand("Delete from Dogs", conn);
        cmd.CommandType = CommandType.Text;
        cmd.ExecuteNonQuery();
        conn.Close();

        OleDbConnection conn2 = new OleDbConnection(sb.ToString());
        conn2.Open();
        OleDbCommand icmd = new OleDbCommand("Insert into dogs (DogID, DogName, Breed, Color) values ({0}, '{1}', '{2}', '{3}');", conn2);
        icmd.CommandType = CommandType.Text;

        while (reader.Read())
        {
            string insertCommandString =
                String.Format("Insert into dogs (DogID, DogName, Breed, Color) values ({0}, '{1}', '{2}', '{3}');"
                , reader.GetInt32(0)
                , reader.GetString(1)
                , reader.GetString(2)
                , reader.GetString(3)
                );
            icmd.CommandText = insertCommandString;
            icmd.ExecuteNonQuery();

        }
        conn2.Close();
    }

    sconn.Close();
}

答案 5 :(得分:0)

执行此操作的最佳方式是PInvoke您需要将CREATE_DBV3参数传递给SqlConfigDataSource()。以下是我的OSS项目JetSqlUtil.csPlaneDisaster.NET代码:

    #region PInvoke
    private enum ODBC_Constants : int {
        ODBC_ADD_DSN = 1,
        ODBC_CONFIG_DSN,
        ODBC_REMOVE_DSN,
        ODBC_ADD_SYS_DSN,
        ODBC_CONFIG_SYS_DSN,
        ODBC_REMOVE_SYS_DSN,
        ODBC_REMOVE_DEFAULT_DSN,
    }

    private enum SQL_RETURN_CODE : int
    {
        SQL_ERROR = -1,
        SQL_INVALID_HANDLE = -2,
        SQL_SUCCESS = 0,
        SQL_SUCCESS_WITH_INFO = 1,
        SQL_STILL_EXECUTING = 2,
        SQL_NEED_DATA = 99,
        SQL_NO_DATA = 100
    }

    [DllImport("ODBCCP32.DLL",CharSet=CharSet.Unicode, SetLastError=true)]
    private static extern int SQLConfigDataSource (int hwndParent, ODBC_Constants fRequest, string lpszDriver, string lpszAttributes);

    [DllImport("ODBCCP32.DLL", CharSet = CharSet.Auto)]
    private static extern SQL_RETURN_CODE SQLInstallerError(int iError, ref int pfErrorCode, StringBuilder lpszErrorMsg, int cbErrorMsgMax, ref int pcbErrorMsg);
    #endregion


    internal static string GetOdbcProviderName()
    {
        if (string.IsNullOrEmpty(OdbcProviderName))
        {
            var odbcRegKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\\ODBC\\ODBCINST.INI\\ODBC Drivers", false);
            var drivers = new List<string>(odbcRegKey.GetValueNames());
            if (drivers.Contains("Microsoft Access Driver (*.mdb, *.accdb)"))
            {
                OdbcProviderName = "Microsoft Access Driver (*.mdb, *.accdb)";
            }
            else if (drivers.Contains("Microsoft Access Driver (*.mdb)"))
            {
                OdbcProviderName = "Microsoft Access Driver (*.mdb)";
            }
            else
            {
                //TODO: Condider checking for 32 versus 64 bit.
                //TODO: Find a better exception type. http://stackoverflow.com/questions/7221703/what-is-the-proper-exception-to-throw-if-an-odbc-driver-cannot-be-found
                throw new InvalidOperationException("Cannot find an ODBC driver for Microsoft Access. Please download the Microsoft Access Database Engine 2010 Redistributable. http://www.microsoft.com/download/en/details.aspx?id=13255");
            }
        }



    /// <summary>
    /// Creates an Access 2003 database. If the filename specified exists it is 
    /// overwritten.
    /// </summary>
    /// <param name="fileName">The name of the databse to create.</param>
    /// <param name="version">The version of the database to create.</param>
    public static void CreateMDB (string fileName, AccessDbVersion version = AccessDbVersion.Access2003) {
        ;
        if (File.Exists(fileName)) {
            File.Delete(fileName);
        }

        string command = "";
        switch (version)
        {
            case AccessDbVersion.Access95:
                command = "CREATE_DBV3";
                break;
            case AccessDbVersion.Access2000:
                command = "CREATE_DBV4";
                break;
            case AccessDbVersion.Access2003:
                command = "CREATE_DB";
                break;
        }

        string attributes = String.Format("{0}=\"{1}\" General\0", command, fileName);
        int retCode = SQLConfigDataSource 
            (0, ODBC_Constants.ODBC_ADD_DSN,
             GetOdbcProviderName(), attributes);
        if (retCode == 0)
        {
            int errorCode = 0 ;
            int  resizeErrorMesg = 0 ;
            var sbError = new StringBuilder(512);
            SQLInstallerError(1, ref errorCode, sbError, sbError.MaxCapacity, ref resizeErrorMesg);
            throw new ApplicationException(string.Format("Cannot create file: {0}. Error: {1}", fileName, sbError));
        }
    }

如果需要从64位版本的SQL Server执行此操作,则需要安装64位版本的Office 2010或Microsoft Access Database Engine 2010 Redistributable