2013-04-24 94 views
0

我想讀取XML文件到SQL Server表中的數據,我的代碼工作正常,如果所有的點頭是存在的,但如果節點之一是不存在的話告訴我的錯誤 這裏是我的xml文件從XML文件讀取到SQL Server表C#

<?xml version="1.0" standalone="yes"?> 
<DocumentElement> 
<student> 
<rfidip>3000E2009150501900880530DE07</rfidip> 
<timegetin>2013-04-09T00:53:25+03:00</timegetin> 
<timegetout>2013-04-09T00:55:59+03:00</timegetout> 
</student> 
<student> 
<rfidip>3000E20075232318015114907CF6</rfidip> 
<timegetin>2013-04-09T00:53:25+03:00</timegetin> 
<timegetout>2013-04-09T00:55:59+03:00</timegetout> 
</student> 
<student> 
<rfidip>3000E20075232318015112409741</rfidip> 
<timegetin>2013-04-09T00:53:25+03:00</timegetin> 
</student> 
</DocumentElement> 

,這是我的代碼讀取XML和插入數據到SQL Server表

  XmlDocument xmlDoc = new XmlDocument(); 
     xmlDoc.Load("C:\\Users\\TOSHIBA\\Desktop\\student.XML"); 

     XmlNodeList dataNodes = xmlDoc.SelectNodes("/DocumentElement/student"); 

     foreach (XmlNode node in dataNodes) 
      { 

        rfidip = node.SelectSingleNode("rfidip").InnerText.ToString(); 
        timegetin = (node.SelectSingleNode("timegetin").InnerText); 
        timegetout = node.SelectSingleNode("timegetout").InnerText; 

      sql = "insert into tripStudent (Student_ID,trip_number,time_getin,time_getout) values(@rfidip,@trip_number,@timegetin,@timegetout)"; 
      //sql = "insert into students values(" + rfidip + ",'" + timegetin + "'," + timegetout + ")"; 
       command = new SqlCommand(sql, connection); 
      command.Parameters.AddWithValue("@rfidip", rfidip); 
       command.Parameters.AddWithValue("@trip_number",trip_number); 
       command.Parameters.AddWithValue("@timegetin", Convert.ToDateTime(timegetin)); 
       command.Parameters.AddWithValue("@timegetout", Convert.ToDateTime(timegetout)); 

       command.ExecuteNonQuery(); 

任何機構可以幫我...

+0

你得到什麼錯誤?此外,如果一個節點沒有在XML文檔中存在,那麼什麼樣的價值你要插入到數據庫? – StrayCatDBA 2013-04-24 02:00:07

回答

0

的SelectSingleNode返回NULL的元素不存在, 所以當你打電話的innerText上的空它拋出一個異常 這樣你就可以改變你的代碼是這樣的:

rfidip = (node.SelectSingleNode("rfidip") != null)? node.SelectSingleNode("rfidip").InnerText.ToString(): string.Empty; 

同樣適用於你的代碼的其餘部分,確保該元素存在

希望這可以幫助你

+0

是的,它的工作原理將但當它到達插入到表時它顯示錯誤「字符串不是識別爲有效的日期時間」 – 2013-04-24 02:11:12

+0

@batoolhamwy什麼是你想,如果日期是缺少放置值?兩個建議是1)將其設置爲null並在數據庫表中允許爲null 2)可以將其設置爲DateTime.Now()這兩種情況都會給你數據庫可接受的值 – 2013-04-24 02:17:54

0

而是w的用這種方式工作會有,爲什麼不直接使用Entity Framework更新值,並用XDocument XML解析?

string xml = @"<?xml version=""1.0"" standalone=""yes""?> 
     <DocumentElement> 
      <student> 
       <rfidip>3000E2009150501900880530DE07</rfidip> 
       <timegetin>2013-04-09T00:53:25+03:00</timegetin> 
       <timegetout>2013-04-09T00:55:59+03:00</timegetout> 
      </student> 
      <student> 
       <rfidip>3000E20075232318015114907CF6</rfidip> 
       <timegetin>2013-04-09T00:53:25+03:00</timegetin> 
       <timegetout>2013-04-09T00:55:59+03:00</timegetout> 
      </student> 
      <student> 
       <rfidip>3000E20075232318015112409741</rfidip> 
       <timegetin>2013-04-09T00:53:25+03:00</timegetin> 
      </student> 
     </DocumentElement>"; 

//use var xDoc = XDocument.Load(xmlPathGoesHere); if you using xml path 
var xDoc = XDocument.Parse(xml); 
var studentElements = xDoc.Descendants("student"); 

studentElements.ToList().ForEach(student => { 
    //Create you Insert Query here, see sample below how to get values 
    var rfid = student.Element("rfidip").Value; 
    var timeIn = student.Element("timegetin").Value; 
    var timeOut= string.Empty; 
    try { 
     timeOut = student.Element("timegetout").Value; 
    } catch { 
     //since you have no xml value on your time get out, I catch this line 
    } 
}); 
下面

見refence:

1)Entity Framework

2)XDocument

+0

要expalin此XML來自智能設備RFID閱讀器,我需要將此數據存儲在我的數據庫 – 2013-04-24 01:58:38

+0

請參閱我的編輯更新的答案 – lexeRoy 2013-04-24 02:11:33