
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.21] |
![]() |
|
![]() |
|
|
Здравствуйте, я новичок в ADO.NET и SQL, сам изучаю C# так что не судите строго... Но конструктивная критика приветствуется.
Я видел подобные вопросы на форуме, но ответы на них мне, к сожалению, не помогли, поэтому решился все таки задать свой вопрос. Пишу простенькую программу для вывода БД MS Access на экран(на DataGridView),с возможностью внесения изменений в БД, с последующим их сохранением. Проблема в сохранения...ошибка, насколько я понял в возврате этих изменений.При ручной проверке сама БД в DataSet(сохранил измененнную БД в xml) меняется, а вот вернуть изменения назад в исходную БД через OleDbDataAdapter не получается...(ну я так думаю) Возможно OleDbCommandBuilder генеруриет не совсем верную sql команду UPDATE, но в sql не силен. (БД состоит из трех столбцов: Номер(ключ), Фамилия, Имя) А вот точное описание ошибки генерируемое соотвествующим исключением : ![]() ![]() При обновлении не удалось найти TableMapping["[table]"] или DataTable "[table]" А если в ![]() ![]() this.adapter.Update(this.dataSet, "[table]"); ![]() ![]() this.adapter.Update(this.dataSet.Tables[0]); А команда UPDATE задана как: ![]() ![]() UPDATE table SET Фамилия = ?, Имя = ? WHERE ((Номер = ?) AND ((? = 1 AND Фамилия IS NULL) OR (Фамилия = ?)) AND ((? = 1 AND Имя IS NULL) OR (Имя = ?))) Ладно это все лирика вот исходный код... ![]() ![]() public partial class Form1 : Form { private DataBase myDB = new DataBase(); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { dataGridView1.DataSource = myDB.Load(textBox1.Text); } private void button2_Click(object sender, EventArgs e) { myDB.Save(); } } class DataBase { private System.Data.OleDb.OleDbConnection connect; private System.Data.DataSet dataSet; private System.Data.OleDb.OleDbDataAdapter adapter; private System.Windows.Forms.BindingSource binding; private System.Data.OleDb.OleDbCommandBuilder cmdBuild; public DataBase() { connect = new System.Data.OleDb.OleDbConnection(); dataSet = new DataSet(); binding = new BindingSource(); } public System.Windows.Forms.BindingSource Load(string dbSource) { //SELECT что_взять FROM откуда_взять string select = "SELECT * FROM [table]"; //* - взять все connect.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + dbSource; //обработчик ошибок : проверка на возможность подключения к БД try { connect.Open(); } catch (Exception ex) { //вывод сообщения об ошибке MessageBox.Show(ex.Message); Application.Exit(); //выход из приложения } adapter = new System.Data.OleDb.OleDbDataAdapter(select, connect); cmdBuild = new System.Data.OleDb.OleDbCommandBuilder(adapter); adapter.UpdateCommand = cmdBuild.GetUpdateCommand(); adapter.Fill(dataSet); binding.DataSource = dataSet.Tables[0].DefaultView; return binding; } public void Save() { try { //кеш БД меняется, но обновить БД пока не получается dataSet.WriteXml("1.xml"); //так для проверки this.binding.EndEdit(); this.adapter.Update(this.dataSet, "[table]"); MessageBox.Show("БД успешно сохранена"); } catch { MessageBox.Show(ex.Message); } } } } (Работаю в среде Microsoft Visual C# 2008, экспресс-выпуск - пакет обновления 1 (SP1) - RUS) Заранее благодарен за любую помощь в решении проблемы. |
![]() |
Сообщ.
#2
,
|
|
Переименуй таблицу. Некошерно использовать служебные слова в именах об'ектов БД.
|
Сообщ.
#3
,
|
|
|
А какой должен быть синтаксис команды SELECT чтобы открывать базу с любым именем?(или это как-то по другому делается)
Или можно как-нибудь через OleDbConnection получить имя подключаемой БД? |
Сообщ.
#4
,
|
|
|
-Added
Цитата MIF @ Переименуй таблицу. Некошерно использовать служебные слова в именах об'ектов БД. спасибо, дал нужное направление |