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


Автор: Chef 14.12.2007, 08:25
Да простят меня Модераторы   smile  (поиск в гугле не помог, а в форуме не искал, трафик на нуле  smile )

Проблема такая:
После выполнения SQL команды, если не закрывать текущее соединение с БД, то изминения там присутствую, а после закрытия они магическим образом исчезают  smile 
В БД я новенький, так что PLEASE помогите

Строка SQL и моя процедурка
Код

string sQueryString = @"UPDATE tbl_MusicName " +
                               @"     SET musicName = 'Du Hast UPDATE' " +
                               @"     WHERE musicID = 7";
                ExecutionsQueryToDataGrid(dbConnection, sConnectString, sQueryString, dtGrid);


Код процедурки  выриат 1
Код

OleDbCommand dbCommand = new OleDbCommand(sQuery, dbConnect);
dbCommand.ExecuteNonQuery();


Код процедурки  выриат 2
Код

OleDbDataAdapter dbAdapter = new OleDbDataAdapter(sQuery, _sConnectString);
DataSet DS = new DataSet();
dbAdapter.Fill(DS, "tbl_Music");
dbAdapter.Update(DS,"tbl_MusicName");

Автор: thomas 14.12.2007, 09:47
Chef
Приветствую.
Если Вы поступаете примерно так
Код

// сначала заполняете таблицу в ДатаСет, вместо звездочки имена нужных полей через запятую.
string sQueryString = @"SELECT * FROM tbl_MusicName " ;
OleDbDataAdapter dbAdapter = new OleDbDataAdapter(sQueryString, _sConnectString);
DataSet DS = new DataSet();
dbAdapter.Fill(DS, "Music"); // именовать таблицы в ДатаСет лучше без прификсов, тогда сразу видно какую таблицу имеете в виду.
//Ту что в БД (её имя с префиксом) или ту что в ДатаСет (её имя без префикса)

После того как заполнили таблицу в ДатаСет отобразите данные из нее в DataGriedView или других контролах на форме. Произведите необходимые изменения данных. И после этого вызовите метод Update для вашего ДатаАдаптера. Команду на Update он сгенерирует сам, вам ничего писать не надо.
Код

dbAdapter.Update(DS,"Music");

В крайнем случае создайте обьект CommandBuilder и поручите ему создать команду Update
Код

cmdBuild = new OleDbCommandBuilder(dbAdapter);
dbAdapter.UpdateCommand = cmdBuild.GetUpdateCommand();
dbAdapter.Update(DS,"Music");

Можно перед этим еще выполнить проверку на изменения в ДатаСет
Код

if (DS.HasChanges(DataRowState.Added | DataRowState.Modified))
            {
                lblCount.Text = dbAdapter.Update(DS,"Music").ToString(); // в label получите число обновленных строк в таблице БД
            }

Успехов.

Автор: Chef 14.12.2007, 10:17
thomas,
Спасибо за ответ.
А если мне не надо выводить таблицу в ГРИД, можно ли обойтись без "SELECT * FROM ......"
Просто послать запрос SQL INSERT , UPDATE 

Автор: thomas 14.12.2007, 14:53
Chef
Приветствую.
При добавлении строк в таблицу вызывать данные в ДатаСет нет необходимости. Можно просто дать пользователю ввести данные в текстбоксы, например, и подставив эти значения в запрос INSERT INTO выполнить его при нажатии кнопки или Энтер на последнем текстбоксе.
Для Update по любому надо сначала получить данные из таблицы через селект(это может быть одна строка), показать их пользователю, он что-то там отредактировал и жмет на кнопку сохранить. И тут эти все данные подставляются в запрос Update и он выполняется(это если одна строка). Или вызывается метод Update твоего ДатаАдаптера. И он уже сам выполняет обновление.

Автор: Chef 14.12.2007, 18:32
thomas,
Еще раз спасибо
Сейчас попробую, об результате сообщу

Автор: Chef 14.12.2007, 19:51
thomas,

Что то у меня не получилось вот пример кода
Код

//Запрос возращает 1 запись
string sQueryString = @"SELECT MusicName " +
                                  @"FROM tbl_MusicName " +
                                  @"WHERE MusicID = 7 ";

.......

OleDbDataAdapter dbAdapter = new OleDbDataAdapter(sQuery, _sConnectString);
DataSet DS = new DataSet();
dbAdapter.Fill(DS, "Music");
DS.Tables[0].Rows[0].ItemArray.SetValue("UPDATE BICH !!!!!!!",0); //Пытаюсь изминить
dbAdapter.Update(rows);


Почему не меняет !!!!!!

Автор: thomas 14.12.2007, 21:50
Chef
Ответ http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1016680&SiteID=1
А вообще почему такой "извращенный" способ поменять значение в поле строки?
Почему не написать просто:
Код

DS.Tables[0].Rows[0]["Моё_крутое_поле"] = "UPDATE BICH !!!!!!!";


Добавлено через 11 минут и 53 секунды
Chef
вот тебе http://msdn.microsoft.com/library/rus/default.asp?url=/library/RUS/vbcon/html/vboriIntegratingDataVB.asp на раздел msdn о работе с данными.
Почитай, примеры довольно простые и понятные.

А http://msdn.microsoft.com/library/rus/default.asp?url=/library/RUS/vbcon/html/vbtskupdatingexistingrecordsindataset.asp про обновление данных 

Автор: Chef 14.12.2007, 22:49
Thomas
Похоже мы только с тобой тут и переписываемся  smile 

Мож я немного тупой, может просто сижу только после 23 00 smile 

С ДатаСет все ок, за ето тебе большое спасибо !

Но теперь он не хочет update' тить

Вот многострадальный код
Код

            OleDbDataAdapter adapter = new OleDbDataAdapter();
            adapter.SelectCommand = new OleDbCommand(sQuery, dbConnect);
            OleDbCommandBuilder builder = new OleDbCommandBuilder(adapter);
            
            DataSet DS = new DataSet();
            adapter.Fill(DS,"music");
            DS.Tables[0].Rows[0]["MusicName"] = "UPDATE BICH !!!!!!!";
            adapter.Update(DS, "music");


Thomas,
Если не затруднит напиши работоспособный кусок кода, подобный этому


ПОДОЖДИ ЕЩЕ НЕ ЗАХОДИЛ ПО ТВОИМ ССЫЛКАМ мож все проясниться

Автор: thomas 14.12.2007, 22:59
Chef
вот sQuery это покажи.
Если это select, то должен выполняться метод update для датаАдаптера.

Добавлено @ 23:02
ЗЫ а ты вообще учишься или как?
Если учишься, то где и чему?
Не плохо бы твою программку увидеть, что изучаете?
Можешь в приват отписать. Тогда понятнее будет, о чем с тобой речь вести.

Автор: Chef 15.12.2007, 10:14
Thomas приветсвую.

Учусь на 3 курсе по спецальности Информатик. Углубления в базы данных небыло, но как я понимаю вещь это полезная, и мне потом ой как пригодиться. Поэтому я сижу и занимаюсь само обучением.

Для начала придумал себе програмку такую: типа База Муз Дисков

Состоит из 4 таблиц
tbl_group
groupID  groupName
Счетчик            VCHAR

tbl_disk
diskID  diskName
Счетчик            VCHAR

tbl_MusicName
MusicID  musicName
Счетчик            VCHAR

tbl_Music
MusicID  MusicName MusicDisk MusicGroup
Счетчик             INT              INT             INT

string sQueryString = @"SELECT MusicName FROM tbl_MusicName WHERE MusicID = 7"

Возвращает 1 запись которую нужно изменить

Команда  adapter.UpdateCommand = builder.GetUpdateCommand(); вызывает ошибку

Dynamic SQL generation for the UpdateCommand is not supported against a SelectCommand that does not return any key column information.



Автор: thomas 15.12.2007, 16:11
Chef
Привет.
Вот теперь ронятно
Цитата

not return any key column information.

 В запросе на выборку не было первичного ключа, поэтому и не генериться команда.
Напиши так
Код

SELECT * FROM tbl_MusicName WHERE MusicID = 7


Автор: Chef 15.12.2007, 20:12
Thomas,
Здравствуй

Из составления запроса я понял ключевое поле обязателно, да ?

Теперь все идет без ошибок, в DataSet все меняеться, но в  базу данных он ничего не заносит smile 
Код

             OleDbDataAdapter adapter = new OleDbDataAdapter();
             adapter.SelectCommand = new OleDbCommand(sQuery, dbConnection);
             OleDbCommandBuilder builder = new OleDbCommandBuilder(adapter);

             dbConnection.Open();
             DataSet customers = new DataSet();
             adapter.Fill(customers,"MusicName");

             DataRow[] rw = customers.Tables[0].Select(); // Проверяю че у нас там запрос принес
             customers.Tables[0].Rows[0]["MusicName"] = "UPDATE";
             adapter.Update(customers, "MusicName");

             dbConnection.Close();


Теперь в чем может быть проблема

Автор: Chef 18.12.2007, 10:17
Добавил команду обнавления в адаптер, результата ноль !!!!

Люди срочно помогите !!!  smile нервный срыв будет  smile 
Код

             OleDbDataAdapter adapter = new OleDbDataAdapter();
             adapter.SelectCommand = new OleDbCommand(sQuery, dbConnection);
             OleDbCommandBuilder builder = new OleDbCommandBuilder(adapter);
             adapter.InsertCommand = builder.GetUpdateCommand();
             
             dbConnection.Open();

             DataSet customers = new DataSet();
             adapter.Fill(customers,"MusicName");

             DataRow[] rw = customers.Tables[0].Select(); // смотрим что там твориться
             customers.Tables[0].Rows[0]["nm"] = "UPDATE";

             adapter.Update(customers, "MusicName");
             dbConnection.Close();

Автор: Enuviel 18.12.2007, 15:26
Вот тут точно косяк
adapter.InsertCommand=builder.GetUpdateCommand();

Должно как минимум быть
       adapter.UpdateCommand = builder.GetUpdateCommand();

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