不确定这是否写得正确但看起来是否正确。如果id已经存在,我想更新记录,如果没有,我想插入。
DataSet ds = new DataSet();
ds.ReadXml(XDocument.Load(Application.StartupPath + @"\xml1.xml").CreateReader());
using (var conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + Application.StartupPath + "\\Database3.mdb"))
{
conn.Open();
// make two commands here
var commInsert = new OleDbCommand("Insert INTO Table1 (description, active) VALUES (@iq_question,@active);", conn);
var commUpdate = new OleDbCommand("UPDATE Table1 SET description=@iq_question,active=@active WHERE ID=@question_id;", conn);
// here add your parameters with no value
//string question_id = row[0].ToString();
//string iq_question = row[1].ToString();
//string active = row[4].ToString();
commInsert.Parameters.Add(new OleDbParameter("@iq_question", OleDbType.VarChar));
commInsert.Parameters.Add(new OleDbParameter("@active", OleDbType.VarChar));
commUpdate.Parameters.Add(new OleDbParameter("@question_id", OleDbType.AutoNumber));
commUpdate.Parameters.Add(new OleDbParameter("@iq_question", OleDbType.Text));
commUpdate.Parameters.Add(new OleDbParameter("@active", OleDbType.Text));
foreach (DataTable table in ds.Tables)
{
foreach (DataRow row in table.Rows)
{
// here only reset the values
commUpdate.Parameters["@question_id"].Value = row[0].ToString();
commUpdate.Parameters["@iq_question"].Value = row[1].ToString();
commUpdate.Parameters["@active"].Value = row[4].ToString();
int recs = commUpdate.ExecuteNonQuery();
if (recs < 1) // when no records updated do insert
{
commInsert.Parameters["@iq_question"].Value = row[1].ToString();
commInsert.Parameters["@active"].Value = row[4].ToString();
commInsert.ExecuteNonQuery();
}
}
}
commInsert.Dispose();
commUpdate.Dispose();
conn.Close();
}
System.Windows.Forms.MessageBox.Show("Updated Latest Data Was Succesfull");
我在插件上遇到错误,说它会创建重复的内容,或者它会创建更多包含不同数据的行。所以说我应该从xml文件中获取10行,第一次运行它时,我得到了10行,其中包含正确的数据。如果我再次运行它,我最终会得到10个,所以20个,但最后10行显示不同的数据。我不认为我正确识别xml文件中的行,我需要对该部分进行一些研究。
答案 0 :(得分:0)
Exists
没有MS Access
。该引擎比Sql Server更原始。见这里:Microsoft Access SQL。我想,你能做的是:
myCommand.CommandText = "UPDATE Table1 SET description=@iq_question,active=@active WHERE ID=@currentRow";
......
int recs = myCommand.ExecuteNonQuery();
if (recs < 1) // when no records updated do insert
{
myCommand.Parameters.Clear();
myCommand.CommandText = "Insert INTO Table1 VALUES(@iq_question,@active)";
.....
}
这仍然是2个语句,但您可以先保留Select
来保存一些编码。因为ExecuteNonQuery
会告诉您是否更新了任何内容
另一件事是您的代码效率低下。您有嵌套循环,您可以在其中重用相同的命令和连接。 Yuu可以做到这一点
using (var conn = new OleDbConnection(.......))
{
conn.Open();
// make two commands here
var commInsert = new OleDbCommand(.....);
var commUpdate = new OleDbCommand(.....);
// here add your parameters with no value
commInsert.Parameters.Add(new OleDbParameter(....));
.......
Foreach (....)
{
Foreach (....)
{
// here only reset the values
commUpdate.Parameters[0].Value = ...
...
int recs = commUpdate.ExecuteNonQuery();
if (recs < 1) // when no records updated do insert
{
commInsert.Parameters[0].Value = iq_question;
.....
}
}
}
commInsert.Dispose();
commUpdate.Dispose();
}
您还可以使用嵌套using
命令。只有设置值才会比现在更有效。