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();
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>
- <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.