OleDb更新需要插入命令吗?

时间:2018-12-17 09:19:32

标签: c# sql ms-access oledb

我尝试对由ID选择的一行进行更新。但是我充其量只是增加一行而不是更新一行。

我做了几次尝试。现在,我得到了System.InvalidOperationException,声称如果DataRow列表将获得新行,则必须使用有效的InsertCommand进行更新。

对我来说还是一样:为什么要插入?我要更新。 有人可以给我提示吗?

这是我的相关代码:

        string selectQuery = $"SELECT * FROM Records";
        string updateQuery = $"UPDATE Records SET AnyContent = @AnyContent  WHERE [ID] = @ID";
        OleDbDataAdapter adapter = null;
        OleDbCommand cmd = null;
        try
        {
            adapter = new OleDbDataAdapter(selectQuery, ConnectionString);

            cmd = new OleDbCommand();
            cmd.CommandType = CommandType.Text;
            cmd.CommandText = updateQuery;

            cmd.Parameters.AddWithValue ("@AnyContent", "066066");
            cmd.Parameters.AddWithValue("@ID", 2);

            try
            {
                adapter.UpdateCommand = cmd;
                nbRowsChanged = adapter.Update(content);
            }
            finally
            {
                adapter?.Close();
                cmd?.Close();
            }
        }
        catch (OleDbException e)
        {
            logText += "...Database Exception:\n\n" + e.Message + "\n\n";
            isSuccess = false;
        }

        if (0 < nbRowsChanged)
        {
            logText += ".... Success: Updated <" + nbRowsChanged.ToString() + "> rows.\n";
            isSuccess = true;
        }

<<<更新>>>

最初,我之前使用OleDbCommandBuilder进行了尝试。但是CommandBuilder创建了一个更新命令,在我看来,这就像一个插入命令。这就是为什么我没有上面的CommandBuilder尝试过的原因。但是插入似乎跟着我。

这是我的旧代码,因为它使用DataTable而不是参数,所以更接近我想要获得的位置:

        string selectQuery = $"SELECT * FROM Records WHERE [ID] = ?";

        OleDbConnection con = null;
        OleDbDataAdapter adapter = null;
        OleDbCommandBuilder builder = null;
        try
        {
            adapter = new OleDbDataAdapter();
            con = new OleDbConnection(ConnectionString);

            adapter.SelectCommand = new OleDbCommand(selectQuery, con);
            builder = new OleDbCommandBuilder(adapter);

            try
            {
                con.Open();
                nbRowsChanged = adapter.Update(content);
                logText += "....InsertCommand: " + builder.GetInsertCommand().CommandText + "\n"; // Just to debug
                logText += "....UpdateCommand: " + builder.GetUpdateCommand().CommandText + "\n"; // Just to debug
            }
            finally
            {
                con?.Close();
                adapter?.Dispose();
            }
        }
        catch (OleDbException e)
        {
            logText += "...Database Exception:\n\n" + e.Message + "\n\n";
            isSuccess = false;
        }

        if (0 < nbRowsChanged)
        {
            logText += ".... Success: Updated <" + nbRowsChanged.ToString() + "> rows.\n";
            isSuccess = true;
        }

        logText += tmpText ;
        logText += "...Database: Access disposed.\n";

        return isSuccess;  

这是相关的跟踪记录:

        LogText:

       ...Database: Trying to update <1> number of rows in table <Records>
       ....InsertCommand: INSERT INTO Records (AnyContent) VALUES (?)
       ....UpdateCommand: UPDATE Records SET AnyContent = ? WHERE ((ID = ?) AND ((? = 1 AND AnyContent IS NULL) OR (AnyContent = ?)))
       .... Success: Updated <1> rows.
       ...Database: Access disposed.
       NbRows Before: 5
       NbRows After: 6

0 个答案:

没有答案