2016-11-24 3 views
0

Я экспортирую данные в таблицу Excel в базу данных SQL Server, если существует UPDATE else INSERT.EXCEL VBA to SQL Index и Seek

Следующий код VBA хорошо работает для экспорта в базу данных ACCESS, , но не для таблицы SQL SERVER DATABASE TABLE.

Появляется сообщение об ошибке: Неверное использование свойства для .Index и .Seek.

Пожалуйста, помогите !!! Toh

Sub ExcelDataToSql() 

Dim cn As ADODB.Connection, rs As ADODB.Recordset, r As Long 
Dim lastrow As Long, o As Long 

Set cn = New ADODB.Connection 
Set rs = New ADODB.Recordset 

cn.Open "Provider=SQLNCLI11;Server=***;Database=****;Trusted_Connection=yes;" 
rs.CursorLocation = adUseServer 
rs.Open "InventorySQL", cn, 1, 3, adCmdTableDirect 

' Get Lastrow 
Worksheets("InventoryEXCEL").Select 
lastrow = Worksheets("InventoryEXCEL").Cells(rows.Count, 1).End(xlUp).Row 
r = 2 ' the start row in the worksheet 
For o = 2 To lastrow 

    'Check For Duplicate In Database SQL 
    With rs 
     .Index = "PrimaryKey" 
     .Seek Range("A" & r).Value 

     If .EOF Then 
      .AddNew    
      'If No Duplicate insert New Record 
      rs.Fields("oPartno") = Range("A" & r).Value 
      rs.Fields("oDesc") = Range("B" & r).Value 
      rs.Fields("oCost") = Range("C" & r).Value 
     .update 
     Else   
      ' If Duplicate Found Update Existing Record 
      rs.Fields("oDesc") = Range("B" & r).Value 
      rs.Fields("oCost") = Range("C & r).Value 
      .Update 
     End If 
    End With 

Next o 
    rs.Close 
    Set rs = Nothing 
    cn.Close 
    Set cn = Nothing 
    MsgBox "Posting Completed" 
End Sub 

. Индекс = "PrimaryKey" --- Sysntax Ошибка: неправильное использование собственности .Seek Range ("А" & г) .Value Sysntax Ошибка:

+1

Почему r и mysal помечены тегом здесь? SQL Server может казаться более подходящим тегом, если я не понял его неправильно? – User632716

+0

Спасибо за отзыв ... это мой первый пост в stackoverflow ... будет более осторожным в будущем ... Мое извинение. – Toh

ответ

1

Ссылка: Seek Method and Index Property Example (VB)

В примере MSDN проходит через массив как первый параметр.

rstEmployees.Seek Array(strID), adSeekFirstEQ 

Имя первого параметра ОС KeyValues который также подразумевает собой массив

enter image description here

Я бы попробовать этот первый

.Seek Array (Range ("A" & г) .Value)

Возможно, было бы полезно использовать одно из значений SeekEnum

enter image description here

Update: TOH ОП обнаружил, что это был relavent фрагмент кода

MSDN также предлагают проверить, если провайдер поддерживает .Index и .Seek

If rstEmployees.Supports(adIndex) And rstEmployees.Supports(adSeek) Then 
+0

Благодарим вас за помощь. Похоже, что провайдер не поддерживает свойства и методы .index и .seek. – Toh

+0

Спасибо за обновление. Я исправил свой ответ. –

+0

Попробуйте использовать метод .seek array (range ("A" & r) .valuye, seekEnum ... Ошибка выполнения 3251 - Текущий провайдер не поддерживает необходимый интерфейс для функциональности индекса. – Toh

1

Моя проблема решена работаю.

Многие ресурсы указали, что поставщики Sql не поддерживают функцию индекса и поиска. Так что я избегаю Index and Seek

Я работаю, импортируя рабочий лист excel в Sql-сервер в качестве исходной таблицы ... после этого слияние целевой таблицы с исходной таблицей ... если соответствует UPDATE, если не соответствует INSERT.

select * from InventoryTableSQL 
select * from InventoryTableFromExcel 

Merge InventoryTableSQL as T 
using InventoryTableFromExcel as S 
on t.oPartno = s.oPartno 
when matched then 
    update set t.oPartno = s.oPartno, 
    t.oDesc = s.oDesc, 
    t.oCost = s.oCost 
when not matched by target then 
    insert(oPartno, oDesc, oCost) values(s.oPartno, s.oDesc, s.oCost));