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


Автор: alexburzak 12.3.2007, 18:36
я хотел обновить в своей базе данных DataSet который создал раньше.
Вот смотрите вложения, на строчке: "objAdapter.UpdateCommand = objBuilder.GetUpdateCommand" вылитает с криком: «Dynamic SQL generation for the UpdateCommand is not supported against a SelectCommand that does not return any key column information.» 
Видемо я не понимаю , что я делаю.
Пожалуйста наставьте меня на путь истинный!
Что я делаю не так?

Автор: Naum 13.3.2007, 10:50
Пока не смотрел вложение. Но по ошибке можно кое-что сказать. Если для DbAdapter'а явно не задается команда UpdateCommand, то эта команда генерится автоматически на основании команды SelectCommand. Видимо твоя команда SelectCommand не предоставляет информации о ключевых полях в таблице. Скорее всего в таблице (в самой бд они - ключевые поля - просто не заданы). Есть два выхода или задать эти ключевые поля, или явно задать команду UpdateCommand.

Автор: alexburzak 14.3.2007, 17:41
Да наверное, это то что происходит (результат моего дебага), можно пример кода, что бы я понял что происходит, плиз(посмотри вложения)? Влюбом случаии спасибо.

Автор: Naum 15.3.2007, 14:11
Цитата

strSQL = "SELECT CompanyName, Phone FROM Shippers;"

Если у тебя в базе в таблице Shippers есть ключевое поле, то его надо добавить в select-команду. Например, ключевое поле CompanyID.
Код

strSQL = "SELECT CompanyID, CompanyName, Phone FROM Shippers;"

Если ключевого поля в таблице Shippers исходной базы нет, тогда его надо добавить. Если же добавлять ключевое поле по какой-либо причине не хочется (я, правда, не знаю ни одной такой причины), то надо ручками дописать комманды INSERT, UPDATE, DELETE.
Допустим CompanyName у нас уникальное для каждой записи (правда не понятно, почему бы не сделать тогда его ключевым полем).
Тогда 
Код

Dim sqlInsertCommand As New SqlCommand("INSERT INTO Shippers ( CompanyName, Phone) VALUES (@CompanyName, @Phone)", objConnection)
sqlInsertCommand.Parameters.Add(New SqlParameter("@CompanyName", SqlDbType.NVarChar, 0, "CompanyName") 
sqlInsertCommand.Parameters.Add(New SqlParameter("@Phone", SqlDbType.NVarChar, 0, "Phone") 
Dim sqlUpdateCommand As New SqlCommand("UPDATE Shippers SET Phone = @Phone WHERE CompanyName LIKE @CompanyName", objConnection)
sqlUpdateCommand.Parameters.Add(New SqlParameter("@CompanyName", SqlDbType.NVarChar, 0, "CompanyName") 
sqlUpdateCommand.Parameters.Add(New SqlParameter("@Phone", SqlDbType.NVarChar, 0, "Phone") 
Dim sqlDeleteCommand As New SqlCommand("DELETE FROM Shippers WHERE CompanyName LIKE @CompanyName", objConnection)
sqlDeleteCommand.Parameters.Add(New SqlParameter("@CompanyName", SqlDbType.NVarChar, 0, "CompanyName") 
objAdapter.InsertCommand = sqlInsertCommand
objAdapter.UpdateCommand = sqlUpdateCommand
objAdapter.DeleteCommand = sqlDeleteComman

Автор: alexburzak 16.3.2007, 10:23
Огромное спасибо, все так и оказалось.
Ни в одной книжке я этого не нашел.
Этот вопрос решен, но я накалякал еще один в тему:
http://forum.vingrad.ru/topic-141392/kw-dataset.html
Это таже область, плиз посмотреть , что можно сделать.

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