Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Базы данных под .NET > Обновление БД из потока


Автор: Afrodiziac 24.6.2007, 14:07
Ситуация такова, есть БД, и есть поток. В БД есть одна таблица.
Она обновляется из главного потока приложения с помощью функции

Код

void ФункцияПотока()
{
            ...
            //str - массив SQL строк например 
            //"INSERT INTO `Table` (`Name`, `Value`) VALUES ('Новый клиент',57)"

            for (int i = 0; i < str.Length; i++)
            {
                        TempCommand.CommandText = str[i];
                        TempCommand.ExecuteNonQuery();
            }
            
            ОбновитьБазуДанных();
            ....

}


Код

private void ОбновитьБазуДанных(DataRowState Состояние)
{
            this.datadapter.Update(this.ds.GetChanges(Состояние).Tables[0]);
            this.ds.Clear();
            this.datadapter.Fill(ds, "Cust");
}


В потоке я получаю некоторые строки SQL кода которые я должен выполнить в потоке, но там генерится ошибка на строке 

Код

this.datadapter.Update(this.ds.GetChanges(Состояние).Tables[0]);


во время попытки обновить БД.

Ошибка такая: Object reference not set to an instance of an object.

Обращение к объектам формы осуществить можно с помощью делигатов, использованием метода Invoke(). Но например у datadapter нет такого метода.

PS: Поправил вопрос

Автор: QryStaL 24.6.2007, 14:46
А ошибку указать? Телепаты в отпуске  smile 

Автор: Naum 31.7.2007, 17:48
Afrodiziac, а у тебя  в коде есть где-нибудь строчки типа 
Код

this.datadapter = new SqlDataAdapter(.....);

Автор: ivashkanet 23.8.2007, 14:57
Цитата(Afrodiziac @  24.6.2007,  14:07 Найти цитируемый пост)
this.datadapter.Update(this.ds.GetChanges(Состояние).Tables[0]);

Если именно на этой строчке, то вариантов всего несколько:
Код

1) this.datadapter == null
2) this.ds == null
3) this.ds.GetChanges(Состояние) == null
4) this.ds.GetChanges(Состояние).Tables[0] == null


Чтобы проверить где именно null и, вообще, не сталкиваться с такой проблемой в будущем предлагаю писать так:
Код

DataSet changedData = this.ds.GetChanges(Состояние);

if (changedData.Tables.Length>0)
{
    DataTable firstChangedTable = changedData.Tables[0];

    this.datadapter.Update(firstChangedTable);
}


P.S. Скорости отработки моего (если убрать if) и твоего кода в Релизе(!) отличаться не будут. Компилятор сам соптимизирует эту конструкцию.

Автор: zaver 7.9.2007, 22:30
Цитата(Naum @ 31.7.2007,  17:48)
Afrodiziac, а у тебя  в коде есть где-нибудь строчки типа 
Код

this.datadapter = new SqlDataAdapter(.....);


=)
поищи в дебаггере, что же всетаки not set to an instance of an object должно помочь)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)