Ошиба при Update с через DataAdapter
От: Plac2006  
Дата: 07.06.10 07:48
Оценка:
Здравствуйте,

возникла следующая проблема.
Нарисовал простую форму на C# в MSVC 2005.
DataGridView и две кнопки. Одна загружает данные, другая обновляет.
Программа падает на вызове Update. Возникает InvalidOperationException со словами:
{"Динамическое создание SQL для UpdateCommand не поддерживается для SelectCommand, не возвращающей никаких сведений о столбце ключей."}
Не понимаю как исправить. Пробовал разные способы, через DataTable, но везде одно и тоже возникает. Поиском решений тоже не нашёл.

Прописывать команды вручную явно не хочу.

using System;
using System.Data;
using System.Windows.Forms;
using System.Data.OracleClient;

namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        OracleConnection oraConn = new OracleConnection("Data Source=PRODUCT;Persist Security Info=True;User ID=XXMYUSER;Unicode=True;Password=XXMYPWD;");
        OracleDataAdapter orda = null;
        OracleCommandBuilder builder = null;
        DataSet ds = new DataSet(); 
        public Form1()
        {
            InitializeComponent();            
        }

        private void button2_Click(object sender, EventArgs e)
        {            
            if (!ds.HasChanges())
                return;

            DataRow[] rows = ds.Tables[0].Select(null, null, DataViewRowState.ModifiedCurrent);
            orda.Update(rows);        //    <--- тут падение
        }

        private void button1_Click(object sender, EventArgs e)
        {            
            orda.Fill(ds, "FRM_TOTAL");
            dataGridView1.DataSource = ds.Tables[0];
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            oraConn.Close();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            oraConn.Open();
            orda = new OracleDataAdapter("select Id, Total_type_name, Total_table_name from FRM_TOTAL", oraConn);
            builder = new OracleCommandBuilder(orda);        }
    }
}


Заранее спасибо.
Re: Ошиба при Update с через DataAdapter
От: _FRED_ Черногория
Дата: 07.06.10 07:58
Оценка:
Здравствуйте, Plac2006, Вы писали:

P>возникла следующая проблема.

P>Нарисовал простую форму на C# в MSVC 2005.
P>DataGridView и две кнопки. Одна загружает данные, другая обновляет.
P>Программа падает на вызове Update. Возникает InvalidOperationException со словами:
P>{"Динамическое создание SQL для UpdateCommand не поддерживается для SelectCommand, не возвращающей никаких сведений о столбце ключей."}

P>Не понимаю как исправить. Пробовал разные способы, через DataTable, но везде одно и тоже возникает. Поиском решений тоже не нашёл.


А что конкретно вы хотели бы или считаете нужным исправить?

P>Прописывать команды вручную явно не хочу.


Если нет возможности создать первичный ключ в таблице, то тогда надо выписть какой-нибудь свой или взять какой-нибудь другой билдер.
Help will always be given at Hogwarts to those who ask for it.
Re[2]: Ошиба при Update с через DataAdapter
От: Plac2006  
Дата: 07.06.10 08:03
Оценка:
Здравствуйте, _FRED_, Вы писали:

P>>{"Динамическое создание SQL для UpdateCommand не поддерживается для SelectCommand, не возвращающей никаких сведений о столбце ключей."}


P>>Не понимаю как исправить. Пробовал разные способы, через DataTable, но везде одно и тоже возникает. Поиском решений тоже не нашёл.


_FR>А что конкретно вы хотели бы или считаете нужным исправить?


Я хочу, чтоб я мог загрузить теблицу в DataGridView, там её редактировать и потом загружать результат в базу.

P>>Прописывать команды вручную явно не хочу.


_FR>Если нет возможности создать первичный ключ в таблице, то тогда надо выписть какой-нибудь свой или взять какой-нибудь другой билдер.


В таблице в базе ключ есть (тот самый Id). Если он не подходит, то как создать?
Или какой другой билдер можно брать?
Re[3]: Ошиба при Update с через DataAdapter
От: _FRED_ Черногория
Дата: 07.06.10 08:32
Оценка:
Здравствуйте, Plac2006, Вы писали:

P>>>{"Динамическое создание SQL для UpdateCommand не поддерживается для SelectCommand, не возвращающей никаких сведений о столбце ключей."}

P>>>Не понимаю как исправить. Пробовал разные способы, через DataTable, но везде одно и тоже возникает. Поиском решений тоже не нашёл.
_FR>>А что конкретно вы хотели бы или считаете нужным исправить?

P>Я хочу, чтоб я мог загрузить теблицу в DataGridView, там её редактировать и потом загружать результат в базу.


Ага, то есть не знаете, что нужно исправлять.

P>>>Прописывать команды вручную явно не хочу.

_FR>>Если нет возможности создать первичный ключ в таблице, то тогда надо выписть какой-нибудь свой или взять какой-нибудь другой билдер.
P>В таблице в базе ключ есть (тот самый Id). Если он не подходит, то как создать?
P>Или какой другой билдер можно брать?

Если есть в БД — уже хорошо. Почитайте внимательно этот вот (второй в секции Remarks) абзац из документации к классу, которым собираетесь пользоваться:

When the OleDbDataAdapter fills a DataSet, it will create the appropriate tables and columns for the returned data if they do not already exist. However, primary key information is not included in the implicitly created schema unless the MissingSchemaAction property is set to AddWithKey. You may also have the OleDbDataAdapter create the schema of the DataSet, including primary key information, before filling it with data using FillSchema. For more information, see Adding Existing Constraints to a DataSet (ADO.NET).


здесь.
Help will always be given at Hogwarts to those who ask for it.
Re[4]: Ошиба при Update с через DataAdapter
От: Plac2006  
Дата: 07.06.10 11:29
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Если есть в БД — уже хорошо. Почитайте внимательно этот вот (второй в секции Remarks) абзац из документации к классу, которым собираетесь пользоваться:

_FR>

_FR>When the OleDbDataAdapter fills a DataSet, it will create the appropriate tables and columns for the returned data if they do not already exist. However, primary key information is not included in the implicitly created schema unless the MissingSchemaAction property is set to AddWithKey. You may also have the OleDbDataAdapter create the schema of the DataSet, including primary key information, before filling it with data using FillSchema. For more information, see Adding Existing Constraints to a DataSet (ADO.NET).

_FR>здесь.

Прочёл. Ещё прочитал это и >это [.
Попробовал добавить строку
orda.MissingSchemaAction = MissingSchemaAction.AddWithKey;
и убрал OracleCommandBuilder

Вылезает ошибка
{Для обновления требуется действительный UpdateCommand при передаче коллекции DataRow с измененными строками}.

Я не понимаю что делать. Попробовал взять пример для работы с с UpdateCommand и запустить у себя поменяв только имена таблиц и полей.
Вылезает {неправильное имя/номер переменной}. Вроде проверил несколько раз.

Может я чего-то не понимаю глобально? Можно вообще не прописывая руками явно запросов сделать обновление таблицы в базе из DataGridView?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.