C#sql IF NOT EXIST语句不起作用?

时间:2014-07-14 22:42:14

标签: c# sql xml ms-access

不确定这是否写得正确但看起来是否正确。如果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文件中的行,我需要对该部分进行一些研究。

1 个答案:

答案 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命令。只有设置值才会比现在更有效。