в общем столкнулся с такой проблемой: с# не обновляет данные на сервере. данные в таблице(dagtgridview в программе) изменяются, но на секуль сервере остаются неизменными. при этом никаких exception'ов не вылазит и при перезапуске программы они естественно становяться прежними. как решить подобную проблему? может нужно изменить настройки сервера чтобы он разрешал клиентским приложениям выполнять Insert uзdate запросы? или у меня код неправильно написан: Code: сохранение изменений: private void button1_Click(object sender, EventArgs e) { BindingSource bsrc = new BindingSource(); System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection(); string conn_string = @"Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=kadri;Data Source=DNAPC\SQLEXPRESS"; conn.ConnectionString = conn_string; try { conn.Open(); } catch (Exception exc) { MessageBox.Show(exc.Message); } System.Data.OleDb.OleDbDataAdapter adapt = new System.Data.OleDb.OleDbDataAdapter("SElect * from sotrudnik",conn); DataSet dataset = new System.Data.DataSet(); adapt.Fill(dataset); adapt.UpdateCommand = new System.Data.OleDb.OleDbCommand("UPDATE Sotrudnik set ФИО = ?, Должность= ?, Телефон = ?, Анкета = ?, Договор = ? WHERE ID = ?"); adapt.UpdateCommand.Parameters.Add("ФИО", System.Data.OleDb.OleDbType.VarChar, 10); adapt.UpdateCommand.Parameters.Add("Должность", System.Data.OleDb.OleDbType.VarChar, 10); adapt.UpdateCommand.Parameters.Add("Телефон", System.Data.OleDb.OleDbType.VarChar, 10); adapt.UpdateCommand.Parameters.Add("Анкета", System.Data.OleDb.OleDbType.VarChar, 10); adapt.UpdateCommand.Parameters.Add("Договор", System.Data.OleDb.OleDbType.VarChar, 10); adapt.UpdateCommand.Parameters.Add("ID", System.Data.OleDb.OleDbType.Integer, 10); adapt.UpdateCommand.Connection = conn; adapt.Update(dataset.Tables[0]); } //загрузка в таблицу private void readdata() { BindingSource bsrc = new BindingSource(); System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection(); string conn_string = @"Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=kadri;Data Source=DNAPC\SQLEXPRESS"; conn.ConnectionString = conn_string; try { conn.Open(); } catch (Exception exc) { MessageBox.Show(exc.Message); } System.Data.OleDb.OleDbCommand cmd = new System.Data.OleDb.OleDbCommand(); cmd.Connection = conn; cmd.CommandText = "Select * from sotrudnik"; System.Data.OleDb.OleDbDataAdapter adapt = new System.Data.OleDb.OleDbDataAdapter(cmd); DataSet dataset = new System.Data.DataSet(); adapt.Fill(dataset); conn.Close(); dataGridView1.AutoGenerateColumns = true; bsrc.DataSource = dataset.Tables[0]; dataGridView1.DataSource = bsrc; } public KadrFrm() { InitializeComponent(); readdata(); }
думаеш стоит переименовать поля латинскими симовлами. З.Ы. хочу добавить, что и в Delphi аналогичный код не работал. но там кода собствено нет - просто связанные компоненты ado И оперирование таблицей через tadotable. таблицу оно читало но тоже не изменяло.
Читаем MSDN внимательнее. Делаем аналогично. Code: // Assumes that connection is a valid OleDbConnection object. OleDbDataAdapter adapter = new OleDbDataAdapter(); OleDbCommand selectCMD = new OleDbCommand(selectSQL, connection); adapter.SelectCommand = selectCMD; // Add parameters [B]and set values[/B]. [U]selectCMD.Parameters.Add( "@CountryRegion", OleDbType.VarChar, 15)[B].Value = "UK";[/B][/U] [U]selectCMD.Parameters.Add( "@City", OleDbType.VarChar, 15)[B].Value = "London"[/B];[/U] DataSet customers = new DataSet(); adapter.Fill(customers, "Customers");
сделал как написано на msdn: Code: public DataSet CreateCmdsAndUpdate(string connectionString, string queryString) { using (OleDbConnection connection = new OleDbConnection(connectionString)) { OleDbDataAdapter adapter = new OleDbDataAdapter(); adapter.SelectCommand = new OleDbCommand(queryString, connection); OleDbCommandBuilder builder = new OleDbCommandBuilder(adapter); connection.Open(); DataSet customers = new DataSet(); adapter.Fill(customers); //code to modify data in dataset here adapter.Update(customers); return customers; } } private void button1_Click(object sender, EventArgs e) { try { DataSet ds=CreateCmdsAndUpdate(@"Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Data Source=DNAPC\SQLEXPRESS", @"UPDATE [kadri].[dbo].[table_test] SET [key1] = 1 ,[field] = 'ololol' WHERE key1=1"); } catch (Exception except) { richTextBox1.AppendText(except.Message); } } привыполнениии возникает exception: Операции Update не удалось найти TableMapping["Table"] или DataTable "Table". не пойму в чем проблема? при выполнении аналогичного запроса: возникает та же ошибка. в sql server managment studio оба запроса выполняются корректно
Ты не понимаешь что пишешь видимо. Code: public DataSet CreateCmdsAndUpdate(string connectionString, string queryString) //параметры: строка подключения, строка СЕЛЕКТ { using (OleDbConnection connection = new OleDbConnection(connectionString))// подключаемся к БД { OleDbDataAdapter adapter = new OleDbDataAdapter(); adapter.SelectCommand = new OleDbCommand(queryString, connection); OleDbCommandBuilder builder = new OleDbCommandBuilder(adapter); connection.Open(); DataSet customers = new DataSet(); adapter.Fill(customers); //вот тут заполняем адаптер (используя селект из 2го параметра) [B] //code to modify data in dataset here //ПЕРЕВОД: Тут пиши код который меняет данные в датасете (тут пишешь как должно быть после обновления!)[/B] adapter.Update(customers); //Обновляем return customers; } } Разберись один раз лучше. Хотя если тебе спаммеры на шарпе шлепать, то не слушай меня, копипасть все подряд дальше.
нет.я пишу промышленное приложение на с#, которое будет работать на предприятии(сервак будет иметь базы для каждого отдела(отдел кадров, отдел продаж, финансовый отдел и т.д.), а работники должны будут рулить каждый своей базой) в общем типа 1c только попроще. с# просто недавно начал изучать, а функцию из примера msdn взял