2015-10-07 113 views
0

我遇到了將XML文件讀入數據庫的問題。我在VS項目中獲得了我的HD上的數據庫。我不知道如何將XML文件中的值放入我的數據庫中。我幾乎掌握了它,但我錯過了一些東西。所以,如果任何人都可以解釋我在代碼中缺少的東西,我將不勝感激。將XML文件讀入數據庫

我寫一個XML文件中的代碼:

try 
{ 
    SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Planeter.mdf;Integrated Security=True"); 

    StreamWriter outputFile = File.CreateText("min_XML2.xml"); 

    SqlDataAdapter adapter = new SqlDataAdapter("select * from Planet", con); 
    DataSet ds = new DataSet("Planeter"); 
    adapter.Fill(ds, "Planet"); 
    ds.WriteXml(outputFile); 
} 
catch (Exception ex) 
{ 
    MessageBox.Show(ex.Message); 
} 

到目前爲止我的代碼讀取XML文件:

SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Planeter.mdf;Integrated Security=True"); 
con.Open(); 

StreamReader inputFile = File.OpenText("min_XML2.xml"); 
DataSet ds = new DataSet(); 
ds.ReadXml(inputFile); 

DataTable dt = ds.Tables["Planet"]; 
dt.Rows.Add("value1","value2", "value3?"); //??Adding row?? Stuck... 

con.Close(); 

這是在dt.Rows.Add IM卡。我想將XML文件中的每個值都放入我的數據庫中。我在網站上編寫XML文件時得到了「teqnique」,所以我不知道它是否最好。但是我不太明白最後一行代碼中的值應該做什麼或者它們是什麼。我的DB中的列名是Namn,DygnslangdArslangd

這是我的XML文件看起來像:

<?xml version="1.0"?> 
 
<Planeter> 
 
    <Planet> 
 
     <Namn>asd</Namn> 
 
     <Dygnslangd>33</Dygnslangd> 
 
     <Arslangd>33</Arslangd> 
 
    </Planet> 
 
    <Planet> 
 
     <Namn>Jorden</Namn> 
 
     <Dygnslangd>24</Dygnslangd> 
 
     <Arslangd>365</Arslangd> 
 
    </Planet> 
 
    <Planet> 
 
     <Namn>Mars</Namn> 
 
     <Dygnslangd>24</Dygnslangd> 
 
     <Arslangd>687</Arslangd> 
 
    </Planet> 
 
    <Planet> 
 
     <Namn>Merkurius</Namn> 
 
     <Dygnslangd>58</Dygnslangd> 
 
     <Arslangd>88</Arslangd> 
 
    </Planet> 
 
    <Planet> 
 
     <Namn>Venus</Namn> 
 
     <Dygnslangd>244</Dygnslangd> 
 
     <Arslangd>224</Arslangd> 
 
    </Planet> 
 
</Planeter>

問候。

+0

什麼是你的xml文件是什麼樣子?和順便說一句,如果連接打開你的本地數據庫在Visual Studio中,當你調試它不能插入。 – Prashant

+0

@Prashant我粘貼了我的XML文件。 –

回答

2

您應該能夠通過使用要做到這一點:

  • XML序列化的XML文件中讀取到保存行星在內存中的結構
  • 簡單,整齊的參數化ADO.NET SqlCommand每個星球執行一次並將數據插入到SQL Server數據庫表中。

試試這個代碼在這裏:

// C# classes for the XML structure 
using System.Xml.Serialization; 

namespace PlaneterXml 
{ 
    [XmlRoot(Namespace = "", IsNullable = false)] 
    public partial class Planeter 
    { 
     private Planet[] itemsField; 

     [XmlElement("Planet", Form = System.Xml.Schema.XmlSchemaForm.Unqualified)] 
     public Planet[] Items 
     { 
      get { return this.itemsField; } 
      set { this.itemsField = value; } 
     } 
    } 

    [XmlType(AnonymousType = true)] 
    public partial class Planet 
    { 
     public string Namn { get; set; } 
     public int Dygnslangd { get; set; } 
     public int Arslangd { get; set; } 
    } 
} 

// C# code to read the XML (deserialize it) and then insert 
// the planets read from the file into the database table 
using System; 
using System.Collections.Generic; 
using System.Data; 
using System.Data.SqlClient; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Xml.Serialization; 

namespace PlaneterXml 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      // adapt to *your* file name - possibly put this in a 
      // configuration file, or pick the file interactively 
      string fileName = @"C:\tmp\planeter.xml"; 

      Planeter allPlanets = null; 

      using (FileStream fstm = new FileStream(fileName, FileMode.Open, FileAccess.Read)) 
      { 
       // create XML serializer for the "Planeter" type 
       XmlSerializer planetSerializer = new XmlSerializer(typeof(Planeter)); 

       // deserialize the XML into a "Planeter" object  
       allPlanets = planetSerializer.Deserialize(fstm) as Planeter; 
      } 

      // Define connection string and insert query 
      // connection string would typically come from a config file 
      string connectionString = @"server=.;database=test;integrated security=SSPI;"; 
      string insertQuery = @"INSERT INTO dbo.Planets(Namn, Dygnslangd, Arslangd) VALUES(@Namn, @Dygnslangd, @Arslangd);"; 

      // create SqlConnection and SqlCommand to insert 
      using (SqlConnection conn =new SqlConnection(connectionString)) 
      using (SqlCommand insertCmd = new SqlCommand(insertQuery, conn)) 
      { 
       // define parameters 
       insertCmd.Parameters.Add("@Namn", SqlDbType.VarChar, 100); 
       insertCmd.Parameters.Add("@Dygnslangd", SqlDbType.Int); 
       insertCmd.Parameters.Add("@Arslangd", SqlDbType.Int); 

       // open connection, loop over planets, execute query 
       conn.Open(); 

       foreach (Planet p in allPlanets.Items) 
       { 
        // set parameter values 
        insertCmd.Parameters["@Namn"].Value = p.Namn; 
        insertCmd.Parameters["@Dygnslangd"].Value = p.Dygnslangd; 
        insertCmd.Parameters["@Arslangd"].Value = p.Arslangd; 

        insertCmd.ExecuteNonQuery(); 
       } 

       // close connection 
       conn.Close(); 
      } 
     } 
    } 
}