2009-07-23 9 views
3

Ich muss Daten aus einer SQL Server 2005 DB in eine Access 97 MDB-Datei exportieren. Der Client, der es benötigt, benötigt Access 97, da das System, in das er es importiert, das Access 97-Dateiformat benötigt (ich werde nicht gestartet). Irgendwelche Vorschläge, wie man eine alte Access-Datei von SQL oder .Net (oder VB6 oder Ruby oder Python ..) schreibt?Ich muss eine Access 97 MDB-Datei schreiben

Vielen Dank im Voraus, Lee

+0

Ich versuche zu vermeiden, etwas wie dies zu tun: http://support.microsoft.com/kb/237575, weil dies etwas ist, das ich automatisieren muss. Nicht einmal sicher, ob es möglich ist, ohne dies zu tun. – leebrandt

+0

Ich habe die Jet OleDb 3.51 Treiber DL'd und registriert sie in der Registrierung. Wenn ich versuche, den 3.51-Treiber für die Verbindung zu verwenden, bekomme ich "Der 'Microsoft.Jet.OLEDB.3.51' Provider ist nicht auf dem lokalen Rechner registriert." – leebrandt

Antwort

2

Was müssen Sie tun Export in eine Access-Datei für was auch immer Access-Version Sie installiert haben (so lange, wie es 2000 ist ... 2003; Access 2007 kann nicht in Access 97-Dateien schreiben). Ich nehme an, Sie wissen bereits, wie man das macht.

Dann können Sie ein Access-Objekt über COM erstellen und es bitten, Ihre neue MDB-Datei in eine neue Access 97-Datenbank zu konvertieren. In VBScript, der Code wie folgt aussieht (wie einstellen erforderlich, wenn Sie mit VBA, VB.Net oder einem anderen Sprache):

const acFileFormatAccess97 = 8 

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

Wenn Sie Access 97 installiert ist, wird der obige Befehl nicht funktioniert, weil Access in dieser Version nicht über die ConvertAccessProject-Funktion verfügte. Natürlich müssen Sie die Datei in diesem Fall sowieso nicht konvertieren.

+0

Große Antwort. Seth –

4

ich lasse SQL Server 2005, die für Sie tun.

Klicken Sie im Sql Management Stuidio mit der rechten Maustaste auf Ihre Quelldatenbank, dann auf Aufgaben und dann auf Daten exportieren. Sie können dies verwenden, um direkt in Ihre Access-Datenbank zu exportieren. Folgen Sie einfach den Anweisungen. Oder Sie können es in ein Dateiformat ausgeben, das Sie für den Zugriff in Access verwenden können.

+0

Dies würde für eine Access-Version, die installiert ist, gut funktionieren. Leider hilft es nicht, auf eine ältere Version von Access zu schreiben. Bei der Installation von MDAC 2.1 wurden die Treiber für Access 97 mit den Access 2000-Treibern überschrieben. Danke für alle Antworten. – leebrandt

0

This könnte Ihnen einen Ausgangspunkt geben. Und this article ist ein bisschen alt, aber Sie könnten vielleicht etwas abholen. Ich kann nur jene finden, die Jet 4.0 benutzen, das mit Access 2000 wie im vorhergehenden Artikel kompatibel ist. Wenn Sie den MS Access-Treiber verwenden, erhalten Sie möglicherweise das, was Sie möchten.

Nachdem Sie die Datenbank erstellt haben, verwenden Sie reguläre ODBC/OLE DB-bezogene Elemente in ADO.NET, um Ihre Tabelle zu erstellen und sie mit Ihren Daten zu füllen.

0

Ich denke, es ist verrückt, es von SQL Server zu tun. Erstellen Sie einfach einen ODBC-DSN für Ihren SQL Server und importieren Sie die Tabellen in Ihre Access 97 MDB und machen Sie damit fertig. Der einzige Grund, warum Sie es andernfalls tun möchten, ist, wenn Sie es automatisieren und es wiederholt ausführen möchten, aber das auch in Access automatisiert werden kann (TransferDatabase kann ODBC-Importe ausführen) und nur so viele Codezeilen wie dort verwenden sind Tabellen zum Importieren.

+0

Ein Szenario, wenn Sie es von SQL Server tun ist nicht "verrückt" ist, wenn Sie Access97 nicht haben;) – onedaywhen

+0

Dann erstellen Sie eine Access 97-Datenbank mit Ihrer späteren Version von Access, importieren Sie die Daten und konvertieren Sie es in 97 Format. Ich würde empfehlen, mit einem MDB 2000 (das Sie in Access 2000, 2002, 2003 und 2007 erstellen können) zu beginnen, die Daten zu importieren und zu überprüfen, dass die Datentypen A97 kompatibel sind. Alles, was nicht mit 97 kompatibel ist (z. B. BYTE-Felder), würden Sie in etwas ändern, das vor der Konvertierung in 97 funktioniert. –

0

Das ist eine gute Frage! Ich wollte eigentlich so etwas auf programmatische Art machen können, aber in der Vergangenheit hatte ich nur Schwierigkeiten damit zu kommen. Allerdings bin ich in meinen .NET-Fähigkeiten über die Jahre ein bisschen gereift, dachte ich, ich würde mich damit beschäftigen, eine Lösung zu schreiben, die als Konsolen-App ausgeführt werden könnte. Dies kann entweder als eine geplante Aufgabe auf dem Windows-Server oder SQL-Server (mit dem Sql-Server-Agent) implementiert werden. Ich sehe nicht, warum das vom Sql Server ohne den folgenden Code nicht automatisiert werden konnte, aber ich hatte wirklich Spaß damit, also muss ich es einfach rausbringen. Die Tabelle in Sql und Access ist eine Liste von Hunden mit einer ID, einem Namen, einer Rasse und einer Farbe. Generisches Zeug. Dies funktioniert tatsächlich auf meinem Desktop zwischen einer lokalen Instanz von Sql Server und Access (2007, aber ich weiß nicht, warum es mit 97 nicht funktionieren würde). Bitte zögern Sie nicht zu kritisieren.

BTW, hat die folgenden:

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

hier:

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(); 
} 
0

Der beste Weg, dies zu tun ist über PInvoke Sie müssen den CREATE_DBV3 Parameter an SqlConfigDataSource() übergeben. Hier ist der Code von JetSqlUtil.cs meines OSS Projekt genommen PlaneDisaster.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)); 
     } 
    } 

Wenn Sie dies von einer 64-Bit-Version von SQL Server tun müssen, müssen Sie die 64-Bit-Version von Office 2010 oder die Microsoft Access Database Engine 2010 Redistributable installiert.

Verwandte Themen