Для обновления OleDb требуется команда вставки? - PullRequest
0 голосов
/ 17 декабря 2018

Я пытаюсь обновить одну строку, выбранную им ID.Но в лучшем случае я получил дополнительную строку вместо обновленной.

Я сделал несколько попыток.Теперь я получил System.InvalidOperationException, утверждающий, что для обновления необходима действительная команда InsertCommand, если список DataRow получит новую строку.

Мне опять то же самое: зачем вставлять?Я хочу обновить.Кто-нибудь может дать мне подсказку?

Это мой связанный код:

        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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...