DataAdapter.Update () возвращает 1 без обновления базы данных - PullRequest
1 голос
/ 20 марта 2012

Извините, если на этот вопрос уже был дан ответ, но я нигде не могу найти решение. Скорее всего, это что-то очевидное, но теперь я ослеплен своим собственным кодом.

Я пытаюсь обновить свою базу данных информацией из некоторых текстовых полей. Во время отладки я вижу, что строка DataTable обновляется с изменениями, а dataadapter.update возвращает 1. Но когда я проверяю свою базу данных после слов, она не имеет изменений. Странно то, что он работает на моем первом вызове обновления, но не на другом.

Я закрываю соединения после использования.

Я пробовал несколько разных способов сделать это, но независимо от того, что я пытаюсь, я не могу заставить это работать. Я создал его как можно равнее (как я новичок в этом) тому, кто работает, но все еще ничего. Я также попытался создать собственную команду обновления для обновления.

Это моя команда:

    private SqlCeCommand createCharInstanceCommand()
    {
        SqlCeCommand updateCommand = new SqlCeCommand();
        updateCommand.CommandText = "UPDATE [CharacterClassInstance] SET " +
            "[CharID] = @p1, [ClassID] = @p2, [Lvl] = @p3, [SpellsKnown0] = @p4, [SpellsKnown1] = @p5, [SpellsKnown2] = @p6, " +
            "[SpellsKnown3] = @p7, [SpellsKnown4] = @p8, [SpellsKnown5] = @p9, [SpellsKnown6] = @p10, [SpellsKnown7] = @p11, " +
            "[SpellsKnown8] = @p12, [SpellsKnown9] = @p13, [SpellsPrDay0] = @p14, [SpellsPrDay1] = @p15, [SpellsPrDay2] = @p16, " +
            "[SpellsPrDay3] = @p17, [SpellsPrDay4] = @p18, [SpellsPrDay5] = @p19, [SpellsPrDay6] = @p20, [SpellsPrDay7] = @p21, " +
            "[SpellsPrDay8] = @p22, [SpellsPrDay9] = @p23, [SpellSaveDC0] = @p24, [SpellSaveDC1] = @p25, [SpellSaveDC2] = @p26, " +
            "[SpellSaveDC3] = @p27, [SpellSaveDC4] = @p28, [SpellSaveDC5] = @p29, [SpellSaveDC6] = @p30, [SpellSaveDC7] = @p31, " +
            "[SpellSaveDC8] = @p32, [SpellSaveDC9] = @p33, [BonusSpell1] = @p34, [BonusSpell2] = @p35, [BonusSpell3] = @p36, " +
            "[BonusSpell4] = @p37, [BonusSpell5] = @p38, [BonusSpell6] = @p39, [BonusSpell7] = @p40, [BonusSpell8] = @p41, [BonusSpell9] = @p42 " +
            "WHERE ([ClassInstanceID] = @p43)";

        for (int i = 1; i <=43;i++)
        {
            if (i == 43) updateCommand.Parameters.AddWithValue("@p43", chosenClassInstance);
            else updateCommand.Parameters.AddWithValue("@p" + i, dClassInstance.Rows[chosenClassInstance - 1].ItemArray.GetValue(i).ToString());
        }
        return updateCommand;
    }

Вот код, который должен обновлять таблицу (я думаю, номер версии 8). В качестве одной из последних попыток я добавил rowmodified, поскольку не было уверенности в том, что по какой-то причине строка зарегистрирована как измененная.

    private void updateClassInstance()
    {
        DataRow row = dClassInstance.Rows[chosenClassInstance - 1];

        for (int i = 4; i <= 42; i++)
        {
            if (i <= 23) row[i] = Convert.ToInt32(spellInfoBoxes[i - 4].Text);
            if (i >= 34) row[i] = Convert.ToInt32(spellInfoBoxes[i - 14].Text);
        }
        try 
        { 
            dClassInstance.Rows[chosenClassInstance - 1].AcceptChanges(); 
            dClassInstance.Rows[chosenClassInstance - 1].SetModified(); 
        }
        catch { }

        int spellinfotest = this.classDataAdapter.Update(dClassInstance);
        this.classConnection.Close();
    }

Создание адаптера данных и команды.

    private void fillSpellInfo()
    {
        classConnection = new SqlCeConnection(sConnectionString);

        string sqlClassInstance = "SELECT * " +
                                    "FROM CharacterClassInstance " +
                                    "WHERE (CharID = " + iCharacterID + 
                                    //") AND (ClassInstanceID = "+chosenClassInstance+
                                    ")";

        SqlCeCommand selectClassInstance = classConnection.CreateCommand();
        selectClassInstance.CommandText = sqlClassInstance;

        this.classConnection.Open();

        classDataAdapter = new SqlCeDataAdapter(selectClassInstance);
        //SqlCeCommandBuilder cb = new SqlCeCommandBuilder(classDataAdapter);



        //classDataAdapter.UpdateCommand = cb.GetUpdateCommand();


        dClassInstance = new DataTable();

        classDataAdapter.Fill(dClassInstance);

        classDataAdapter.UpdateCommand = createCharInstanceCommand();

        dClassInstance.DefaultView.RowFilter = "ClassInstanceID = " + chosenClassInstance;

        setSpellInfoValues();
        this.classConnection.Close();
    }

По какой-то причине он работает со стандартной сгенерированной командой на другом адаптере данных.

Буду признателен за любую помощь.

1 Ответ

1 голос
/ 22 марта 2012

Я наконец понял, почему мой код не работает. Проблема заключается в построении команды UpdateCommand, точнее в назначении параметров. В моих ограниченных знаниях я слепо следовал примеру и не видел ошибки, пока сам не написал обновление для другой коллекции полей.

То, что произошло, было то, что параметры получили старые значения, потому что они были добавлены, когда я строил DataAdapter, а не после того, как обновления были сделаны. Я подозреваю, что есть лучшие способы назначения переменных, чем addWithValue (), но по крайней мере это работает прямо сейчас;) Живи и учись, кто-то сказал:)

Чтобы решить мою проблему, я переместил этот код

classDataAdapter.UpdateCommand = createCharInstanceCommand();

в ту часть, где я запускаю обновление:

        private void updateClassInstance()
    {
        DataRow row = dClassInstance.Rows[chosenClassInstance - 1];

        for (int i = 4; i <= 42; i++)
        {
            if (i <= 23) row[i] = Convert.ToInt32(spellInfoBoxes[i - 4].Text);
            if (i >= 34) row[i] = Convert.ToInt32(spellInfoBoxes[i - 14].Text);
        }
        try
        {
            dClassInstance.Rows[chosenClassInstance - 1].AcceptChanges();
            dClassInstance.Rows[chosenClassInstance - 1].SetModified();
        }
        catch { }

        classDataAdapter.UpdateCommand = createCharInstanceCommand();
        classDataAdapter.UpdateCommand.Connection = classConnection;

        int spellinfotest = this.classDataAdapter.Update(dClassInstance);
        this.classConnection.Close();
    }
...