[]

DB den istek göndererek web servisten XML çekme

duyurunun teknik sakinleri,

şöyle bir durum var,

sql server da bir prosedür oluşturup bunu web servise yönlendireceğiz,(bu web servis canlı bir ortamdan besleniyor) bunun sonucunda xml dönecek ve o xml i parse edip DB deki tablolara aktaracağız.

daha önce browser da hava durumu servislerinden xml çektim ama bu durum biraz karışık. daha önce yapan eden var mıdır?

şöyle iki örnek buldum ama yapamadım;
www.vishalseth.com

forums.asp.net

 
Prosedür içinde xml okuma için kodları kullanırsın. Sonrasında içeriye yazarsın. Bunun için direk xml e ulaşabiliyor olmak Lazım.
Akşam kod olarak belli bir dizinden çekip içeri alan kodu gönderebilirim. Xml olarak gelen Çağrı kayıtlarını alıyorum ben bu şekilde.

  • rhan  (20.07.15 19:25:21) 
hava durumunu aşağıdaki kodla okuyabiliyorum;

Declare @Object as Int;
DECLARE @handle INT
DECLARE @PrepareXmlStatus INT
Declare @ResponseText as Varchar(8000);
Declare @ResponseText_XML as XML;
Exec sp_OACreate 'MSXML2.XMLHTTP', @Object OUT;
Exec sp_OAMethod @Object, 'open', NULL, 'post','api.openweathermap.org 'false'
Exec sp_OAMethod @Object, 'send'
Exec sp_OAMethod @Object, 'responseText', @ResponseText OUTPUT
set @ResponseText_XML = REPLACE(REPLACE(REPLACE(@ResponseText,
'<?xml version="1.0" encoding="utf-8"?>',''),'&gt;','>'),'&lt;','<')



EXEC @PrepareXmlStatus= sp_xml_preparedocument @handle OUTPUT, @ResponseText_XML
SELECT @ResponseText


SELECT CONVERT(VARCHAR(10),GETDATE(),120) AS TARIH,
ID,
SEHIR,
ROUND((SICAKLIK_KELVIN-273.15),0) AS SICAKLIK_CELCIUS,
RUZGAR_YONU,
CONCAT(RUZGAR_HIZI,'m/s') AS RUZGAR_HIZI,
RUZGAR_TIPI,
HAVA_TIPI,
CONCAT(NEM_ORANI,'%') AS NEMLILIK --INTO WEATHER_CONDITION
FROM(
SELECT *
FROM OPENXML(@handle, '/current/city',1)
WITH (
ID VARCHAR(10) '../city/@id',
SEHIR VARCHAR(10) '../city/@name',
SICAKLIK_KELVIN FLOAT '../temperature/@value',
RUZGAR_YONU VARCHAR(20) '../wind/direction/@name',
RUZGAR_HIZI VARCHAR(5) '../wind/speed/@value',
RUZGAR_TIPI VARCHAR(20) '../wind/speed/@name',
HAVA_TIPI VARCHAR(20) '../weather/@value',
GUN_DOGUS VARCHAR(40) '../city/sun/@rise',
GUN_BATIS VARCHAR(40) '../city/sun/@set',
NEM_ORANI VARCHAR(10) '../humidity/@value'
)
--Exec sp_OADestroy @Object
--EXEC sp_xml_removedocument @handle
)ABC



şimdiki webserviste login olma durumu da var, bu servis 3 bileşene bakıyor, örneğin bir satışçı için randevu adetleri, sattığı ürünler ve ödemesini aldığı ürünler gibi...

bu arada chrome un Advanced Rest Client eklentisinde çalışıp xml konudunu dönüyor.

verdiğim ilk link kırıkmış onu düzelttim (www.vishalseth.com), prosedürü onun gibi oluşturdum ama alt taraftaki @requestbody değişkenine ne yazacağımı bilemedim. bişeler denedim ama invalid variable hatası alıyorum.
soapenv:Envelope xmlns:soapenv... uzantılı bir kod bulamadım.

bir de şöyle denedim, fakat bunu çalıştırınca @responseText null geliyor.

/***********************************/
Declare @Object as Int;
Declare @ResponseText as Varchar(8000);
Declare @Body as varchar(8000) =
'<Login>
<UserName>OBIWebService</UserName>
<UserPassword>OBIWebServicePassWord</UserPassword>
</Login>'

Exec sp_OACreate 'MSXML2.ServerXMLHTTP', @Object OUT;
EXEC sp_OAMethod @Object, 'open', NULL, 'post','myhostname 'false'
Exec sp_OAMethod @Object, 'setRequestHeader', null, 'Content-Type', 'text/xml'
Exec sp_OAMethod @Object, 'send', null, @body

Exec sp_OAMethod @Object, 'responseText', @ResponseText OUTPUT
Select @ResponseText

Exec sp_OADestroy @Object
/***********************************/
  • bir bucuk adana  (20.07.15 20:17:29) 
stackoverflow.com

Exec sp_OAMethod @Object, 'send'
bu prosedüre kullanıcı adı falan göndermek lazım sanırım.
  • rhan  (21.07.15 13:50:29) 
'D:\temp.xml'; adresine dosyayı indirip sonra okuyor. webservise müdahale edebiliyorsan, kullanıcı, plasiyer neyse bunları gönderip karşılığında çıkan xmli okuyabilirsin.

Tcmb için bir çalışma yaptım benim istediğimi görüyor.

-- RSS FEED
DECLARE @docHandle INT;
DECLARE @xmlData XML;
DECLARE @URL NVARCHAR(255);
DECLARE @file NVARCHAR(255);
DECLARE @cmd NVARCHAR(255);
DECLARE @sql NVARCHAR(255);
DECLARE @tXML TABLE(data XML);

SET @URL = '‪www.tcmb.gov.tr
SET @URL = REPLACE(@URL, '?','')
SET @file = 'D:\temp.xml';

-- Downloading the data
SET @cmd = 'C:\Windows\System32\WindowsPowerShell\v1.0\powershell (new-object System.Net.WebClient).DownloadFile( ''' + @URL + ''',''' + @file + ''' )'
EXEC master.dbo.xp_cmdshell @cmd, no_output

-- Loading the Downloaded File into the XML variable
SET @sql = 'SELECT BulkColumn FROM OPENROWSET( BULK ''' + @file + ''', SINGLE_BLOB ) AS a'
INSERT @tXML EXEC(@sql);
SELECT @xmlData = data from @tXML

-- Preparing the Relational Table from the XML variable
EXEC sp_xml_preparedocument @docHandle OUTPUT, @xmlData;

--INSERT INTO NETSIS..DOVIZ
--(TARIH, SIRA, DOV_ALIS, DOV_SATIS, EFF_ALIS, EFF_SATIS)
SELECT *
--CONVERT(nvarchar, cast(Tarihi as datetime),102) as Tarih, NK.SIRA
--, TCMB.Alis, TCMB.Satis
--, TCMB.EfAlis, TCMB.EfSatis
FROM OPENXML(@docHandle, N'//Tarih_Date/Currency')
WITH (
Tarihi VARCHAR(100) '../@Date'
,CurrencyCode VARCHAR(10) '@CurrencyCode'
,CrossOrder VARCHAR(10) '@CrossOrder'
,Unit VARCHAR(100) 'Unit'
,Isim VARCHAR(100) 'Isim'
,Alis VARCHAR(100) 'ForexBuying'
,Satis VARCHAR(100) 'ForexSelling'
,EfAlis VARCHAR(100) 'BanknoteBuying'
,EfSatis VARCHAR(100) 'BanknoteSelling'
) AS TCMB
-- LEFT OUTER JOIN NETSIS..KUR NK ON
-- (CASE WHEN NK.NETSISSIRA = 1 THEN 0 ELSE NULL END) = TCMB.CrossOrder
-- OR (CASE WHEN NK.NETSISSIRA = 20 THEN 9 ELSE NULL END) = TCMB.CrossOrder
--where TCMB.CurrencyCode <> 'XDR'
--AND NK.SIRA IS NOT NULL
;

EXEC sp_xml_removedocument @docHandle;
  • rhan  (21.07.15 15:06:37) 
@rhan,

durumu linkteki gibi çözdük; teşekkür ederim yardımın için.

code.msdn.microsoft.com
  • bir bucuk adana  (26.07.15 15:54:56) 
1
buraya yazılanların hakları Sir Anthony Hopkins'e aittir.
yazan eden compumaster, ilgilenen eden fader
modere edenler angelus, Artibir, aychovsky, baba jo, basond, compumaster, deckard, duyulmasi gerektigi kadar, fader, fraise, groove salad, kahvegibi, kaymaktutmayansicaksut, kibritsuyu, monstro, pandispanya, robin, ron dennis
bu sitede yazılanların hiçbiri doğru değildir. site içeriği küçükler için sakıncalı olabilir. yazılardan yazarları sorumludur. kaynak göstermeden alıntılanamaz. devlet tarafından atanmış bir kurumun internet üzerinde kimin hangi bilgiye ulaşıp ulaşamayacağına karar vermesi insan haklarına aykırıdır. web siteleri kullanıcıların istekleri doğrultusunda bağlandıkları yerlerdir. kullanıcılar isterlerse bir web sitesine bağlanmayabilirler. bu güçleri ve imkanları mevcuttur. bir kullanıcı bir siteye bağlanmak istiyorsa bu onun tercihi ve hakkıdır. bağlanmak istemiyorsa bu yine onun tercihi ve hakkıdır. halkın kendisine hizmet etmesi için görevlendirdiği kurumlar hadlerini aşıp halka neye ulaşıp ulaşmayacağını bilmeyen cahil cühela muamelesi edemezler. ebeveynlerin çocuklarını sakıncalı içeriklerden koruması için çok sayıda bedava ve ücretli yazılım mevcuttur. bu yazılımlar bir web tarayıcısını kullanmaktan daha karmaşık teknik bilgi gerektirmemektedir. devletin milletini küçük düşürmesi ve ebleh yerine koyması yasaktır. Skimlinks ile linkler üzerinden yönlendirme payı alınmaktadır.