Страницы: 1
RSS
Метод CopyFromRecordset
 
Добрый день!  
Есть код, который из Excel запрашивает данные с MS SQL Server 2005 в зависимости от введенных дат. Все работает нормально, но до определенного этапа. Часть данных выгружается, часть нет. Потом выскакивает ошибка:  
 
Run-Time error '-2147467259 (80004005)'  
"Method 'CopyFromRecordset' of object 'Range' failed"  
 
Строка на которой все останавливается:  
.Range("A2").CopyFromRecordset rs  
 
Вот кусок кода:    
 
 
Public Sub SQLCon()  
Dim cn As New ADODB.Connection  
Dim cmd As ADODB.Command  
Dim rs As ADODB.Recordset  
Dim errErrs As ODBCErrors  
Dim errErr As ODBCError  
 
 
With Application  
   .ScreenUpdating = False  
   .DisplayAlerts = False  
End With  
Set cmd = CreateObject("ADODB.Command")  
cn.ConnectionString = "Provider=SQLOLEDB.1;Password=****;Persist Security Info=True;User ID=****;Initial Catalog=rrrrr;Data Source=llll"  
cn.ConnectionTimeout = 0  
cn.Open  
 
StartData = UserForm1.TextBox1.Text  
FinishData = UserForm1.TextBox2.Text  
SQLstr1 = "select * from dbo.Report_Day_Main" & "(" & "'" & StartData & "'" & ", " & "'" & FinishData & "'" & ")"  
With cmd  
   .ActiveConnection = cn  
   .CommandText = SQLstr1  
End With  
Set rs = cmd.Execute()  
Sheets("Лист2").Visible = xlSheetVisible  
With ThisWorkbook.Worksheets("Лист2")  
   .Name = "Отчет1"  
   .Range("A2").CopyFromRecordset rs  
   .Columns("B:B").NumberFormat = "m/d/yyyy"  
   .Columns("N:N").NumberFormat = "m/d/yyyy"  
End With  
.....  
 
С чем это может быть связано? Заранее спасибо!  
PS: MS Office 2003, win xp sp2
 
видимо в результате запроса какие то косяки, попробуйте получить результат запроса в аксесе , посмотреть, что плучилось, может быть понятнее станет
 
Спасибо, попробую.. Еще пробовал выводить содержимое recordset в Debug.Print, выводит все правильно..
 
если в debuge все нормально, значит запрос срабатывает, но что то с данными не так.  
Посмотрите на какой записи стопориться, может формат у нее кривой
 
Посмотрел.. Действительно, было две проблемы.  
1. Разный формат дат на сервере (привел к одному)  
2. Записи, на которых вываливается - на сервере nvarchar(max)- содержат много символов.. Сейчас думаю, как уменьшить.. В Excel - формат поля текст - копирую руками влезает, из Recordset - нет..
 
наверное у вас эта проблема:  
 
"Примечание. При использовании метода CopyFromRecordset следует иметь в виду, что используемые наборы записей ADO и DAO не могут содержать поля объектов OLE или массивы данных, такие как иерархические наборы записей. Если в наборе записей имеются поля таких типов, при вызове метода CopyFromRecordset произойдет сбой и появится следующее сообщение об ошибке: "  
 
http://support.microsoft.com/kb/246335/ru  
 
в принципе, записи можно попробывать обрезать leftом, в ячейку можно внести не больше 256 символов
 
Оживлю ка я, пожалуй, темку.  
Коллеги, прошу помочь! Имеем код, который из под Экселя не возвращает данные на активный лист, причем никакой ругани, - тихий игнор:    
 
Код:  
 
Dim sis As New ADODB.Connection    
sis.ConnectionString = "Provider=MSDAORA.1;Password=***;User ID=***;Data Source=***;Persist Security Info=True"    
sis.Open    
Dim ogranMax As New ADODB.Recordset    
ogranMax.CursorType = adOpenStatic    
  ogranMax.Open "SELECT ....", sis    
  ogranMax.MoveFirst    
     
Range("A1").CopyFromRecordset ogranMax    
 
ogranMax.Close    
sis.Close    
End Sub  
 
Библиотеки вроде все подключены, метод определяется. Запрос рабочий, данные в рекордсет возвращаются (проверял). Офис-2003. Явное объявление книги и листа проблему не решает. Сам запрос к БД Оракл "тянет" даты , числа, текст. Если у кого работает этот метод прошу перечислить подключенные к проекту библиотеки. Больше не знаю где и искать...
 
Вообще вам вряд ли здесь ответят, с Ораклом мало кто работает, в том числе и я. Попробую помочь исходя из некоторого знания ADO. Вообщем, если эксель не ругается и возвращает пустоту, то следовательно рекордсет пустой.  
Судя по всему вот эта команда ogranMax.MoveFirst возвращает только первую запись из набора данных, возможна она пустая. Попробуйте использовать другой синтакс запроса, пример которого приведен в первом сообщении, типа:  
 
SQLstr1 = "select * from dbo.Report_Day_Main" & "(" & "'" & StartData & "'" & ", " & "'" & FinishData & "'" & ")"  
With cmd  
.ActiveConnection = cn  
.CommandText = SQLstr1  
End With
 
Нет, с рекордсетом все в порядке, я же сразу уточнил что данные в нем лежат. Это легко проверить например:  
arr() = ogranMax.GetRows  
maks! = arr(6, 0) '-возвращает искомое значение, и оно не пустое.  
Так что установка курсора на первую запись не причем ИМХО.
 
ну если массив непустой, то тогда получить данные на лист можно так  
Range("A1:A" & UBound(arr)) = arr  
 
С CopyFromRecordset возпроизвести ситуацию не могу, поэтому причины не понимаю.
 
Ну, похоже причину нашел. Дело в неоднородности выкаченных данных. В одной записи присутствуют текстовые, числовые поля и даты. Оставив в запросе только числовые поля  CopyFromRecordset заработал. Вполне вероятно, возможны какие-то танцы с бубнами по решению проблемы в целом, но... Комизм ситуации в том, что я им все равно не воспользовался, поскольку рекордсет надо было еще транспонировать, а массив нет. ))) По времени выполнения фифти-фифти.  
Так что Артем, воспользовался вашей подсказкой, за что и благодарю. ))
 
{quote}{login=Дятел}{date=17.03.2010 04:53}{thema=}{post}Ну, похоже причину нашел. Дело в неоднородности выкаченных данных. В одной записи присутствуют текстовые, числовые поля и даты. Оставив в запросе только числовые поля  CopyFromRecordset заработал. Вполне вероятно, возможны какие-то танцы с бубнами по решению проблемы в целом, но... Комизм ситуации в том, что я им все равно не воспользовался, поскольку рекордсет надо было еще транспонировать, а массив нет. ))) По времени выполнения фифти-фифти.  
Так что Артем, воспользовался вашей подсказкой, за что и благодарю. )){/post}{/quote}  
Если поможет, то возможная причина в том ,что Excel сканирует некоторое количество строчек объекта (прописано в реестре) к которому обращается ,и по содержимому делает вывод о том какой тип данных - текс, число. Если в следующих строчках тип не совпадает, то результат запроса Null. Что делать - не знаю. Либо структуру выборки прямо прописывать.
Страницы: 1
Читают тему
Наверх