Страницы: 1
RSS
Вставить таблицу с Excle в Oracle, Ошибка Вызов SetParameterInfo не выполнен.
 
Господа, прошу Вашей помощи.
Пытаюсь с листа Excel (2010) .xlsb вытащить данные и вставить в таблицу в Oracle.
Но вылетает ошибка:

Источник: Microsoft OLE DB Provider for Oracle
№ ошибки -2147217839
Описание: Поставщику не удается выдать сведения о параметрах. Вызов SetParameterInfo не выполнен.
Источник: Microsoft OLE DB Provider for Oracle

На отработку обычного Select-a всё ок, а вот вставить таблицу...
Может кто сталкивался?
Заранее благодарен!

Скрытый текст
Изменено: Xapa6apga - 27.11.2014 17:36:48
 
Можно обойтись без параметров, команда будет типа такой:

Код
INSERT INTO Товары 
SELECT Товар,Колво,3 AS Номер
FROM [Ввод$d12:e17] IN 'D:\пример8.xlsx' [Excel 8.0;HDR=Yes;IMEX=1]
WHERE Товар <> '' AND Колво <> 0
 
Excel + SQL = Activetables
 
PowerBoy, не получилось, предполагаю причина в формате .xlsb.
Сделал вот так
Скрытый текст
Но все ровно спасибо.
И уточню, а как будет лучше? как у Вас или с параметрами?
Изменено: Xapa6apga - 14.12.2015 13:24:47
 
Цитата
Xapa6apga пишет: И уточню, а как будет лучше? как у Вас или с параметрами?
:)  быстрее будет, если  создать процедуру в oracle и из нее выполнить импорт данных  :)
у PowerBoy, будет быстрее, а у Вас более контролируемо.
 
B.Key, если б не было нужды выполнения этой фигни, по времени... писал бы в Oracle.
А так пришлось VB юзать.
Уточняю, время не написания, а отработки )
 
Цитата
Xapa6apga пишет: время не написания, а отработки
Так я о том же  :)
 
Всю ночь ломал голову, короче так и не смог реализовать данные скрипт.(
Прошу Вашей помощи.
Предполагаю что не правильно передаю тип данных... но нигде не могу найти соответствия.
Вот таблица:
Date_createDATE
Date_orderDATE
Number_contractINTEGER
WarehouseINTEGER
Num_OrderVARCHAR2 (20 Byte)
Code_waresINTEGER
ManagerVARCHAR2 (100 Byte)
Stock_M_QuantityINTEGER
Ordered_QuantityINTEGER
StatusVARCHAR2 (30 Byte)
CauseVARCHAR2 (100 Byte)
Date_When_DoDATE
Заранее благодарен.
-------------------------------------
Ошибка в присвоении формата даты с временем (
Как правильно присвоить ?
Изменено: Xapa6apga - 27.11.2014 11:06:55 (Нашел ошибку)
 
Откройте recordset на вашей таблице и грузите туда данные
Код
'..........................
On Error GoTo CnErrorHandler
cn.Open
'Явно начинаем транзакцию во избежание режима AutoCommit=ON
sSQL = "select * from analytics.tmp_stok_m  where rownum=0"
Set rs = CreateObject("ADODB.Recordset")
    With rs
    .Open sSQL, cn, 3, 3
    .addnew
    .Fields("date_create").Value = Date
    '......
    .Update
     End With

 
B.Key   ругается на .addnew

Текущий объект Recordset не поддерживает обновление. Это связано с ограничением поставщика или с выбранным типом блокировки.
 
Всё готово, ах какая гадость....
При правильно  заданном параметре всё ок.
Осталось найти параметр с точкой запятой )

Код
cmd.Parameters.Append cmd.CreateParameter("date_create", 7, 1, 4) 
 
для cn

Код
With Cn
    .CursorLocation = 3
    .ConnectionString = ConnectString
    .ConnectionTimeOut = 15
    .CommandTimeout = 30
    .Mode = 3
    .Open
end with
 
B.Key, большое Вам спасибо!
 
Доброго дня коллеги!
Прошу подсказать по данной теме, как добавить из Excel'я новую запись в таблицу в MS SQL. Сделал по подсказке B.Key:
Код
Public Conn As New ADODB.Connection
Public RecSet As New ADODB.Recordset
...
    With Conn
    .CursorLocation = 3
    .ConnectionString = "PROVIDER=SQLOLEDB; SERVER=MKS-GALAKTIKA2; DATABASE=devel; TRUSTED_CONNECTION=NO; UID=naz; PWD=rjkyf"
    .ConnectionTimeout = 15
    .CommandTimeout = 3600
    .Mode = 3
    .Open
    End With
    sCmdStroka = "if exists (select * from dbo.sysobjects where id = object_id(N'tFpCo','U')) drop table tFpCo;" & _
                 vbCr & " create table tFpCo (sFpCo varchar(max) not null);"
    With RecSet
    .Open sCmdStroka, Conn, 3, 3
    .AddNew                       '--> Здесь ошибка!
    .Fields("sFpCo").Value = "MyValue"
    .Update
    End With
... 
Получаю на строке ".AddNew" ошибку ADODB.Recordset-->Операция не допускается, если объект закрыт.
Что не так?
Таблица tFpCo создаётся нормально. А вот запись не добавляется.
 
Изменено: naz - 14.12.2015 10:46:30 (Уточнение)
 
.Open sCmdStroka, Conn, 2, 3
There is no knowledge that is not power
 
SuperCat, а вы уверены, что
Код
RecSet.Open "create table tFpCo (sFpCo varchar(max) not null)", Conn, 2, 3
позволит ТС что-то писать в таблицу? Что будет в RecSet в этом случае?
 
Цитата
SuperCat написал: .Open sCmdStroka, Conn, 2, 3
Не помогло. Та же ошибка.. :(
 
Цитата
naz написал: Не помогло. Та же ошибка.
Ещё бы.
Выполните сначала через Conn.Execute sCmdStroka - создание таблицы, а затем RecSet.Open "Select * From tFpCo" для записи данных в таблицу (параметры опустил).
 
Отлично, получилось! Благодарю Андрея VG за точный ответ. В итоге так сработало:
Код
...   
 With Conn
    .CursorLocation = 3
    .ConnectionString = "PROVIDER=SQLOLEDB; SERVER=MKS-GALAKTIKA2; DATABASE=devel; TRUSTED_CONNECTION=NO; UID=naz; PWD=rjkyf"
    .ConnectionTimeout = 15
    .CommandTimeout = 3600
    .Mode = 3
    .Open
    End With
    sCmdStroka = "if exists (select * from dbo.sysobjects where id = object_id(N'tFpCo','U')) drop table tFpCo;" & _
                 vbCr & " create table tFpCo (sFpCo varchar(max) not null);"
    Conn.Execute sCmdStroka
    sCmdStroka = "Select * from tFpCo"
    With RecSet
    .Open sCmdStroka, Conn, 3, 3
    .AddNew
    .Fields("sFpCo").Value = "MyValue"
    .Update
    End With
...
 
Для полноты картины приведу всю функцию, которая записывает в таблицу MS SQL tFpCo данные из колонки iKol. Может, кому сгодится..
Код
Option Explicit
Public Conn As New ADODB.Connection
Public sCmdStroka As String
Public RecSet As New ADODB.Recordset
Public iLastRow As Integer
Function iCreate_tFpCo(iKol As Integer) As Integer  'Cоздать в базе devel таблицу sTable по колонке iKol
    iLastRow = Cells(Rows.Count, iKol).End(xlUp).Row
    On Error GoTo ErrorHandler
    With Conn
    .CursorLocation = 3
    .ConnectionString = "PROVIDER=SQLOLEDB; SERVER=MKS-GALAKTIKA2; DATABASE=devel; TRUSTED_CONNECTION=NO; UID=naz; PWD=rjkyf"
    .ConnectionTimeout = 15
    .CommandTimeout = 3600
    .Mode = 3
    .Open
    End With
    sCmdStroka = "if exists (select * from dbo.sysobjects where id = object_id(N'tFpCo','U')) drop table tFpCo;" & _
                 vbCr & " create table tFpCo (sFpCo varchar(max) not null);"
    Conn.Execute sCmdStroka
    sCmdStroka = "Select * from tFpCo"
    RecSet.Open sCmdStroka, Conn, 3, 3
    Row = 2
    If iLastRow > 1 Then
        Do While Row <= iLastRow
            With RecSet
            .AddNew
            .Fields("sFpCo").Value = Cells(Row, iKol).Value
            .Update
            End With
            Row = Row + 1
        Loop
    End If
    ClouseRecSet
    ClouseConn
    Exit Function
ErrorHandler:
    ClouseRecSet
    Set Cmd = Nothing
    ClouseConn
    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Function
Public Sub ClouseRecSet()
    If Not RecSet Is Nothing Then
        If RecSet.State = adStateOpen Then RecSet.Close
    End If
    Set RecSet = Nothing
End Sub
Public Sub ClouseConn()
    If Not Conn Is Nothing Then
        If Conn.State = adStateOpen Then Conn.Close
    End If
    Set Conn = Nothing
End Sub

 
Поменяйте CursorLocation на 2.
There is no knowledge that is not power
 
Цитата
SuperCat написал:
Поменяйте CursorLocation на 2.
Поменял, изменений не заметил. Отработало также, как и с .CursorLocation = 3
А в чём смысл этого параметра? Нет справки под рукой по параметрам ADODB.Connection..
Изменено: naz - 15.12.2015 06:46:28
 
У меня вот такой код отработал нормально (необходимо сделать ссылка на библиотеку: Tools -> References -> Microsoft ActiveX Data Objects 6.1 Library):
Код
Sub F()

    Dim conn As ADODB.Connection
    Dim rs As ADODB.Recordset

    Set conn = New ADODB.Connection
    conn.ConnectionString = "Provider=SQLNCLI11.1;Server=SQLSERVER\SQL2014;Database=MYDB;Trusted_Connection=Yes;"
    conn.CursorLocation = adUseServer
    conn.Open
    Set rs = New ADODB.Recordset
    rs.CursorType = adOpenDynamic
    rs.LockType = adLockOptimistic
    rs.Open "SELECT * FROM dbo.MyTable;", conn
    rs.AddNew
    rs!Field1 = "Field1"
    rs.Update
    conn.Close
    rs.Close
End Sub
Проверьте к тому же, есть ли у вас права на добавление данных.
There is no knowledge that is not power
 
SuperCat, у ТС была проблема не с этим, он использовал команду создания таблицы, как источник для ввода данных в таблицу  :)
 
Андрей VG, я отвечал на сообщение #13.
There is no knowledge that is not power
 
Цитата
Андрей VG написал:
SuperCat, у ТС была проблема не с этим, он использовал команду создания таблицы, как источник для ввода данных в таблицу  
Да, у "ТС" в голове была путаница с добавлением данных. Благодарю коллег за обсуждение, ясность появилась. SuperCat, Ваш способ тоже решает мою задачу.
Страницы: 1
Читают тему
Наверх