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

Откуда:
Сообщений: 62187
Обновляю данные да внешнем сервере через шаблоны XML. Вылезла в общем-то типичная проблема - вместо русского техста в базу ложатся кракозябры. Проблема-то типичная, а что делать в данном случае не знаю уже второй день:(

Обновляю процедурой:
declare @url_str varchar(1024)
,@object int
,@rc int
,@src varchar(255)
,@desc varchar(255)
,@TimeOut Int
,@id bigint
,@legate bit
,@executed_time char(19)
,@reason varchar(100)
,@executor varchar(100)

set @TimeOut=900000
	
declare cyr cursor
local for
select top 3 id,isnull(legate,0),convert(char(19),isnull(executed_time,0),126) as executed_time,isnull(reason,''),isnull(executor,'')
from dbo.Claims
where Status<>1
order by id desc
open cyr
fetch next from cyr into @id,@legate,@executed_time,@reason,@executor
while @@Fetch_status=0
	begin
		set @url_str = 'http://213.33.345.111/ASTK/templ/XML_ASTK_Chahges.xml?id='+cast(@id as varchar(12))+'r_status_id=3&legate='+cast(@legate as char(1))+'&executed_time='+@executed_time+'&reason='+@reason+'&executor='+@executor
		EXEC @rc = sp_OACreate 'MSXML2.ServerXMLHTTP', @object OUTPUT
		IF @rc <> 0 goto PrintError
		EXEC @rc = sp_OAMethod @object ,'setTimeouts',NULL ,5000 ,60000 , 30000, @TimeOut
		IF @rc <> 0 goto PrintError
		EXEC @rc = sp_OAMethod @object, 'Open', NULL, 'GET',@url_str, 'false'
		IF @rc <> 0 goto PrintError
		EXEC @rc = sp_OAMethod @object, 'send'
		IF @rc <> 0 goto PrintError
		--update dbo.Claims set region_status_id=3 where id=@id

		EXEC @rc = sp_OADestroy @object

		fetch next from cyr into @id,@legate,@executed_time,@reason,@executor
	end
close cyr
deallocate cyr
goto endd

PrintError:
	EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT
	select @desc
	EXEC @rc = sp_OADestroy @object

endd:
	return 0
Причём если просто набить строку в браузер, типа:
http://213.33.345.111/ASTK/templ/XML_ASTK_Chahges.xml?id=942&r_status=3&legate=1&executed_time=2011-03-12T00:00:00&reason=Напился&executor=Федя
то всё нормально обновляется, а с процедуры лезет ерунда.
Как победить-то проблему эту?
2 авг 11, 09:57    [11056705]     Ответить | Цитировать Сообщить модератору
 Re: Обновление данных через XML  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
sposad, а если поиспользовать NVARCHAR?
2 авг 11, 10:02    [11056724]     Ответить | Цитировать Сообщить модератору
 Re: Обновление данных через XML  [new]
sposad
Member

Откуда:
Сообщений: 62187
kDnZP
sposad, а если поиспользовать NVARCHAR?

один хрен, без разницы
2 авг 11, 10:03    [11056733]     Ответить | Цитировать Сообщить модератору
 Re: Обновление данных через XML  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
sposad, а если поглядеть профайлером, что приходит на сервак?
2 авг 11, 10:08    [11056759]     Ответить | Цитировать Сообщить модератору
 Re: Обновление данных через XML  [new]
sposad
Member

Откуда:
Сообщений: 62187
kDnZP
sposad, а если поглядеть профайлером, что приходит на сервак?

сейчас пойду гляну, сервер, млин, в другом здании, там сетка другая
2 авг 11, 10:12    [11056782]     Ответить | Цитировать Сообщить модератору
 Re: Обновление данных через XML  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
sposad, дык rdp жеж спасет от беготни туда-сюда.
2 авг 11, 10:18    [11056825]     Ответить | Цитировать Сообщить модератору
 Re: Обновление данных через XML  [new]
Glory
Member

Откуда:
Сообщений: 104751
sposad
kDnZP
sposad, а если поглядеть профайлером, что приходит на сервак?

сейчас пойду гляну, сервер, млин, в другом здании, там сетка другая

А Профайлер умеет работать и с удаленным сервером
2 авг 11, 10:21    [11056839]     Ответить | Цитировать Сообщить модератору
 Re: Обновление данных через XML  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Glory
sposad
пропущено...

сейчас пойду гляну, сервер, млин, в другом здании, там сетка другая

А Профайлер умеет работать и с удаленным сервером

Тут ТС походу намекает, что со своей сетки не видит SQL-сервак (ну мало ли как маршрутизация сделана), а доступ тока через сервер приложений. Вот я и предлагаю вариант - клиентскую часть поставить на сервер приложений, к нему подключиться терминалкой и глядеть))).
2 авг 11, 10:25    [11056861]     Ответить | Цитировать Сообщить модератору
 Re: Обновление данных через XML  [new]
sposad
Member

Откуда:
Сообщений: 62187
kDnZP
Glory
пропущено...

А Профайлер умеет работать и с удаленным сервером

Тут ТС походу намекает, что со своей сетки не видит SQL-сервак (ну мало ли как маршрутизация сделана), а доступ тока через сервер приложений. Вот я и предлагаю вариант - клиентскую часть поставить на сервер приложений, к нему подключиться терминалкой и глядеть))).

целевой сервер находится во внешней сети, из корпоративной сети доступ только через http запросы
2 авг 11, 10:42    [11056988]     Ответить | Цитировать Сообщить модератору
 Re: Обновление данных через XML  [new]
sposad
Member

Откуда:
Сообщений: 62187
вобщем приходит вот такая хренотень
exec sp_executesql N' SET XACT_ABORT ON
BEGIN TRAN
DECLARE @eip INT, @r__ int, @e__ int
SET @eip = 0
UPDATE dbo.Claims SET executor=@executor WHERE  ( id=@id OR ( id IS NULL AND @id IS NULL ) ) ;  SELECT @e__ = @@ERROR, @r__ = @@ROWCOUNT
 IF (@e__ != 0 OR @r__ != 1) SET @eip = 1
 IF (@r__ > 1) RAISERROR ( N''SQLOLEDB Error Description: Ambiguous update, unique identifier required  Transaction aborted '', 16, 1)
 ELSE IF (@r__ < 1) RAISERROR ( N''SQLOLEDB Error Description: Empty update, no updatable rows found  Transaction aborted '', 16, 1)

IF (@eip != 0) ROLLBACK ELSE COMMIT
SET XACT_ABORT OFF
 ',N'@id nvarchar(3),@r_status_id nvarchar(1),@legate nvarchar(1),@executed_time nvarchar(19),@reason nvarchar(22),@executor nvarchar(62)',N'942',N'3',N'1',N'2011-08-01T14:20:00',N'Обрыв в цепи',N'Комиссаров А. С.',N'1'
но млин!!! в трассе вместо русских букв коакозябры, а когда я скопировал фрагмент на флешку в текстовой файл, как видите буквы превратились в человеческие. То есть на сервер идут кракозябры
2 авг 11, 11:01    [11057155]     Ответить | Цитировать Сообщить модератору
 Re: Обновление данных через XML  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
sposad, так... Раз на сервер идут крокозяблики, то видимо нужно глядеть клиента или ваш сервер приложений. Т.е. сначала поглядеть, что и как приходит на сервер приложений, а потом думать что делать дальше. SQL сервак можно оставить в покое. Он тут не при делах.

* Я так думаю проблема преобразования UTF8 в WIN1251 или наоборот.
2 авг 11, 11:06    [11057192]     Ответить | Цитировать Сообщить модератору
 Re: Обновление данных через XML  [new]
sposad
Member

Откуда:
Сообщений: 62187
kDnZP
sposad, так... Раз на сервер идут крокозяблики, то видимо нужно глядеть клиента или ваш сервер приложений. Т.е. сначала поглядеть, что и как приходит на сервер приложений, а потом думать что делать дальше. SQL сервак можно оставить в покое. Он тут не при делах.

* Я так думаю проблема преобразования UTF8 в WIN1251 или наоборот.

я тоже так думаю, но толку то.
там сконфигурирован IIS под виртуальную папку, а в ней лежит шаблон

<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
	<updg:header> 
		<updg:param name="id"/> 
		<updg:param name="r_status_id"/>
 		<updg:param name="legate"/>
		<updg:param name="executed_time"/>
		<updg:param name="reason"/>
		<updg:param name="executor"/>
            </updg:header> 
<updg:sync>
	<updg:before>
	   <dbo.Claims id="$id"/>
	</updg:before>
	<updg:after>
	   <dbo.Claims r_status_id="$r_status_id"/>
	</updg:after>
</updg:sync>
<updg:sync>
	<updg:before>
	   <dbo.Claims id="$id"/>
	</updg:before>
	<updg:after>
	   <dbo.Claims legate="$legate"/>
	</updg:after>
</updg:sync>
<updg:sync>
	<updg:before>
	   <dbo.Claims id="$id"/>
	</updg:before>
	<updg:after>
	   <dbo.Claims executed_time="$executed_time"/>
	</updg:after>
</updg:sync>
<updg:sync>
	<updg:before>
	   <dbo.Claims id="$id"/>
	</updg:before>
	<updg:after>
	   <dbo.Claims reason="$reason"/>
	</updg:after>
</updg:sync>
<updg:sync>
	<updg:before>
	   <dbo.Claims id="$id"/>
	</updg:before>
	<updg:after>
	   <dbo.Claims executor="$executor"/>
	</updg:after>
</updg:sync>
</ROOT>

Больше там нет ничего, в самих настройках виртуальной папки я не нашёл ничего на эту тему
2 авг 11, 11:29    [11057399]     Ответить | Цитировать Сообщить модератору
 Re: Обновление данных через XML  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
sposad, честно говоря я таким способом не пользовался...
Попробуйте почитать тут:
http://msdn.microsoft.com/en-us/library/aa258669(v=sql.80).aspx
http://msdn.microsoft.com/ru-ru/library/ms172697.aspx
Может нужно еще добаваить XSD схему.
2 авг 11, 11:38    [11057483]     Ответить | Цитировать Сообщить модератору
 Re: Обновление данных через XML  [new]
sposad
Member

Откуда:
Сообщений: 62187
kDnZP
sposad, честно говоря я таким способом не пользовался...
Попробуйте почитать тут:
http://msdn.microsoft.com/en-us/library/aa258669(v=sql.80).aspx
http://msdn.microsoft.com/ru-ru/library/ms172697.aspx
Может нужно еще добаваить XSD схему.

я это читал, но у меня сомнения на тему того, в тему ли это:) Ведь если поразмыслить вообще по жизни, то имеем следующее:

1. Формируем строку в процедуре
2. Отправляем её на виртуальную папку другого сервера
3. Сервер получает её в виртуальную папку, отрабатывает шаблон
4. Шаблон модифицирует таблицу на сервере.

Что мы знаем:
в процедуре формируется строка нормально, 1 шаг - ок
шаблон суёт в таблицу уже изурордованные данные (4), то есть если смотреть выше, то можно грешить на шаг 3. Но ведь если ту же строку посылать через броузер, то всё работает нормально, т.е. 3 вроде ни при чём, остаётся 2??
2 авг 11, 12:18    [11057909]     Ответить | Цитировать Сообщить модератору
 Re: Обновление данных через XML  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
sposad, вы уверены, что браузер не выполняет преобразований/кодирования строки? Я не совсем в этом уверен... Попробуйте передать невалидные для XML данные, без кодирования через браузер. Ну типа что-то типа такого: "&<>' ". Что при этом произойдет?
2 авг 11, 12:27    [11057988]     Ответить | Цитировать Сообщить модератору
 Re: Обновление данных через XML  [new]
sposad
Member

Откуда:
Сообщений: 62187
kDnZP
sposad, вы уверены, что браузер не выполняет преобразований/кодирования строки? Я не совсем в этом уверен... Попробуйте передать невалидные для XML данные, без кодирования через браузер. Ну типа что-то типа такого: "&<>' ". Что при этом произойдет?

преобразует, конечно, я как-то не подумавши, без кодирования с такими символами строка вообще не катит
2 авг 11, 13:20    [11058413]     Ответить | Цитировать Сообщить модератору
 Re: Обновление данных через XML  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
ПТ как вариант глянь
2 авг 11, 14:59    [11059253]     Ответить | Цитировать Сообщить модератору
 Re: Обновление данных через XML  [new]
sposad
Member

Откуда:
Сообщений: 62187
Maxx
ПТ как вариант глянь

смотрю, куда ж без него:)
2 авг 11, 15:35    [11059579]     Ответить | Цитировать Сообщить модератору
 Re: Обновление данных через XML  [new]
Kasper
Member

Откуда: Брянск
Сообщений: 124
sposad,

автор
* Я так думаю проблема преобразования UTF8 в WIN1251 или наоборот.
Попробуйте setOption Method
3 авг 11, 08:32    [11062408]     Ответить | Цитировать Сообщить модератору
 Re: Обновление данных через XML  [new]
sposad
Member

Откуда:
Сообщений: 62187
Kasper
sposad,

автор
* Я так думаю проблема преобразования UTF8 в WIN1251 или наоборот.
Попробуйте setOption Method

попробую, мне уже пофиг, я уже только ещё не делал своего протокола передачи кирилицы латиницей, хотя уже склоняюсь к этому
3 авг 11, 08:50    [11062463]     Ответить | Цитировать Сообщить модератору
 Re: Обновление данных через XML  [new]
sposad
Member

Откуда:
Сообщений: 62187
Kasper
sposad,

автор
* Я так думаю проблема преобразования UTF8 в WIN1251 или наоборот.
Попробуйте setOption Method

бесполезно:(
3 авг 11, 11:45    [11063537]     Ответить | Цитировать Сообщить модератору
 Re: Обновление данных через XML  [new]
michael R
Member

Откуда: из-за границы
Сообщений: 2113
если русский текст преобразовывать в Unicode-символы ?
3 авг 11, 13:24    [11064239]     Ответить | Цитировать Сообщить модератору
 Re: Обновление данных через XML  [new]
sposad
Member

Откуда:
Сообщений: 62187
кажется сборол я это проблему, подсказкой с ПТ, на которую, как обычно обращаешь внимание после всего. Получилось перекодированием русского текста в формат URL с помощью функции, снятой с буржуйского форума. Надеюсь не будет некорректным если я приведу код, там указан и автор и ссылка. Перекодирует немного криво в смысле замены регистра некоторых букв в некоторых случаях, но по сравнению с кракозябрами это сказка:)

alter FUNCTION [dbo].[URLEncode] 
(@decodedString VARCHAR(4000))
RETURNS VARCHAR(4000)
AS
BEGIN
/*******************************************************************************************************
* dbo.URLEncode 
* Source: http://www.sqlservercentral.com/scripts/URL/62679/
* Creator: Robert Cary
* Date: 03/18/2008
*
* Notes: 
* 
*
* Usage:
* select dbo.URLEncode('K8%/fwO3L mEQ*.}')
* select dbo.URLEncode('http://www.sqlservercentral.com/scripts/URL/62679/')
*
* Modifications: 
* Developer Name Date Brief description
* ------------------- ----------- ------------------------------------------------------------
* 
* Alzowze 21-Jul-09 Modifed to select from derived table.
* No need to create/populate table numbers. 
* Used Union All, to ensure entire string gets encoded
* if LEN(@decodedString) = Maximum of 4000 
********************************************************************************************************/

DECLARE @encodedString VARCHAR(4000)

IF @decodedString LIKE '%[^a-zA-Z0-9*-.!_]%' ESCAPE '!'
BEGIN
SELECT @encodedString = REPLACE(
COALESCE(@encodedString, @decodedString),
SUBSTRING(@decodedString,num,1),
'%' + SUBSTRING(master.dbo.fn_varbintohexstr(CONVERT(VARBINARY(1),ASCII(SUBSTRING(@decodedString,num,1)))),3,3))
FROM (
SELECT ROW_NUMBER() OVER(ORDER BY number DESC) AS num
FROM master.dbo.spt_values
UNION All
SELECT ROW_NUMBER() OVER(ORDER BY number DESC) AS num
FROM master.dbo.spt_values
) AS num

WHERE num BETWEEN 1 AND LEN(@decodedString) AND SUBSTRING(@decodedString,num,1) like '[^a-zA-Z0-9*-.!_]' ESCAPE '!'


END
ELSE
BEGIN
SELECT @encodedString = @decodedString 
END

RETURN @encodedString

END
GO 
Вобщем спасибо Роберту, самому писать было лень потому как результат был непредсказуем, а время потеряно.
Но! Если кому удастся состряпать XML updategram, который позволит обходиться без этой перекодировки - с меня 1000 руб. по яндексу, честно ...
3 авг 11, 13:57    [11064440]     Ответить | Цитировать Сообщить модератору
 Re: Обновление данных через XML  [new]
michael R
Member

Откуда: из-за границы
Сообщений: 2113
фигню написал
не Unicode а Encoding
nvarchar тоже
3 авг 11, 13:59    [11064449]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить