Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Ошибка при импорте данных из XML-файла  [new]
travkin
Member

Откуда:
Сообщений: 1
Окно с ошибкой в приложенном файле.

Кому лень смотреть - вот текст ошибки:

Microsoft OLE DB Provider for SQL ServerНедопустимое символьное 
значение для спецификации приведения.


Архитектура компьютера
Win7max (вчера обновился до Win10Pro - надеялся, что ошибка уйдет - не ушла)
SQL Server 2008 R2
клиентское приложение АС Поликлиника - сторонний разработчик
память 8 Гб
проц i5

Собственно, все работало до недавнего времени.
Ошибка в первый раз появилась после установки сервера Oracle с
клиентским приложением на яве и запуском сервера Глассфиш для приложений
параллельно на эту же машину (потом я это все снес, вернее сделал откат - восстановление системы),
хотя возможно они здесь и ни при чем.

Ошибка появляется только у нас. Разработчики утверждают, что у других точно такое же
программное обеспечение работает, как надо.
XML - файлы типизированы у всех одинаково, схема schetmapping.xml так же одинакова у всех.

Поэтому они предполагают, что проблема в каких-то особенностях операционной системы
и предлагают все переустановить "с нуля". Сервер SQL я уже переустанавливал с полным
сносом, Windows 7 обновил до Windows 10. Все базы работают. Клиентское приложение работает.
Модуль импорта ХМЛ не работает.

Очень не хочется переустанавливать все заново с нуля.

Возможно, проблема в провайдере SQLOLEDB, либо в парсере.
Пробовал менять connecting string - указывал вместо
provider=SQLOLEDB.1

следующее
driver={SQL Server Native Client 10.0}

та же ошибка.

разрегистрировал/перерегистрировал библиотеки msxml 3,4,6 по одной - бесполезно.

Может уважаемые спецы подскажете, где можно покопаться в системе, что покрутить,
может модифицировать как-то код процедуры.

Привожу код хранимой процедуры в базе данных до момента где возникает ошибка:

USE [BILL]
GO
/****** Object:  StoredProcedure [dbo].[suv_import_xml]    Script Date: 02/18/2016 20:15:54 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER procedure [dbo].[suv_import_xml]
	 @serverName varchar(255)
	,@userName varchar(255)
	,@password varchar(255)
	,@schemaPath varchar(1000) = 'D:\MIAC\PROGRAMS\POLYCLINIC\UTILS\schetmapping.xml'
	--,@xmlPath varchar(255)
	,@xmlContent varchar(max) -- содержимое XML-файла, который должен быть загружен
	
as begin
/*/*<VERSION>*/2/*</VERSION>*/*/

set dateformat dmy;

declare @comHandleStream int = null;
declare @comHandle int = null;
declare @iResult int = null;
declare @errorSource varchar(255) = null;
declare @errorDescription varchar(255) = null;
declare @connectionString varchar(255) = null;

---- СОЗДАНИЕ ОБЪЕКТОВ 
-- создаю объект ADODB.Stream, чтобы записать в него содержимое загружаемой XML
exec @iResult = sp_OACreate 'ADODB.Stream', @comHandleStream output;
-- проверка ошибки при создании ADODB.Stream
if (@iResult <> 0) begin
-- Error Handling 
    exec sp_OAGetErrorInfo @comHandleStream, @errorSource output, 
			@errorDescription output
	set @errorSource = @errorSource + @errorDescription;
    raiserror (@errorSource, 16, 1)
    return
end;

-- создаю объект SQLXMLBulkLoad.SQLXMLBulkLoad.4.0
exec @iResult = sp_OACreate 'SQLXMLBulkLoad.SQLXMLBulkLoad.4.0', @comHandle output
-- обрабатываю ошибку при создании SQLXMLBulkLoad.SQLXMLBulkLoad.4.0
if (@iResult <> 0) begin
-- Error Handling 
    exec sp_OAGetErrorInfo @comHandle, @errorSource output, 
			@errorDescription output
	set @errorSource = @errorSource + @errorDescription;
    raiserror (@errorSource, 16, 1)
    return
end;


---- ИНИЦИАЛИЗАЦИЯ ОБЪЕКТОВ
-- **** ADODB.Stream ****
-- открываю ADODB.Stream
exec @iResult = sp_OAMethod @comHandleStream, 'Open', null /* возвращаемое значение метода */;
-- обрабатываю ошибку открытия ADODB.Stream
if (@iResult <> 0) begin
-- Error Handling 
    exec sp_OAGetErrorInfo @comHandleStream, @errorSource output, 
			@errorDescription output
	set @errorSource = @errorSource + @errorDescription;
    raiserror (@errorSource, 16, 1)
    return
end;

-- записываю содержимое загружаемого XML-файла в поток ADODB.Stream
exec @iResult = sp_OAMethod @comHandleStream, 'WriteText', null, @xmlContent
-- обрабатываю ошибку записи содержимого XML-файла в поток ADODB.Stream
if (@iResult <> 0) begin
-- Error Handling 
    exec sp_OAGetErrorInfo @comHandleStream, @errorSource output, 
			@errorDescription output
	set @errorSource = @errorSource + @errorDescription;
    raiserror (@errorSource, 16, 1)
    return
end;

-- перехожу на начало потока ADODB.Stream
exec @iResult = sp_OASetProperty @comHandleStream, 'Position', 0;
-- обрабатываю ошибку перехода в начало потока ADODB.Stream
if (@iResult <> 0) begin
-- Error Handling 
    exec sp_OAGetErrorInfo @comHandleStream, @errorSource output, 
			@errorDescription output
	set @errorSource = @errorSource + @errorDescription;
    raiserror (@errorSource, 16, 1)
    return
end;

-- **** SQLXMLBulkLoad.SQLXMLBulkLoad.4.0 ****
-- устанавливаю строку подключения в объект SQLXMLBulkLoad.SQLXMLBulkLoad.4.0
set @connectionString = 'provider=sqloledb.1;data source=' + @serverName + ';database=BILLIN;uid=' + @userName + ';pwd=' + @password;
exec @iResult = sp_OASetProperty @comHandle, 'ConnectionString', @connectionString 
-- обрабатываю ошибку при установки строки подключения
if (@iResult <> 0) begin
-- Error Handling 
    exec sp_OAGetErrorInfo @comHandle, @errorSource output, 
			@errorDescription output
	set @errorSource = @errorSource + @errorDescription;
    raiserror (@errorSource, 16, 1)
    return
end


---- ВЫПОЛНЕНИЕ
-- выполняю импорт данных из XML-файла
exec @iResult = sp_OAMethod @comHandle, 'Execute', null, @schemaPath, @comHandleStream
-- обрабатываю ошибку при импорте XML-файла

if (@iResult <> 0) begin
-- Error Handling 
    exec sp_OAGetErrorInfo @comHandle, @errorSource output, 
		@errorDescription output
	set @errorSource = @errorSource + @errorDescription;
    raiserror (@errorSource, 16, 1)
    return
end
.......


Дальнейший код неважен, так как ошибка возникает в предпоследнем exec:
exec @iResult = sp_OAMethod @comHandle, 'Execute', null, @schemaPath, @comHandleStream


в системе установлены парсеры
Microsoft SQLXML 4.0 SP1
MSXML 4.0 SP2 Parser and SDK
зарегистрированы библиотеки msxml3.dll,msxml4.dll,msxml6.dll
Microsoft Office 2003 c поддержкой 2007

Может кто подкинет какие мысли - буду очень благодарен.

К сообщению приложен файл. Размер - 48Kb
18 фев 16, 22:16    [18838192]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при импорте данных из XML-файла  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
travkin, гуглинг подсказывает, что такая ошибка чаще всего происходит в случае некорректного приведения типов - чаще всего - даты.

Посмотрите, в каком формате у вас даты в XML указаны, какие языковые настройки установлены. Возможно, в эту сторону нужно поковырять.
20 фев 16, 12:48    [18845517]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при импорте данных из XML-файла  [new]
ГуЗы
Guest
travkin,
В схеме поменяй все типы на строку. Если загрузится - увидишь, в каком поле нарушен формат, а если опять ошибка - какая-то хрень в данных: управляющие символы или множество пробелов или еще что-то нарушающее размер поля или спецсимволы. Хотя в этом случае ошибка была бы типа : некорректный символ в 134567 строке 87098676 символ.
Правда у меня опыт импорта сугубо через SSIS.
20 фев 16, 14:47    [18846286]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при импорте данных из XML-файла  [new]
Glory
Member

Откуда:
Сообщений: 104760
travkin
Привожу код хранимой процедуры в базе данных до момента где возникает ошибка:

Вы запускали эту процедуру из SSMS ?
С такими же параметрами, как и ваше приложение ?
20 фев 16, 16:13    [18846867]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить