2010-05-28 2 views
1

Я хочу вставить значения для доступа к таблице с помощью управления VBA, есть ли простой способ сделать это. Я пробую этот код, но он не работает должным образом, если я запускаю этот код, он дает ошибку «variable not set», кто-нибудь может мне помочь. заранее заблаговременноVba to Access record Insert Issue

Private Sub CommandButton1_Click() 
Dim cn As ADODB.Connection 
    Dim strSql As String 
    Dim lngKt As Long 
    Dim dbConnectStr As String 
    Dim Catalog As Object 
    Dim cnt As ADODB.Connection 
    Dim dbPath As String 

    Dim myRecordset As New ADODB.Recordset 
    Dim SQL As String, SQL2 As String 

    dbPath = "table.accdb" 
    dbConnectStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & dbPath & ";" 

    SQL = "INSERT INTO Jun_pre (ProductName,DESCRIPTION,SKU,MT,(mt),MRP,Remark,no_of_units_in_a_case) VALUES (""aa"",""bb"",""test"",""testUnit"",""1"",""2"",,""3"",,""4"");" 

     With cnt 
     .Open dbConnectStr 'some other string was there 
     .Execute (SQL) 
     .Close 
    End With 
End Sub 
+0

@HansUp: Большинство начинающих программистов «чувство» из решения, и я был преступником за то, что много " избыточного "кода в« неразрешенной »части кода. Если «мы» - эксперты, «мы» можем просеять. : D –

ответ

5

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

Private Sub CommandButton1_Click() 
Dim sSQL As String 

sSQL = "INSERT INTO Jun_pre " _ 
    & "(ProductName,DESCRIPTION,SKU,MT,(mt),MRP,Remark," _ 
    & "no_of_units_in_a_case) VALUES " 
    & "(""aa"",""bb"",""test"",""testUnit"",1,2,Null,3,Null,4);" 

CurrentDB.Execute sSQL, dbFailOnError 
End Sub 

Против:

Private Sub CommandButton1_Click() 
    Dim cn As New ADODB.Connection 
    Dim strSql As String 
    Dim lngKt As Long 
    Dim dbConnectStr As String 
    Dim Catalog As Object 
    Dim cnt As ADODB.Connection 
    Dim dbPath As String 

    ''You do not need a recordset to execute an SQL statement 
    ''Dim myRecordset As New ADODB.Recordset 
    Dim SQL As String, SQL2 As String 

    dbPath = "table.accdb" 
    dbConnectStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & dbPath & ";" 

    strSQL = "INSERT INTO Jun_pre " _ 
      & "(ProductName,DESCRIPTION,SKU,MT,(mt),MRP,Remark," _ 
      & "no_of_units_in_a_case) VALUES " 
      & "(""aa"",""bb"",""test"",""testUnit"",1,2,Null,3,Null,4);" 

    With cnt 
     .Open dbConnectStr 'some other string was there 
     .Execute (strSQL) 
     .Close 
    End With 
End Sub 

Если ваш пример ADO вставляет в текущую базу данных, она может быть значительно упрощена.

Обратите внимание, что:

  • Это очень маловероятно, что ваша таблица будет принимает строку нулевой длины (,,), Null это , вероятно, лучше.
  • Я очень сомневаюсь, что 2 вступает в текстовое поле, поэтому ему не нужны кавычки.
  • SQL - это зарезервированное слово для VBA, а не должно использоваться для обозначения переменных.
  • Нельзя использовать SQL инъекции с доступом, хотя это может быть быть сложным.
  • Если вы дать вам контроль собственные имена сейчас, это сэкономит горе в будущем
+0

Хотя вы не ответили на его вопрос, я голосую за ваш ответ, потому что ваш предложенный способ делать вещи больше подходит для платформы. – Adarsha

+0

А, я помню большой шум ADO для Access. DAO является родным JET и является лучшим подходом для Access. Язык был написан для Access с самого начала и созрел/развился вместе с ним. –