2016-09-29 1 views
0

Когда я запускаю команду вставки SQL, которая получает изображение и другие данные из таблицы на сервере Oracle Linked Server, вставляя его на SQL-сервере, он работает. Когда я запускаю тот же самый запрос внутри программы Visual Basic 6, вставка также работает, но изображение не вставлено.Вставка команды работает в MS с Oracle Linked Server, но не в Visual Basic 6

Связанная часть сервера работает, так как я могу сделать несколько запросов с успехом.

Вставка, которую я запускаю, приведена ниже. Обратите внимание, что в обоих сценариях вставка не вызывает ошибку; они работают в VB и Management Studio, НО, при работе через VB, просто изображение не приходит.

INSERT INTO Employees 
(
    PhotoEmployee, 
    TheID, 
    Name 
) 
VALUES 
(
    (Select FOTO_Humanus From OPENQUERY(ORACLE_LinkedServer, 'Select FOTO.pesFoto FOTO_Humanus FROM Pessoa_Foto1 FOTO WHERE FOTO.pesCodPessoa = 32892')), 
    '900397', 
    'MARCELO ROCHA' 
) 

Я искал много, но я не мог найти никого с аналогичной проблемой.

Поле SQL-Server, получающее изображение, относится к типу IMAGE.

В Oracle изображение хранится в поле, которое относится к типу LONG RAW.

Вы можете помочь?

EDIT: (добавлены подробности)

Соединение нормально ... им довольно уверен. Кроме того, нет ошибки при выполнении команды SQL или подключения к базе данных: Everythings отлично работает, за исключением этого изображения .., который не вставлен в базу данных назначения. Все поля ohter вставлены без проблем. Все поля находятся в одной таблице.

Код Visual Basic 6, который я использую, следующий.

1 - O заполнить массив с точным запросом мне нужно

2 - Скоро позже я итерация в этом массиве, выполнение запроса SQL.

Вот код VB:

SQLOracleTemp = "Select FOTO.pesFoto FOTO_Humanus FROM Pessoa_Foto1 FOTO WHERE FOTO.pesCodPessoa = 32892" 

NomeLinkedServer = "ORACLE_LinkedServer" 

SQL_InsertColab = "INSERT INTO Employees" & vbCrLf 
SQL_InsertColab = SQL_InsertColab & " (" & vbCrLf 
SQL_InsertColab = SQL_InsertColab & " funFotoColaborador," & vbCrLf 
SQL_InsertColab = SQL_InsertColab & " TheID," & vbCrLf 
SQL_InsertColab = SQL_InsertColab & " Name" & vbCrLf 
SQL_InsertColab = SQL_InsertColab & ")" & vbCrLf 
SQL_InsertColab = SQL_InsertColab & " VALUES" & vbCrLf 
SQL_InsertColab = SQL_InsertColab & " (" & vbCrLf 


SQL_InsertColab = SQL_InsertColab & " (Select FOTO_Humanus From OPENQUERY(" & NomeLinkedServer & ", '" & SQLOracleTemp & "'))," & vbCrLf 

SQL_InsertColab = SQL_InsertColab & " " & aColabs_Insert(UBound(aColabs_Insert)).IDOAS & "," & vbCrLf 
SQL_InsertColab = SQL_InsertColab & " " & aColabs_Insert(UBound(aColabs_Insert)).Nome & vbCrLf 
SQL_InsertColab = SQL_InsertColab & ")" & vbCrLf 

aSQL(UBound(aSQL)) = SQL_InsertColab 
ReDim Preserve aSQL(UBound(aSQL) + 1) 



For ContaSQL = 0 To UBound(aSQL) 

    if aSQL(ContaSQL) <> "" then 
     gConexao_Banco.Execute aSQL(ContaSQL) 
    enf if 

Next 
+1

Пожалуйста, покажите нам код VB6, который не работает –

+0

Привет, спасибо за сообщение. Я отредактировал вопрос и добавил код VB. Код VB создает точный запрос, который я опубликовал в начале вопроса. Если я остановлю VB, вы получите запрос в режиме отладки и выполните команду byb в Management Studio .. он работает. Если я разрешу vb работать .. он выполняет запрос, вставка работает ... НО .. ИЗОБРАЖЕНИЕ не наступило. Когда я проверяю, поле изображения равно NULL. Когда я делаю это вручную .. когда я проверяю .. я могу видеть данные изображения в поле, и он также появляется в моем приложении – Murch

+0

В каком режиме вы открываете свое соединение? Вы проверили сборку ошибок соединения после вызова Execute? – jac

ответ

0

Это может быть не точный ответ, но я не знаю, как показать код форматирования в комментарии. У вас есть ReDim Preserve aSQL(UBound(aSQL) + 1) после aSQL(UBound(aSQL)) = SQL_InsertColab. Звучит странно, но, вероятно, это правильно по вашей логике. Теперь после этого вы выполняете массив sqlstatement в цикле for. Таким образом, последний элемент массива, который все еще пуст, запускается в цикле for, и, очевидно, он терпит неудачу. В любом случае попробуйте ниже. В цикле последний элемент массива не выполняется. Проверьте свой сценарий и обновите его соответствующим образом.

For ContaSQL = 0 To UBound(aSQL)-1 
    gConexao_Banco.Errors.Clear 
    gConexao_Banco.Execute aSQL(ContaSQL) 
    If gConexao_Banco.Errors.Count > 0 Then 
     For i = 0 To gConexao_Banco.Errors.Count 
      Debug.Print gConexao_Banco.Error(i).Number 
      Debug.Print gConexao_Banco.Error(i).Source 
      Debug.Print gConexao_Banco.Error(i).Description 
     Next i 
    End If 
Next 
+0

Вы правы, думая, что последняя позиция в массиве будет пустой.и, вероятно, покажут ошибку. Но, на самом деле, я справляюсь с этим и использую ReDim Preserve aSQL (UBound (aSQL) - 1) после этого момента. Я забыл поместить его в код .. потому что я сделал некоторую очистку кода, чтобы сделать его проще .. читателю. Но в фактическом коде .. есть линия, которая справляется с этим. И вставка выполняется без проблем. Проблема в том, что после успешной вставки ... только 1 поле осталось с NULL: изображение, которое я знаю, находится в источнике и должно находиться в поле назначения – Murch

+0

Я не получил, осталось только 1 поле с НОЛЬ. Вы имели в виду, что только 1 столбец вставки получает значение null, а остальные остальные вставлены правильно? –

+0

Hi Makul, Именно это! Вставка запускается и вставленная запись есть ... НО .... с полем «Фото» как нуль. Если я запустил EXACT SAME, но вместо того, чтобы запускать корыто VB, я запустил его в Studio Management Studio ... вставка запускается без ошибок и на этот раз .. изображение есть. – Murch

Смежные вопросы