Код VBA для передачи таблицы ACCESS на SQL Server

#ms-access #vba

#ms-access #vba

Вопрос:

Я пытался перенести данные моей таблицы Access на SQL server, но я получаю сообщение об ошибке, в котором говорится

Переменная объекта или с переменной блока не установлена

Я уже подключил свою базу данных Access к SQL server, но теперь столкнулся с проблемой передачи данных на SQL server с помощью кода VBA.

Не могли бы вы помочь мне с этим?

Вот мой код:

 Public Sub ADOtest()

   Dim ADOConn As New ADODB.Connection
   Dim ADOCom As New ADODB.Command


   On Error Resume Next

   ADOConn.ConnectionString = "Driver={SQL Server};Server=IT-TEMP2-8470PSQLEXPRESS2014;Database=Discrepancy;Trusted_Connection=True;"
   ADOConn.Open

   Debug.Print ADOConn.State

   Dim db As Database
   Dim Discrepancy As Database
   Set db = Discrepancy
   Dim ID As Variant

   db.Execute "INSERT INTO [ODBC;DRIVER=SQL Server;SERVER=IT-TEMP2-8470PSQLEXPRESS2014;DATABASE=Discrepancy].SFTransfersDB ( ID, TO ) SELECT ID,TO FROM SFTransfersDB" 


End Sub 
  

Я получаю ошибку во 2-й последней строке:

 db.Execute "INSERT INTO [ODBC;DRIVER=SQL Server;SERVER=IT-TEMP2-8470PSQLEXPRESS2014;DATABASE=Discrepancy].SFTransfersDB ( ID, TO ) SELECT ID,TO FROM SFTransfersDB" 
  

Комментарии:

1. ADOConn.Execute вместо db.Execute , но вам может понадобиться поставщик ACE или Jet для использования [ODBC; частей

2. Похоже, вы объединяете ADO с DAO. В вашей строке подключения ADO уже указана база данных, поэтому нет необходимости в отдельном объекте. Более того, после подключения нет необходимости в предложении распределенного запроса в запросе добавления в той же базе данных.

Ответ №1:

Похоже, вы пытаетесь выполнить специальный распределенный запрос. Если сервер разрешает это, рассмотрите возможность выполнения этого оператора после подключения к ADO. Нет необходимости вызывать объекты Access.

 ADOConn.Execute "INSERT INTO dbo.SFTransfersDB ([ID], [TO])" _
           " SELECT [ID], [TO] FROM OPENDATASOURCE('Microsoft.ACE.OLEDB.12.0', " _
           "'Data Source=""C:PathToAccessDatabase.accdb""')...SFTransfersDB;" 
  

Ответ №2:

Вы объявляете две переменные базы данных, но не инициализируете их (вы не устанавливаете для них ничего):

 Dim db As Database
Dim Discrepancy As Database
  

Итак, это

 Set db = Discrepancy
  

совпадает с

 Set db = Nothing
  

и поэтому, когда вы пытаетесь использовать db , вы получаете ошибку, которая db не установлена, а это не так.

Ответ №3:

Спасибо за ваши предложения.

В конце концов, я все понял правильно.

Я использовал «Set db = CurrentDb», и он работал идеально.