簡體   English   中英

XML到數據庫,反之亦然

[英]XML to database and vice-versa

我可以輕松地將XML插入數據庫表中,但是我遵循這種精疲力盡的方式,就像使用LINK的向下代碼所看到的那樣,該鏈接已經過完美測試。 但是,我想知道是否可以找到一種方法,通過所有子標記名的迭代來讀取“級別”節點的所有XML后代元素,因為當我對XML文件進行任何更改時,都必須更改一次LINK代碼再次,通常,當我使用這種疲憊的方式時,我會遇到一些錯誤。 請幫助改善此代碼:

try
{
    XElement d = XElement.Parse(richTextBox1.Text.ToString());

        var people = (from Level in d.Descendants("Level")
                      select new
                      {
                          ID = Convert.ToInt32(Level.Element("ID").Value),
                          Day1 = Level.Element("Day1").Value,
                          Day2 = Level.Element("Day2").Value,
                          Day3 = Level.Element("Day3").Value,
                          Day4 = Level.Element("Day4").Value,
                          Day5 = Level.Element("Day5").Value,
                          Day6 = Level.Element("Day6").Value,
                          Day7 = Level.Element("Day7").Value
                      }).ToList();
        foreach (var item in people)
        {
            //Insert and Update                    
            datacommand1.CommandText = "Insert Into MyTable(ID,Day1,Day2,Day3,Day4,Day5,Day6,Day7) values(" + item.ID + ","  + "','" + item.Day1 + "','" + item.Day2 + "','" + item.Day3 + "','" + item.Day4 + "','" + item.Day5 + "','" + item.Day6 + "','" + item.Day7 + "')";
            datacommand1.ExecuteNonQuery();                        
        }                    
}

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

<level>
    <id> 101 </id>
    <Day1> task 1</Day1>
    <Day2> task 2</Day2>
    <Day3> task 3</Day3>
    <Day4> task 4</Day4>
    <Day5> task 5</Day5>
    <Day6> task 6</Day6>
    <Day7> task7 </Day7>

</level>

與其為文件中的每個標簽聲明一個變量,您可能想要嘗試遍歷所有變量,提取每個變量的名稱和值,並在運行時從它們中組成SQL語句,無論它們是什么。 嘗試這樣的事情:

IEnumerable<XElement> items = d.Descendants("level").Elements();
string names = string.Empty;
string values = string.Empty;
foreach (XElement item in items)
{
    names += item.Name + ",";
    values += "@" + item.Name + ",";
    IDbDataParameter parameter = datacommand1.CreateParameter();
    parameter.ParameterName = "@" + item.Name;
    parameter.DbType = DbType.String;
    parameter.Value = item.Value;
    datacommand1.Parameters.Add(parameter);
}
datacommand1.CommandText = "INSERT INTO MyTable (" + names.Substring(names.Length - 1) + ") VALUES (" + values.Substring(values.Length - 1) + ");";
datacommand1.ExecuteNonQuery();

這將基於XML結構動態構建命令,並使用其中的數據填充其參數。 但是這樣做依賴於以下事實:表結構將與文件中的表結構完全相同,並且在結構更改時仍需要手動進行模式更新,但是只要它們是同步的就可以了。

編輯

關於數據類型,我可以想到2種選擇。 照原樣,無論如何都以字符串形式發送所有內容,並依靠數據庫引擎來解析,驗證並將其轉換為數字(取決於您使用的是哪個數據庫,這是否可能,但我想不是罕見)。 或修改代碼以將特殊字段與循環分開(並從循環中排除)並逐一添加,並相應地指定其類型。 如果數字列是固定的(例如ID),並且其他所有內容都是文本,則這樣做很容易。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM