Aşağıda data.xml dosyasındaki verileri SQL sorgusu kullanarak SQL database’a aktarıyoruz.
XML dosyasının içeriği;
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Try
Dim strInsertStmt, asset_name, asset_rfid As String
Dim dbConn As New SqlClient.SqlConnection("SERVER=localhost;UID=sa;PWD=;DATABASE=A-data;")
Dim sqlComm As New SqlClient.SqlCommand()
dbConn.Open()
If dbConn.State Then
sqlComm.Connection = dbConn
Dim xmlDoc As New Xml.XmlDocument()
Dim dataNodes As Xml.XmlNodeList
Dim aNode As Xml.XmlNode
xmlDoc.Load(c:\temp\data.xml)
dataNodes = xmlDoc.SelectNodes("/aa/bb")
For Each aNode In dataNodes
Try
asset_name = aNode.ChildNodes.Item(0).InnerText
asset_rfid = aNode.ChildNodes.Item(1).InnerText
strInsertStmt = "INSERT INTO a-table(Asset_name, Asset_rfid) VALUES ('"
strInsertStmt += asset_name + "','" + asset_rfid + "')"
sqlComm.CommandText = strInsertStmt
sqlComm.ExecuteNonQuery()
Catch e2 As Exception
MsgBox("Error: " & e2.Message)
End Try
Next
dbConn.Close()
Else : MsgBox("Database bağlantısı kurulamadı...")
End If
Catch e1 As Exception
MsgBox("Error: " & e1.Message)
End Try
End Sub
Bilgiler SQL servera aktarıldı.
Umarım işinize yarar.
Merhaba
XML > SQL Servera veri aktarımı: vb.net 26 bu kod benim için çok yararlı oldu.Ama .net 2005 de oluşturmak istediğimde bir c: dosya yolunda çift tırnak ekledim çalıştı ama 2 kere
Error:Line 1:Incorrect syntax near ‘*, hatasını verdi sebebini bulamadım sebebi ne olabilir .Acaba verilerin data tipleri ile ilgilimi databasede text olarak açtım
Cevap verirseniz sevinirim.problem nerde acaba
İyi çalışmalar
Sanırım bu (Error:Line 1:Incorrect syntax near ‘*) hata strInsertStmt değişkenine insert into syntax’ını eklerken oluyor. Yani en mantıklı yorum bu. Bu değişkene INSERT INTO ile başlayan satılardan sonra XML dosyasından veri ekledğiniz zaman, eğer içerisinde tırnak işareti bulunan bir veri geliyorsa problem çıkabilir.
yani;
Monitor Fiyat
19’inc 100
17inc 85
birinci satırda gelen ‘ işareti değişkene eklenirken hata verecektir. Bunu ayıklamanız gerekir. Replace komutu kullanarak ayıklayabilirsiniz.
Merhaba evet tırnak işaretine takılmışım.tşk.
Bu örneğinizde birşey daha sormak istiyorum
asset_rfid değişkenini integer tanımlarsam aşağıdaki komut nasıl olmalı
asset_rfid = aNode.ChildNodes.Item(1).InnerText ve strInsertStmt deki alanlarda ne gibi bir değişiklik yapmam gerekir.
İyi çalışmalar
Tekrar merhaba birşey daha sormak istiyorum cevaplıyabilirseniz sevinirim.
Böyle bir xml nodeları olan bir xml dosyasını açarken aşağıdaki gibi gösterdim ama olmadı.Datanodesu nasıl belirtmeliyim. yada nerelre dikkat etmeliyim
dataNodes = xmlDoc.SelectNodes(“//.”)
Aslında
Aşağıdaki xml’i gönderdiğim dosyayı sizin örneğinize uyarlamaya çalışıyorum
——————–
2050198
ELİF
Niyazi Sarıkaya
Şehit Süleyman bey mah. No:42
BALIKESİR
BANDIRMA
0212/444444
14/08/2008
35511
Kargo
0
İç Tül
80101476
80101476
1
TOP
6.00
86.94
————————–
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Try
Dim strInsertStmt As String
Dim FIRMA, FIRMAYETKILI, SEVKADRES, IL, ILCE, TELEFON, SIPARISNO, SIPARISNOTU, GONDERIMSEKLI, URUNCINSI, URUNKODU, URUNADI, BIRIM As String
Dim FIRMACARIKOD As Integer
Dim SIPARISTARIHI As Date
Dim KESIM As Integer
Dim ADET, METRE, TUTAR As Decimal
Dim dbConn As New SqlClient.SqlConnection(“SERVER=localhost;UID=sa;PWD=admin1;DATABASE=ADATA;”)
Dim sqlComm As New SqlClient.SqlCommand()
dbConn.Open()
If dbConn.State Then
sqlComm.Connection = dbConn
Dim xmlDoc As New Xml.XmlDocument()
Dim dataNodes As Xml.XmlNodeList
Dim aNode As Xml.XmlNode
xmlDoc.Load(“c:\XMLSIPARISPROJE\XMLDATA\35511-Kesimsiz.xml”)
‘dataNodes = xmlDoc.SelectNodes(“//SIPARIS/FIRMACARIKOD/FIRMA/FIRMAYETKILI/SEVKADRES/IL/ILCE/TELEFON/SIPARISTARIHI/SIPARISNO/SIPARISNOTU/GONDERIMSEKLI/KESIM/URUNCINSI/URUNKODU/URUNADI/ADET/BIRIM/METRE/TUTAR/”)
‘dataNodes = xmlDoc.SelectNodes(“//SIPARIS/*”)
dataNodes = xmlDoc.SelectNodes(“//.”)
‘dataNodes1 = xmlDoc.SelectNodes(“//SIPARIS/SIPARISKALEMLERI/SIPARISKALEMI/URUNCINSI/URUNKODU/URUNADI/ADET/BIRIM/METRE/TUTAR/”)
For Each aNode In dataNodes
Try
FIRMACARIKOD = aNode.ChildNodes.Item(0).InnerText
FIRMA = aNode.ChildNodes.Item(1).InnerText
FIRMAYETKILI = aNode.ChildNodes.Item(2).InnerText
SEVKADRES = aNode.ChildNodes.Item(3).InnerText
IL = aNode.ChildNodes.Item(4).InnerText
ILCE = aNode.ChildNodes.Item(5).InnerText
TELEFON = aNode.ChildNodes.Item(6).InnerText
SIPARISTARIHI = aNode.ChildNodes.Item(7).InnerText
SIPARISNO = aNode.ChildNodes.Item(8).InnerText
SIPARISNOTU = aNode.ChildNodes.Item(9).InnerText
GONDERIMSEKLI = aNode.ChildNodes.Item(10).InnerText
KESIM = aNode.ChildNodes.Item(11).InnerText
URUNCINSI = aNode.ChildNodes.Item(12).InnerText
URUNKODU = aNode.ChildNodes.Item(13).InnerText
URUNADI = aNode.ChildNodes.Item(14).InnerText
ADET = aNode.ChildNodes.Item(15).InnerText
BIRIM = aNode.ChildNodes.Item(16).InnerText
METRE = aNode.ChildNodes.Item(17).InnerText
TUTAR = aNode.ChildNodes.Item(18).InnerText
MsgBox(FIRMACARIKOD)
strInsertStmt = “INSERT INTO XMLSIPARIS (FIRMACARIKOD, FIRMA,FIRMAYETKILI, SEVKADRES, IL, ILCE, TELEFON, SIPARISTARIHI, SIPARISNO, SIPARISNOTU, GONDERIMSEKLI, KESIM, URUNCINSI, URUNKODU, URUNADI, ADET, BIRIM, METRE, TUTAR) VALUES (‘”
strInsertStmt += FIRMACARIKOD + “‘,'” + FIRMA + “‘,'” + FIRMAYETKILI + “‘,'” + SEVKADRES + “‘,'” + IL + “‘,'” + ILCE + “‘,'” + TELEFON + “‘,'” + ” SIPARISTARIHI ” + “‘,'” + SIPARISNO + “‘,'” + SIPARISNOTU + “‘,'” + GONDERIMSEKLI + “‘,'” + KESIM + “‘,'” + URUNCINSI + “‘,'” + URUNKODU + “‘,'” + URUNADI + “‘,'” + ADET + “‘,'” + BIRIM + “‘,'” + METRE + “‘,'” + TUTAR + “‘)”
sqlComm.CommandText = strInsertStmt
sqlComm.ExecuteNonQuery()
Catch e2 As Exception
MsgBox(“Error: ” & e2.Message)
End Try
Next
dbConn.Close()
Else : MsgBox(“Database bağlantısı kurulamadı…”)
End If
Catch e1 As Exception
MsgBox(“Error: ” & e1.Message)
End Try
End Sub
Böyle yaptım ama bir sorun var .String dışındaki değerlerde hata veriyor ve sql e hiçbir kayıt atmıyor.
yukarda gönderdiğim xml de düğümleri görünmüyor:Baştaki küçüktür işaretini kaldırıp ,görmeniz için göndermek istedim
SIPARIS
FIRMACARIKOD>2050198ELİFNiyazi SarıkayaŞehit Süleyman bey mah.No:42BALIKESİRBANDIRMA0212/44444414/08/2008
SIPARISNO>35511
SIPARISNOTU>
GONDERIMSEKLI>Kargo
KESIM>0
SIPARISKALEMLERI>
SIPARISKALEMI>
URUNCINSI>İç Tül
URUNKODU>80101476
URUNADI>80101476
ADET>1
BIRIM>TOP
METRE>6.00
TUTAR>86.94
/SIPARISKALEMI>
/SIPARISKALEMLERI>
/SIPARIS>
INSERT INTO syntax’ı yazarken integer değişkenlerin başına ve sonuna tek tırnak yazılmaz. ”’,”’ olarak kullanmamalısın.
örneğin INSERT INTO ya gelecek değerler sırasıyla Ali ve 23 olsun. O halde;
xx=”Ali” ve yy=23 kabul edelim,
strInsertStmt = “INSERT INTO XMLSIPARIS (isim,yas) VALUES (‘” + xx + “‘,” + yy + “)”
gibi olur, Tırnak işaretlerinin sayısına dikkat edersen, farklı olduğunu görebilirsin.
asset_rfid = aNode.ChildNodes.Item(1).InnerText
burada değişkene yüklerken string ve integer olup olmadığı önemli değil. INSERT INTO syntx’ı oluşturuken kullandığın tırnak işaretleriyle, database’e doğru tür veriyi aldırabilirsin.
Merhaba
Söylediğiniz gibi INSERT INTO kısmını aşağıdaki gibi yaptım
strInsertStmt = “INSERT INTO XMLSIPARIS (FIRMACARIKOD, FIRMA,FIRMAYETKILI, SEVKADRES, IL, ILCE, TELEFON, SIPARISTARIHI, SIPARISNO, SIPARISNOTU, GONDERIMSEKLI, KESIM, URUNCINSI, URUNKODU, URUNADI, ADET, BIRIM, METRE, TUTAR) VALUES (”
strInsertStmt += FIRMACARIKOD + “,'” + FIRMA + “‘,'” + FIRMAYETKILI + “‘,'” + SEVKADRES + “‘,'” + IL + “‘,'” + ILCE + “‘,'” + TELEFON + “‘,'” + ” SIPARISTARIHI ” + “‘,'” + SIPARISNO + “‘,'” + SIPARISNOTU + “‘,'” + GONDERIMSEKLI + “‘,” + KESIM + “,'” + URUNCINSI + “‘,'” + URUNKODU + “‘,'” + URUNADI + “‘,” + ADET + “,'” + BIRIM + “‘,” + METRE + “,” + TUTAR + “)”
ve
dataNodes = xmlDoc.SelectNodes(“//SIPARIS/*”) olarak programı çalıştırdığımda
Error:Object reference not set to an instance of an object hatası veriyor.Ok tıkladıktan sonra ikinci alan olan Firma alanını xmlden okuyor.
Error:Conversion from string “ELİF” to type ‘İnteger’ is not valid.
bu hatayı string alanların hepsinde alıyorum.integer alanlarda da Error:Object reference not set to an instance of an object bu hatayı veriyor.
Xml sayfasında endışda sipariş tagı var onun altında tek tek taglar ve sonra blok halinde SIPARISKALEMLERI>
SIPARISKALEMI> tagları içinde tek taglar ve ensondada SIPARISKALEMLERI>
SIPARISKALEMI>
SIPARIS> ŞEKLİNDE taglar kapanıyor.Sipariş kalemi tagına geldimi alttaki tagları tek bir satır şeklinde almış gösteriyor ve program bitiyor,database e kayıt yok yine
Programda
dataNodes = xmlDoc.SelectNodes(“//SIPARIS/*”) eksikmi yazıyorum.Onun yerine ne yazmalıyım.
Yukarda gönderdiğim yazıda kafana takılan birşey daha var.
VALUES (”
strInsertStmt += FIRMACARIKOD + “,
Söylediğiniz gibi integerda ‘ tek tırnakları kaldırdım ama yukarda yadzığım kısımda strInsertStmt string,FIRMACARIKOD integer ben bu kısımda tek tırneğı kaldırdım burdan kaynaklı sorunmu yaşıyorum ama bu alana sonra ‘ tırnak yerleştirip çalıştırdım yine aynı hatayı alıyorum
Sorun veritabanında olabilir. Veritabanındaki alanların tiplerini kontrol edin. Ayrıca yukarıda tarih alanı + ” SIPARISTARIHI ” + yanlış bir sözdizimi olmuş.
Programda
dataNodes = xmlDoc.SelectNodes(”//SIPARIS/*”) eksikmi yazıyorum.Onun yerine ne yazmalıyım.
Merhaba birtek datanodes kısmı kaldı.Aşağıda örnek göndereceğim xml’in
dataNodes = “/SIPARIS/SIPARISKALEMLERI/SIPARISKALEMI”)kısmını nasıl tanımlamalıyım.Böyle yaptığımda
Error:Object reference not set to an instance of an object
Veri tabanındaki ve programdaki bütün değişkenleri string yaptım,xml’i tek sipariş noduna düşürdüğümde sqle atıyorum Ama içinde alta doğru SIPARISKALEMLERI ve SIPARISKALEMI şeklinde 2 node daha var.datanodes u nasıl tanımlamalıyım
SIPARIS>
FIRMACARIKOD>2050198ELİF NevzatŞehit Süleyman . No:10ANKARABANDIRMA0266/755603014/08/200835511XXKargo0
SIPARISKALEMI>
URUNCINSI>İç KESİM80101476801014761TOP6.0086.94
/SIPARISKALEMLERI>
/SIPARIS>
SIPARIS>
FIRMACARIKOD>2050198
FIRMA>ELİF
FIRMAYETKILI>Nevzat
SEVKADRES>Şehit MAH
IL>BALIKESİR
ILCE>BANDIRMA
TELEFON>0215/7183030
SIPARISTARIHI>14/08/2008
SIPARISNO>35511
SIPARISNOTU>XX
GONDERIMSEKLI>Kargo
KESIM>0
SIPARISKALEMLERI>
SIPARISKALEMI>
URUNCINSI>İç Kesim
URUNKODU>80101476
URUNADI>80101476
ADET>1
BIRIM>TOP
METRE>6.00
TUTAR>86.94
/SIPARISKALEMI>
/SIPARISKALEMLERI>
/SIPARIS>
Sanırım çalıştığın .XML dosyasını yapısındada bir problem var. Aldığın son hata bundan kaynaklanıyor olabilir. Mesela ile başlayan node, kapanmamış. açtığın he nodu kapatmalısın. .XML dosyanı yukarıda verdiğim örnek .XML dosyasıyla karşılaştırmanda fayda var.
Merhaba
Siz örneğinizde dataNodes = xmlDoc.SelectNodes(”/aa/bb”)
böyle tanımlamışsınız.Benim xml dosyamda
SIPARIS node u var içinde içinde firma bilgilerinin olduğu tablar var.Sonra
SIPARISKALEMLERI nodu var.hemen altında SİPARİŞ KALEMİ nodu var.Bu nodun içinde sipariş detayları var.Her bir sipariş kaleminin detayının bitiminde SİPARİŞ KALEMİ nodu kapanıyor .Sipariş kalemleri bittiğinde SIPARISKALEMLERI nodu kapanıyor.Ensonda SIPARIS nodu kapanıyor.Böyle bir xml i okurken dataNodes = xmlDoc.SelectNodes(”/aa/bb”)
kısmını nasıl tanımlamalıyım
FIRMACARIKOD>2050198
FIRMA>ELİF
FIRMAYETKILI>Nevzat
SEVKADRES>Şehit MAH
IL>BALIKESİR
ILCE>BANDIRMA
TELEFON>0215/7183030
SIPARISTARIHI>14/08/2008
SIPARISNO>35511
SIPARISNOTU>XX
GONDERIMSEKLI>Kargo
KESIM>0
Yukarıdaki node’ları çıkararak deneyin bakalım. Sanırım sorun, .xml dosyasında, tekrarlayan node’ların dışında tutulan sabit node’ların oluşu. Sizin xml dosyanızda yukarıdaki başlık bilgileri statik, Sipariskalemleri tekrarlayan node olarak gözüküyor. Söylediğim gibi deneyin bakalım istediiniz noda ulaşabilecek misiniz.
Xmli böyle yaptığımda bilgilere ulaşıyorum.Ama sipariş kalemleri gibi tekrarlayan nodeları nasıl yapmalıyım.
Birde sizin örneğinizde ki gibi xml den veriyi okuduktan sonra,örneğin asset_name değişkenini aynı databasede farklı bir tablodaki bir alanla karşılaştırıp orda bulduğum bir sonucu asset_rfid değişkenine atıp strInsertStmt stringini oluşturmak istiyorum.Bunu nasıl yapabilirim küçük bir örnek verebilirmisiniz.yardımlarınız için tşk