[]
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
şö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.
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"?>',''),'>','>'),'<','<')
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
/***********************************/
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"?>',''),'>','>'),'<','<')
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.
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;
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)
- bir bucuk adana (26.07.15 15:54:56)
1