2017-06-18 65 views
0

我想創建一個程序,它可以讀取5個XML文件並將數據存儲在Microsoft Access數據庫中。嘗試從XML文件中將值添加到MS Access數據庫

這是代碼:https://codepaste.net/ve4bkb

然而,當我運行的程序沒有什麼是被添加到數據庫中。在System.Data.dll中 在調試盒子「System.Data.OleDb.OleDbException」:

拋出該異常:當我關閉Form1,我得到

錯誤信息彈出。

我認爲Visual Studio正確地連接到數據庫,就像在服務器資源管理器下的數據連接一樣,我可以從數據庫中看到我的表完成所有標題。

我出現的代碼部分可以具有如下的問題:

for (int j = 0; j < timeList.Count; j++) 
{ 
    OleDbConnection con = new 
    OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Kyle\Desktop\UAVbrook\brook\UAV\UAV\Readings.mdb;Persist Security Info=False"); 

    String strSQL = "Insert into UAVData(Day,Time,Latitude,Longitude,Altitude,Temperature,Windspeed) values(1,@timeList[j].InnerText, @latList[j].InnerText, @longList[j].InnerText, @altList[j].InnerText, @tempList[j].InnerText, @windList[j].InnerText)"; 

    OleDbCommand CmdSql = new OleDbCommand(strSQL, con); 
    CmdSql.CommandType = CommandType.Text; 

    CmdSql.Parameters.AddWithValue("@Day", 1); 
    CmdSql.Parameters.AddWithValue("@Time", Convert.ToInt64(timeList[j].InnerText)); 
    CmdSql.Parameters.AddWithValue("@Latitude", Convert.ToDouble(latList[j].InnerText)); 
    CmdSql.Parameters.AddWithValue("@Longitude", Convert.ToDouble(longList[j].InnerText)); 
    CmdSql.Parameters.AddWithValue("@Altitude", Convert.ToDouble(altList[j].InnerText)); 
    CmdSql.Parameters.AddWithValue("@Temperature", Convert.ToDouble(tempList[j].InnerText)); 
    CmdSql.Parameters.AddWithValue("@Windspeed", Convert.ToDouble(windList[j].InnerText)); 


    con.Open(); 
    try 
    { 
     CmdSql.ExecuteNonQuery(); 
    } 
    catch (Exception ex) 
    { 
     ex.Message.ToString(); 
    } 
    finally 
    { 
     con.Close(); 
     CmdSql.Dispose(); 
    } 
} 
+2

請張貼代碼作爲文本而不是作爲一個形象!在這裏顯示的(內部)例外中可能有更多信息。 –

+0

檢查InnerException.Message的內容。你顯示的只是堆棧中引發的最後一個異常 – Steve

+0

@PeterBons這應該是一個更好的粘貼:https://paste.ofcode.org/BNVEBuDD3ihEs93Jjrt9Vg – Kyle

回答

0

時間和日期被保留關鍵字。將它們寫在方括號中作爲

String strSQL = @"Insert into UAVData 
       ([Day],[Time],Latitude,Longitude, 
        Altitude,Temperature,Windspeed) 
        values(@day,@time, @lat,@long, @alt, @temp, @wind)"; 
using(OleDbConnection con = new OleDbConnection(.....)) 
using(OleDbCommand CmdSql = new OleDbCommand(cmdText, con)) 
{ 
    con.Open(); 
    CmdSql.Parameters.Add("@Day", OleDbType.Integer); 
    CmdSql.Parameters.Add("@Time", OleDbType.BigInt); 
    CmdSql.Parameters.Add("@Lat", OleDbType.Double) 
    CmdSql.Parameters.Add("@Long", OleDbType.Double); 
    CmdSql.Parameters.Add("@Alt", OleDbType.Double); 
    CmdSql.Parameters.Add("@Temp", OleDbType.Double); 
    CmdSql.Parameters.Add("@Wind", OleDbType.Double); 

    for (int j = 0; j < timeList.Count; j++) 
    { 
     CmdSql.Parameters["@Day"].Value = 1 
     CmdSql.Parameters["@Time"].Value = Convert.ToInt64(timeList[j].InnerText); 
     CmdSql.Parameters["@Lat"].Value = Convert.ToDouble(latList[j].InnerText 
     CmdSql.Parameters["@Long"].Value = Convert.ToDouble(longList[j].InnerText); 
     CmdSql.Parameters["@Alt"].Value = Convert.ToDouble(altList[j].InnerText); 
     CmdSql.Parameters["@Temp"].Value = Convert.ToDouble(tempList[j].InnerText); 
     CmdSql.Parameters["@Wind"].Value = Convert.ToDouble(windList[j].InnerText); 
     CmdSql.ExecuteNonQuery(); 
    } 
} 

另請注意,我已經刪除了try/catch塊以使異常可見。在製作環境中,您應該確保正確處理它,並顯示相應的錯誤消息,並對來自XML的輸入進行消毒處理,以確保在嘗試插入新記錄之前所有這些轉換都成功。此外,此代碼嘗試插入許多記錄,並且可能需要使用Transaction對象來保證all/none規則。

對於線程問題,我建議看看這個答案Multiple MS ACCESS connection with threading (oledb)

相關問題