Avatar billede Simon Praktikant
19. oktober 2004 - 15:37 Der er 16 kommentarer og
1 løsning

bruge sql til at selecte og inserte data fra XML fil

Jeg har tænkt mig at benytte en xml-fil som database, pga porterbarheden.
Hvordan selecter og interter jeg data til og fra en xml-fil med SQL med visual studio .NET?
Kodeeksempler er velkomne.
Avatar billede Syska Mester
19. oktober 2004 - 19:02 #1
lytter lige med
Avatar billede arne_v Ekspert
22. oktober 2004 - 21:40 #2
Avatar billede arne_v Ekspert
22. oktober 2004 - 21:40 #3
Eksempel kode:

using System;
using System.Data;
using Wilson.XmlDbClient;

class MainClass
{
    public static void Main(string[] args)
    {
        XmlDbConnection con = new XmlDbConnection(@"C:\z.xml");
        con.Open();
        XmlDbCommand sel = new XmlDbCommand("SELECT * FROM t1", con);
        IDataReader rdr = sel.ExecuteReader();
        while(rdr.Read())
        {
            Console.WriteLine(rdr[0] + " " + rdr[1]);
        }
        rdr.Close();
        XmlDbCommand ins = new XmlDbCommand("INSERT INTO t1 (f1, f2) VALUES (4, 'dddd')", con);
        ins.ExecuteNonQuery();
        con.Close();
    }
}
Avatar billede arne_v Ekspert
22. oktober 2004 - 21:42 #4
z.xml før:

<db>
  <t1>
    <f1>1</f1>
    <f2>a</f2>
  </t1>
  <t1>
    <f1>2</f1>
    <f2>bb</f2>
  </t1>
  <t1>
    <f1>3</f1>
    <f2>ccc</f2>
  </t1>
</db>

Output:

1 a
2 bb
3 ccc

z.xml efter:

<?xml version="1.0" standalone="yes"?>
<db>
  <xs:schema id="db" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:
msdata="urn:schemas-microsoft-com:xml-msdata">
    <xs:element name="db" msdata:IsDataSet="true">
      <xs:complexType>
        <xs:choice maxOccurs="unbounded">
          <xs:element name="t1">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="f1" type="xs:string" minOccurs="0" />
                <xs:element name="f2" type="xs:string" minOccurs="0" />
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:choice>
      </xs:complexType>
    </xs:element>
  </xs:schema>
  <t1>
    <f1>1</f1>
    <f2>a</f2>
  </t1>
  <t1>
    <f1>2</f1>
    <f2>bb</f2>
  </t1>
  <t1>
    <f1>3</f1>
    <f2>ccc</f2>
  </t1>
  <t1>
    <f1>4</f1>
    <f2>dddd</f2>
  </t1>
</db>
Avatar billede arne_v Ekspert
22. oktober 2004 - 21:42 #5
Bemærk det bibliotek er ikke helt production quality, men kilde teksten er med,
så du kan selv forbedre det !
Avatar billede Simon Praktikant
23. oktober 2004 - 17:03 #6
Tak for hjælpen. Så godt så vidt.
Her får jeg så en IDataReader retur. Dette vil jeg gerne have lavet om til DataTable. Hertil har jeg fundet noget kode:
--------------------------------------------
using System;
using System.Data;
using System.Data.Common ;

namespace DataUtils
{
public class DataReaderAdapter  : DbDataAdapter
{
public  int FillFromReader(DataTable dataTable, IDataReader dataReader)
{
return  this.Fill(dataTable, dataReader);
}

protected override RowUpdatedEventArgs CreateRowUpdatedEvent(
DataRow dataRow,
IDbCommand command,
StatementType statementType,
DataTableMapping tableMapping
){return null;}

protected override RowUpdatingEventArgs CreateRowUpdatingEvent(
DataRow dataRow,
IDbCommand command,
StatementType statementType,
DataTableMapping tableMapping
){return null;}

protected override void OnRowUpdated(
RowUpdatedEventArgs value
){}
protected override void OnRowUpdating(
RowUpdatingEventArgs value
){}
}
}


With this complete, here is some console app code to illustrate its use:

using System;
using System.Data;
using System.Data.SqlClient;

namespace DataReaderAdapter
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
SqlConnection cn = new SqlConnection("Server=(local);database=Northwind;user id=sa;password=;");
string sql ="Select * from Employees";
SqlCommand cmd= new SqlCommand(sql,cn);
cn.Open();
SqlDataReader dr=cmd.ExecuteReader(CommandBehavior.CloseConnection);
DataUtils.DataReaderAdapter dra = new DataUtils.DataReaderAdapter();
DataTable dt = new DataTable();
dra.FillFromReader(dt,dr);
dr.Close();
for(int i =0;i<dt.Rows.Count;i++)
        Console.WriteLine(dt.Rows[i][1].ToString());
}
}
}
--------------------------------------------
(kilde: http://www.eggheadcafe.com/PrintSearchContent.asp?LINKID=628)
Avatar billede Simon Praktikant
23. oktober 2004 - 17:05 #7
andre og simplere forslag for konvertering fra IDataReader til DataTable er meget velkomne :-)
Avatar billede arne_v Ekspert
23. oktober 2004 - 17:08 #8
Jeg kigge en lille bitte smule på kilde teksten til XmlDbClient og så vidt
jeg kan se så gemmer den data internt som et DataSet objekt.

Og den har jo en Tables property.

Så det burde være nemt at fiske en DataTable ud af en XmLDbConnection !
Avatar billede Simon Praktikant
23. oktober 2004 - 17:09 #9
okay? spændende... har du forslag?
Avatar billede arne_v Ekspert
23. oktober 2004 - 17:13 #10
Jeg har ikke prøvet men vil da tro at man kan tilføje en metode til
XmlDbConnection:

public DataTable GetTable(string tablename)
{
    return data.Tables[tablename];
}

(så skal du selvfølgelig builde hele koden igen)
Avatar billede Simon Praktikant
23. oktober 2004 - 17:59 #11
Når jeg prøver at hente "Data" ud, og skriver det i et dataGrid, så får jeg ikke det som jeg har selected, men hele databasen. :-(
Avatar billede Simon Praktikant
23. oktober 2004 - 18:02 #12
hvis man skal noget, så tror jeg man bliver nødt til at tilgå den IDataReader som bliver returneret ( IDataReader rdr = sel.ExecuteReader(); )
Avatar billede arne_v Ekspert
23. oktober 2004 - 18:19 #13
Det lyder plausibelt.
Avatar billede arne_v Ekspert
23. oktober 2004 - 22:50 #14
Der er også en XmlDbDataAdapter - måske kan du lave sådan en udfra en SELECT statement
og bruge den til at fille et nyt DataSet som så kun indeholder query result.
Avatar billede arne_v Ekspert
06. november 2004 - 18:21 #15
OK ?
Avatar billede Simon Praktikant
07. november 2004 - 02:39 #16
Undskyld jeg ikke lige har svaret... Var lige kommet fra det. Jeg har fundet en lidt anden løsning i mellemtiden. Jeg benytter SQLite som database i steddet for. Det virker rigtig fint. Jeg har porterbarheden ved at det kun er en fil der indeholder hele databasen. Jeg har så selv skrevet en metodet som omsætter en DataTable til et insert statement, og jeg har lavet en metode som omsætter et result-set til en DataTable.
Avatar billede Simon Praktikant
07. november 2004 - 23:38 #17
Tak for de mange kommentarer arne_v. Selvom jeg ikke har valgt at implementere på den måde du foreslog, har jeg dog fået det til at virke. De mange kommentarer er jeg glad for. Ikke mindst fordi det her indgår i et afgangsprojekt på universitetet.
Også tak for hjælpen i andre spørgsmål.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester