2017-11-16 5 views
0

私はxmlファイルからSQL Serverに自分のデータを転送するC#でSQLクエリを作成しようとしています。私は正常に "get、set"メソッドに自分のXMLを逆シリアル化し、コンソールに私のXMLを出力することができます。私は私のSQLテーブルに自分のXMLを追加するための挿入クエリを作成する方法を見つけるために、過去の日にGoogleを検索してきました。ここで私は両方のクラスでこれまでに持っていたことがあります。 Class1は私の "get、set"メソッドクラスで、Programは私の "main"メソッドクラスです。デシリアライズされたXMLのSQLクエリ

Class1.csの

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Xml.Serialization; 

namespace ConsoleApp1 
{ 
    public class Class1 
    { 
     public static object Item_ID { get; set; } 
     public static object Invent_id { get; set; } 
     public static object Itemsize { get; set; } 
     public static object Color { get; set; } 
     public static decimal Curr_price { get; set; } 
     public static object Qoh { get; set; } 
    } 
    public class transactions 
    { 
     [XmlRoot(ElementName = "UPDATE")] 
     public class UPDATE 
     { 
      [XmlAttribute(AttributeName = "qoh")] 
      public string Qoh { get; set; } 
      [XmlAttribute(AttributeName = "curr_price")] 
      public string Curr_price { get; set; } 
      [XmlAttribute(AttributeName = "color")] 
      public string Color { get; set; } 
      [XmlAttribute(AttributeName = "itemsize")] 
      public string Itemsize { get; set; } 
      [XmlAttribute(AttributeName = "invent_id")] 
      public string Invent_id { get; set; } 
      [XmlAttribute(AttributeName = "item_id")] 
      public string Item_id { get; set; } 
     } 

     [XmlRoot(ElementName = "ADD")] 
     public class ADD 
     { 
      [XmlAttribute(AttributeName = "qoh")] 
      public string Qoh { get; set; } 
      [XmlAttribute(AttributeName = "curr_price")] 
      public string Curr_price { get; set; } 
      [XmlAttribute(AttributeName = "color")] 
      public string Color { get; set; } 
      [XmlAttribute(AttributeName = "itemsize")] 
      public string Itemsize { get; set; } 
      [XmlAttribute(AttributeName = "invent_id")] 
      public string Invent_id { get; set; } 
      [XmlAttribute(AttributeName = "item_id")] 
      public string Item_id { get; set; } 
     } 

     [XmlRoot(ElementName = "DELETE")] 
     public class DELETE 
     { 
      [XmlAttribute(AttributeName = "item_id")] 
      public string Item_id { get; set; } 
     } 

     [XmlRoot(ElementName = "transactions")] 
     public class Transactions 
     { 
      [XmlElement(ElementName = "UPDATE")] 
      public UPDATE UPDATE { get; set; } 
      [XmlElement(ElementName = "ADD")] 
      public List<ADD> ADD { get; set; } 
      [XmlElement(ElementName = "DELETE")] 
      public DELETE DELETE { get; set; } 
     } 
    } 
} 

メインクラス

using System; 
using System.Collections.Generic; 
using System.Data.Odbc; 
using System.Data.SqlClient; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Xml; 
using System.Xml.Linq; 
using System.Xml.Serialization; 

namespace ConsoleApp1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string conString = "Driver={MySQL ODBC 5.3 ANSI Driver};" 
       + "Server=XXX;Port=YYY;" 
       + "Database=inventory;" 
       + "uid=ZZZ;pwd=XYZ"; 
      OdbcConnection connection = new OdbcConnection(conString); 

      { 
       XDocument theFile = XDocument.Load("C:\\Users\\Bob\\Documents\\Update.xml"); 

       foreach (XElement el in theFile.Root.Elements()) 
       { 
        if (el.Name == "ADD") 
        { 
         Console.WriteLine("{0} {1} {2} {3} {4} {5} {6}", el.Name, el.Attribute("qoh").Value, el.Attribute("curr_price").Value, el.Attribute("color").Value, el.Attribute("itemsize").Value, el.Attribute("invent_id").Value, el.Attribute("item_id").Value); 
         Console.ReadLine(); 

         OdbcCommand Command1 = new OdbcCommand("INSERT INTO item (item_id, invent_id, itemsize, color, curr_price, qoh) VALUES(?, ?, ?, ?, ?, ?) ", connection); 
         Command1.Parameters.Add("@SZ", OdbcType.VarChar).Value = Class1.Itemsize; 
         Command1.Parameters.Add("@COL", OdbcType.VarChar).Value = Class1.Color; 
         Command1.Parameters.Add("@PR", OdbcType.Double).Value = (double)Class1.Curr_price; 
         Command1.Parameters.Add("@QOH", OdbcType.Int).Value = Class1.Qoh; 
         Command1.Parameters.Add("@ID", OdbcType.Int).Value = Class1.Item_ID; 

         Console.ReadLine(); 
        } 
        else if (el.Name == "UPDATE") 
        { 
         Console.WriteLine("{0} {1} {2} {3} {4} {5} {6}", el.Name, el.Attribute("qoh").Value, el.Attribute("curr_price").Value, el.Attribute("color").Value, el.Attribute("itemsize").Value, el.Attribute("invent_id").Value, el.Attribute("item_id").Value); 
         Console.ReadLine(); 
        } 
        else if (el.Name == "DELETE") 
        { 
         Console.WriteLine("{0} {1}", el.Name, el.Attribute("item_id").Value); 
         Console.ReadLine(); 
        } 
       } 
      } 
     } 
    } 
} 

更新:MySQLのLOADクエリを使用してに関しては

、ここでは、私が持っているものですが、それが正しいかどうかを確認していません。 Infile Loadingに関するあなたのリンクを読んだ後、私はちょうどxmlファイルの場所にクエリを指していると私のSQLテーブル内のフィールドにデータをコピーします。私はまた、正しい順序でパラメータを変更しても動作しません。それは私のXMLファイルまたは私のパラメータ行からの値が正しく表示されていないようです。

OdbcCommand Command1 = new OdbcCommand("LOAD XML LOCAL INFILE 'C:\\Users\\Bob\\Documents\\Update.xml' INTO TABLE item ROWS IDENTIFIED BY '<ADD>'"); 
+0

のMySQL 5.5以降は、LOAD XMLの読み込み(https://dev.mysql.com/doc/refman/5.5/en/load-xml.html) –

+0

をサポートしています彼らが現れるのと同じ順序でパラメータを追加します。 INSERTステートメント。 – Crowcoder

+0

実行するリーダー行がありませんか? LOAD XML INFILEを使用する場合はこれが必要ですか? – Fusion

答えて

0

私はクエリにLoad XMLを使用する方法を理解しました。私は、ファイルパスが "/"ではなく、 "/"が必要であることに気付きました。この変更を行った後、それは動作します。以下は私の編集したコードです。

if (el.Name == "ADD") 
        { 
         Console.WriteLine("Item {0} ", el.Attribute("invent_id").Value + " was successfully added."); 
         Console.ReadLine(); 

         OdbcCommand Command1 = new OdbcCommand("LOAD XML LOCAL INFILE 'C:/Users/Adam/Documents/Update.xml' INTO TABLE item ROWS IDENTIFIED BY '<ADD>'", connection); 
         connection.Open(); 
         OdbcDataReader reader = Command1.ExecuteReader(); 
         connection.Close(); 
        }