尝试从XML文件中将值添加到MS Access数据库
问题描述:
我想创建一个程序,它可以读取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();
}
}
答
时间和日期被保留关键字。将它们写在方括号中作为
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)
请张贴代码作为文本而不是作为一个形象!在这里显示的(内部)例外中可能有更多信息。 –
检查InnerException.Message的内容。你显示的只是堆栈中引发的最后一个异常 – Steve
@PeterBons这应该是一个更好的粘贴:https://paste.ofcode.org/BNVEBuDD3ihEs93Jjrt9Vg – Kyle