2009-07-23 3 views
3

Мне нужно экспортировать данные из базы данных SQL Server 2005 в файл Access 97.mdb. Клиент, который в ней нуждается, нуждается в Access 97, потому что для системы, в которую они импортируют его, требуется формат файла Access 97 (не запускайте меня). Любые предложения о том, как писать старомодный файл доступа из SQL или .Net (или VB6 или Ruby или Python ..)?Мне нужно написать файл Access 97.mdb

Спасибо заранее, Ли

+0

Я стараюсь избегать делать что-то вроде этого: http://support.microsoft.com/kb/237575, потому что это то, что мне нужно для автоматизации. Даже не уверен, что это будет возможно без этого. – leebrandt

+0

У меня есть DL'd the Jet OleDb 3.51 драйверы и зарегистрировали их в реестре. Когда я пытаюсь использовать драйвер 3.51 для подключения, я получаю: «Поставщик Microsoft.Jet.OLEDB.3.51» не зарегистрирован на локальной машине ». – leebrandt

ответ

2

Что вам нужно сделать, это экспорт в файл Access для любой версии Access вы установили (до тех пор, как это 2000 ... 2003; Access 2007 не может записывать файлы Access 97). Я полагаю, вы уже знаете, как это сделать.

Затем вы можете создать объект доступа через COM и попросить его преобразовать ваш новый файл .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 в этой версии. Конечно, вам не нужно в любом случае преобразовывать файл в этом случае.

+0

Отличный ответ. Seth –

4

я позволил Sql 2005 сделать это для вас.

В Sql Management Stuidio щелкните правой кнопкой мыши по исходной базе данных, затем Задачи, затем Экспорт данных. Вы можете использовать это для прямого экспорта в свою базу данных Access, просто следуйте инструкциям. Или вы можете вывести его в формат файла, который вы можете использовать для доступа в Access.

+0

Это отлично подходит для установленной версии Access. К сожалению, это не помогает писать в более старую версию Access. При установке MDAC 2.1 драйверы Access 97 были перезаписаны драйверами Access 2000. Спасибо за все ответы. – leebrandt

0

This может дать вам отправную точку. И this article немного устарел, но вы можете что-то поднять. Я могу найти только тех, кто использует Jet 4.0, совместимый с Access 2000, как в предыдущей статье. Использование драйвера MS Access может дать вам то, что вы хотите.

После того, как вы создали базу данных, используйте обычные компоненты ODBC/OLE DB в ADO.NET, чтобы создать свою таблицу и заполнить их с вашими данными.

0

Я думаю, что это безумно делать это с SQL Server. Просто создайте DSN ODBC для своего SQL Server и импортируйте таблицы в свой MDB Access 97 и сделайте с ним. Единственная причина, по которой вы, возможно, захотите сделать это в противном случае, - это то, что вы хотите автоматизировать его и сделать это несколько раз, но это также может быть автоматизировано в Access (TransferDatabase может делать импорт ODBC), и будет занимать только столько строк кода, сколько там это таблицы для импорта.

+0

Один сценарий при выполнении SQL Server не является «сумасшедшим», когда у вас нет Access97;) – onedaywhen

+0

Затем создайте базу данных Access 97 с более поздней версией Access, импортируйте данные и преобразуйте их в формат 97. Я бы рекомендовал начать с 2000 MDB (который вы можете создать в Access 2000, 2002, 2003 и 2007), импортируя данные и проверяя, что типы данных совместимы с A97. Все, что несовместимо с 97 (например, поля BYTE), вы изменили бы на то, что будет работать в 97 перед преобразованием. –

0

Это отличный вопрос! Я на самом деле хотел иметь возможность делать такие вещи программным способом, но в прошлом у меня не было ничего, кроме проблем с этим. Тем не менее, со временем я немного поработал в своих навыках .NET, я подумал, что сделаю попытку написать решение, которое может быть выполнено как приложение консоли. Это может быть реализовано либо как запланированное задание на сервере Windows или сервере sql (с использованием агента Sql Server). Я не понимаю, почему это невозможно было автоматизировать с сервера Sql без следующего кода, но мне действительно было весело с этим, поэтому я просто должен его выставить. Таблица в Sql и Access - это список собак с идентификатором, именем, породой и цветом. Общий материал. Это фактически работает на моем рабочем столе между локальным экземпляром 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(); 
} 
0

Лучший способ сделать это через PInvoke Вам необходимо будет передать параметр CREATE_DBV3 на номер SqlConfigDataSource(). Вот код взят из JetSqlUtil.cs моего ОСС проекта 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)); 
     } 
    } 

Если вам нужно сделать это с 64-разрядной версии сервера SQL с вам потребуется 64 разрядную версию Office 2010 или установлена ​​Microsoft Access Database Engine 2010 Redistributable.