Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 2 odgovora
  • 1.845 pregleda

Najnovija ↓

Iz datatable u xml, pa xml u bazu 10.08.2009. u 18:48 · pre 209 meseci #1
Ovako,

imam datatable koji je sacinjen u potpunosti od izracunatih podataka, i ne bih htio da cuvam te podatke u bazi. Medjutim, moze se desiti da se nacin racunanja promijeni, pa ce mi ti izracunati podaci ipak trebati.

Onda mi je palo na pamet da xml tog datatable objekta smjestim u xml polje u bazi (neke tamo backup tabele). I krenuh polako... Evo do cega sam dosao:

Code:

System.IO.StringWriter sw = new System.IO.StringWriter();
System.Xml.XmlTextWriter xmltw = new System.Xml.XmlTextWriter(sw);
abakusDataSet.z_Radnici.WriteXml(xmltw, XmlWriteMode.IgnoreSchema);

System.IO.MemoryStream memStream = new System.IO.MemoryStream();
byte [] data = Encoding.Default.GetBytes(sw.ToString());
data = Encoding.GetEncoding("windows-1250").GetBytes(sw.ToString());
data = Encoding.ASCII.GetBytes(sw.ToString());
data = Encoding.Unicode.GetBytes(sw.ToString());
memStream.Write(data, 0, data.Length);
System.Xml.XmlTextReader xmltr = new System.Xml.XmlTextReader(memStream); 

//...connection i command...
cmd.CommandText = "UPDATE z_Obracuni SET Backup_porezi = @XML WHERE ID_Obracun = 1";
cmd.Parameters.Add(new System.Data.SqlClient.SqlParameter("@XML", SqlDbType.Xml));
cmd.Parameters["@XML"].Value = new System.Data.SqlTypes.SqlXml(xmltr);
cmd.Parameters["@XML"].Value = new System.Data.SqlTypes.SqlXml(memstream);
cmd.ExecuteNonQuery();


Mislim da imam dva problema, u kodiranju i nesto sa kreiranjem xml fajla.

Limitiran sam sa konstruktorom SqlXml tipa koji prihvata ili stream ili xmltextreader, pa krecem odatle.

U zavisnosti koje od kodiranja izaberem, dobijam razlicite greske. Sve ovo kada SqlXml konstruktoru proslijedim stream podataka:

Ako izaberem Unicode dobijam gresku: Name cannot begin with the '.' character, hexadecimal value 0x00. Line 1, position 2.
Ako izaberem Default (utf-8 ja mislim) ili windows-1250 dobijam gresku: Invalid character in the given encoding. Line 2, position 316.
Ako izaberem ASCII: prolazi, ali u bazu umjesto š, č, đ, itd dobijam kuke i kvake.
XML visualizer u svakom slucaju ispravno prikaze generisani XML string.

Ako prosalijedim xmltextreader kao argument konstruktoru uvijek dobijem gresku: Root element is missing. Evo kako izgleda pocetak generisanog XML-a:
Code:

- <AbakusDataSet xmlns="http://tempuri.org/AbakusDataSet.xsd">
- <z_Radnici>
  <ID_Radnik>1</ID_Radnik> 
  <Ime>Milos</Ime> 
  <Prezime>Mijatovic</Prezime> 
  <Maticni_broj>0412981210022</Maticni_broj> 


E sad, ja znam (bar mislim) da bi XML trebao pocinjati sa <?xml version....>. Zasto ga onda ovako generise WriteXML metod datatable-a. Plus, taj metod nema verziju koja prihvata Encoding kao parametar...

Ako neko ima iskustva sa ovim, cijenio bih pomoc. A mislio sam, bice kao 'walk in the park'.

Pozdrav.
Re: Iz datatable u xml, pa xml u bazu 11.08.2009. u 10:48 · pre 209 meseci #2
xml field moze da sadrzi i fragmente xml-a ne samo kompletne xml fajlove i <xml> header nije neophodan kad baratas sa xml stringovima (to je potrebno u fajlovima da bi se znalo da je fajl xml fajl)

Za pocetak, ako ne koristis niti ces koristiti SQL-ve xml fazone kao sto je xquery vec ti samo treba da imas backup XML fajla onda nemoj uopste koristiti xml polje vec serijalizovani XML fajl strpaj kao string u varchar ili text polje.

Ako bas hoces u xml polje onda pusti sqlclientu da ti odradi posao pretabavanja iz stringa u xml:

Code:
StringWriter sw = new StringWriter();
abakusDataSet.z_Radnici.WriteXml(sw, XmlWriteMode.IgnoreSchema);

//...connection i command...
cmd.CommandText = "UPDATE z_Obracuni SET Backup_porezi = @XML WHERE ID_Obracun = 1";
SqlParameter param = new SqlParameter("@XML", SqlDbType.Xml);
cmd.Parameters.Add(param);
param.Value = sw.ToString();
cmd.ExecuteNonQuery();



A ako bas hoces da koristis SqlXml tip, onda ga generisi direktno preko xmltextreader-a iz string-a

Code:
StringWriter sw = new StringWriter();
abakusDataSet.z_Radnici.WriteXml(sw, XmlWriteMode.IgnoreSchema);

//...connection i command...
cmd.CommandText = "UPDATE z_Obracuni SET Backup_porezi = @XML WHERE ID_Obracun = 1";
SqlParameter param = new SqlParameter("@XML", SqlDbType.Xml);
cmd.Parameters.Add(param);
param.Value = new SqlXml(new XmlTextReader(new StringReader(sw.ToString())));
cmd.ExecuteNonQuery();


u svakom slucaju ti ne treba prebacivanje u binarni stream.
Potpis
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić
Re: Iz datatable u xml, pa xml u bazu 11.08.2009. u 14:36 · pre 209 meseci #3
Hvala, radi sve ovo super :)

Problem je citavo vrijeme bio u kodnim stranama. Evo kako sam ja to rijesio u medjuvremenu, doduse sa binarnim stream-om.

Code:

System.IO.MemoryStream mem = new System.IO.MemoryStream();
System.Xml.XmlTextWriter xmltw2 = new System.Xml.XmlTextWriter(mem, Encoding.UTF8);
abakusDataSet.z_Radnici.WriteXml(xmltw2, XmlWriteMode.IgnoreSchema);
...
cmd.Parameters["@XML"].Value = new System.Data.SqlTypes.SqlXml(mem);


A probao sam na pocetku i sa varchar(max), isalo je dobro do baze, ali mi se posle bunio kod ReadXML metode. Bice da je i tad bio problem kod kodnih strana. U pravu si ti, treba izbjeci memory stream.

Pozdrav.

PS.

Vidio sam da kada upisem XML u fajl, dobijem header, pa me to malo zbunjivalo. Sad znam zasto :)
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme