powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / C# ODBC DBF: сохранить изменения в dbf-файле
9 сообщений из 9, страница 1 из 1
C# ODBC DBF: сохранить изменения в dbf-файле
    #39153968
olgenur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Открываю dbf-файл dBase III через ODBC , добавляю строку, отображаю в GataGridView - новая строка видна.
Сохраняю изменения в тот же dbf-файл - ошибок не выдает, но файл остался без изменений.
Проблема в где-то в вызовах AcceptChanges или Update?

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
string FilePath = "D:\\path_to_dbf_file\\";
            string DBF_FileName = "file_name.dbf";
            string query = "SELECT * FROM " + FilePath + DBF_FileName;
            OdbcConnection conn = new OdbcConnection();
            conn.ConnectionString = "Driver={Microsoft dBase Driver (*.dbf)};SourceType=DBF;SourceDB=" + FilePath + ";Exclusive=No; NULL=NO;DELETED=NO;BACKGROUNDFETCH=NO;";
            if (conn != null)
            {
                try
                {
                    conn.Open();
                    OdbcDataAdapter adapter = new OdbcDataAdapter(query, conn);
                    DataSet ds = new DataSet();
                    adapter.Fill(ds);
                    DataRow row = ds.Tables[0].NewRow();
                    row["F1"] = "TEST";
                    row["F2"] = "AK3345";
                    row["F3"] = "2760624280";
                    ds.Tables[0].Rows.Add(row);
                    row.AcceptChanges();
                    ds.Tables[0].AcceptChanges();
                    adapter.Update(ds);
                    conn.Close();
                    dataGridView1.DataSource = ds.Tables[0];
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.Message);
                }
            }



Изначально в коде не было DataSet и в гриде все отображалось, но изменения не сохраняются. Обшарил форумы, добавил DataSet - та же фигня.
Помогите пожалуйста починить кто в теме
...
Рейтинг: 0 / 0
C# ODBC DBF: сохранить изменения в dbf-файле
    #39153979
olgenur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Аналогичный код с OLE DB:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
            string FilePath = "D:\\qwerty\\";
            string DBF_FileName = "abc.dbf";
            OleDbConnection conn;
            OleDbDataAdapter oledbAdapter;
            DataSet ds;
            ds = new DataSet();
            string connetionString = null;
            connetionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + FilePath 
                + "; Extended Properties=dBASE III;";
            conn = new OleDbConnection(connetionString);
            try
            {
                conn.Open();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Can not open connection ! " + ex);
            }
            string Sql = "select * from " + DBF_FileName;
            oledbAdapter = new OleDbDataAdapter(Sql, conn);
            oledbAdapter.Fill(ds);
            DataRow row = ds.Tables[0].NewRow();
            row["F1"] = "TEST";
            row["F2"] = "AK3345";
            ds.Tables[0].Rows.Add(row);
            row.AcceptChanges();
            ds.Tables[0].AcceptChanges();
            oledbAdapter.Update(ds);
            conn.Close();
            dataGridView1.DataSource = ds.Tables[0];



Результат тот же. Нифига не пнимаю
...
Рейтинг: 0 / 0
C# ODBC DBF: сохранить изменения в dbf-файле
    #39153980
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
olgenur,

а команды Update, Insert, Delete у адаптера Пушкин настраивать будет?
...
Рейтинг: 0 / 0
C# ODBC DBF: сохранить изменения в dbf-файле
    #39153981
olgenur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Pallaris, так?:
OdbcCommandBuilder cb = new OdbcCommandBuilder(adapter); adapter.UpdateCommand = cb.GetUpdateCommand();

уже что-то проясняется, но как это сделать?
...
Рейтинг: 0 / 0
C# ODBC DBF: сохранить изменения в dbf-файле
    #39153987
olgenur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в выражение типа
Код: sql
1.
2.
3.
UPDATE ShoppingCart
   SET (BookId = @bookid, CustId = @custid, Quantity = @quantity)
WHERE (BookId = @bookid AND CustId = @custid)


вручную подставлять данные типа
Код: c#
1.
2.
3.
string titleKeyword = "%" + txtTitleKeyword.Text + "%";
this.OleDbDataAdapter1.SelectCommand.Parameters[1].Value = titleKeyword;
this.OleDbDataAdapter1.SelectCommand.Parameters["Title_Keyword"].Value = titleKeyword;



я же внес их уже в ds.Tables[0].Rows!
...
Рейтинг: 0 / 0
C# ODBC DBF: сохранить изменения в dbf-файле
    #39154074
olgenur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
почитал http://ru.stackoverflow.com/questions/426279/dataset-не-сохраняет-изменения-в-БД

добавил в код:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
var updCmd = new OdbcCommand(
                        "UPDATE Table SET SBK_FIO = @SBK_FIO, SBK_PAS = @SBK_PAS, SBK_INN = @SBK_INN, SBK_NUM = @SBK_NUM, SBK_SUM = @SBK_SUM;", conn);
                    // Описываем параметры команды. 
                    updCmd.Parameters.Add("@SBK_FIO", OdbcType.NVarChar, 50);
                    updCmd.Parameters.Add("@SBK_PAS", OdbcType.NVarChar, 10);
                    updCmd.Parameters.Add("@SBK_INN", OdbcType.NVarChar, 10);
                    updCmd.Parameters.Add("@SBK_NUM", OdbcType.NVarChar, 16);
                    updCmd.Parameters.Add("@SBK_SUM", OdbcType.Numeric, 18);
                    // Выставляем команду адаптеру.
                    adapter.UpdateCommand = updCmd;
                    adapter.Update(ds);



ошибок не выдает, но эффекта никакого

структура таблицы (поле; тип; длина; знаки после запятой):
SBK_FIO;C;50;0
SBK_PAS;C;10;0
SBK_INN;C;10;0
SBK_NUM;C;16;0
SBK_SUM;N;18;2

HELP
...
Рейтинг: 0 / 0
C# ODBC DBF: сохранить изменения в dbf-файле
    #39154091
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
olgenur
Код: c#
1.
updCmd.Parameters.Add("@SBK_FIO", OdbcType.NVarChar, 50);




Там еще в конструкторе можно указать имя филда, из которого брать данные для параметра
...
Рейтинг: 0 / 0
C# ODBC DBF: сохранить изменения в dbf-файле
    #39154178
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
olgenur,
убери эту фигню

Код: c#
1.
2.
row.AcceptChanges();
            ds.Tables[0].AcceptChanges();
...
Рейтинг: 0 / 0
C# ODBC DBF: сохранить изменения в dbf-файле
    #39155121
olgenur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Pallaris, можно, но можно и без него.
Здесь http://blogs.msdn.com/b/spike/archive/2009/03/02/dataadapter-update-returns-0-and-doesn-t-update-the-table-in-sql-server.aspx обнаружил что AcceptChanges снимает пометки с измененных/добавленных записей, в итоге в базу ничего не попадает если Update делать после него. Закоментировал все аксепты перед апдейтом (ViPRos был прав) - ругнулось что Insert не описан. И его добавил:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
        //row.AcceptChanges();
                    //ds.Tables[0].AcceptChanges();
                    var updCmd = new OdbcCommand(
                        "UPDATE Table SET SBK_FIO = @SBK_FIO, SBK_PAS = @SBK_PAS, SBK_INN = @SBK_INN, SBK_SUM = @SBK_SUM WHERE SBK_NUM = @SBK_NUM;"
                        , conn);
                    updCmd.Parameters.Add("@SBK_FIO", OdbcType.NVarChar, 50);
                    updCmd.Parameters.Add("@SBK_PAS", OdbcType.NVarChar, 10);
                    updCmd.Parameters.Add("@SBK_INN", OdbcType.NVarChar, 10);
                    updCmd.Parameters.Add("@SBK_NUM", OdbcType.NVarChar, 16);
                    updCmd.Parameters.Add("@SBK_SUM", OdbcType.Numeric, 18);
                    adapter.UpdateCommand = updCmd;

                    var insertCmd = new OdbcCommand(
                        //"INSERT INTO Table (SBK_FIO, SBK_PAS, SBK_INN, SBK_NUM, SBK_SUM) VALUES (@SBK_FIO, @SBK_PAS, @SBK_INN, @SBK_NUM, @SBK_SUM);"
                        "INSERT INTO Table VALUES (@SBK_FIO, @SBK_PAS, @SBK_INN, @SBK_NUM, @SBK_SUM);"
                        , conn);
                    insertCmd.Parameters.Add("@SBK_FIO", OdbcType.NVarChar, 50);
                    insertCmd.Parameters.Add("@SBK_PAS", OdbcType.NVarChar, 10);
                    insertCmd.Parameters.Add("@SBK_INN", OdbcType.NVarChar, 10);
                    insertCmd.Parameters.Add("@SBK_NUM", OdbcType.NVarChar, 16);
                    insertCmd.Parameters.Add("@SBK_SUM", OdbcType.Numeric, 18);
                    adapter.InsertCommand = insertCmd;
                    adapter.Update(ds);
                    ds.AcceptChanges();



Теперь ругается на синтаксис INSERT INTO...
пробовал оба варианта INSERT INTO Table (...) ... и INSERT INTO Table VALUES (...)

Возможно проблема в Parameters.Add("@SBK_SUM", OdbcType.Numeric, 18);

Можно ведь автоматически команды настраивать через CommandBuilder, но нужен первичный ключ в базе, не знаю как его в dBaseIII сделать ()
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / C# ODBC DBF: сохранить изменения в dbf-файле
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]