none
Добавление данных в базу RRS feed

  • Вопрос

  • Имеется форма, где выводяться данные в datagridview с помощью кода:

    SqlDataAdapter dataAdapter;

    DataBase db = new DataBase();                  

    DataTable DataTable = new DataTable();

    string sql = db.GetData2(); //тут запрос получаем SqlCommand sqlCommand = db.DoIt(sql, connection1); //выполняем запрос dataAdapter = new SqlDataAdapter(sqlCommand); dataAdapter.Fill(DataTable); dataGridView4.DataSource = DataTable;

    Тут все хорошо работает никаких проблем.

    Имеется вторая форма, с помощью которой добавляю данные в базу с помощью кода:

    SqlCommand thisCommand; string sqlstr = "INSERT INTO personal (fio, fio_eng, email, tel, address, spec_id, salary, busyness) VALUES (@StaffName, @StaffNameEng, @StaffEmail, @StaffPhoneNum, @StaffAddress, 1, 10, 1000)"; thisCommand = new SqlCommand(sqlstr, connection1); thisCommand.Parameters.Add("@StaffName", StaffName); thisCommand.Parameters.Add("@StaffNameEng", StaffNameEng); thisCommand.Parameters.Add("@StaffEmail", StaffEmail); thisCommand.Parameters.Add("@StaffPhoneNum", StaffPhoneNum);

    thisCommand.Parameters.Add("@StaffAddress", StaffAddress); thisCommand.ExecuteNonQuery(); connection1.Close();


    Вот тут, то и возникает проблема. Данные в datagridview добавляются, но вот данные в саму базу не записываются.

    Читал, что нужно воспользоваться методов Update(), но правильно использовать не получилось.

    И еще такое: как правильно передать через 

    thisCommand.Parameters.Add(..., ...);

    данные типа int, float? Возможно нужно переформировать сам запрос?

    Подскажите пожалуйста.

    Спасибо.


    • Изменено WebAction 14 мая 2012 г. 21:59

Ответы

  • Читал, что нужно воспользоваться методов Update(), но правильно использовать не получилось.

    Update работает так же как Fill только в обратном направлении, то есть FIll заполняет локальную таблицу а dataAdapter.Update передаст измененные данные из локальной в исходную таблицу.

    Если Update не работает, то значит у него не верно сформирована команда UpdateCommand. Вот тут я подробно описывал как правильно сформировать Update.


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    • Помечено в качестве ответа Abolmasov Dmitry 6 июня 2012 г. 7:48
    Отвечающий
  • Почитайте еще и эту статью, даст ответы.

    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    • Помечено в качестве ответа Abolmasov Dmitry 6 июня 2012 г. 7:48
    Отвечающий
  • Храниете деньги в сберегательной кассе, а ссылку на форму с загруженными данными в форме с редактированием. Т.е. у второй формы (для редактирования) объявляете поле класса перавой форме и, когда, создаете в первой форме вторую в ее поле присваиваете ссылку на первую форму. На первой форме DataTable, если он у вас переменная метода, делаете свойством. Во второй, закончив редактирование, по имеющейся ссылке на первую форму извлекаете DataTable. Вуаля. Все работает.

    P.s. Кстати, если бы я проектировал ваше приложение, то вторая форма про базы данных у меня бы ничего не знала. Есть форма на которой показывается таблица, есть форма для редактирования. При нажатии на кнопку редактировать на первой форме, она создает вторую, через написанные в ней свойства вида:

    public string LastName
    {
        get
        {
            return tbLastName.Text; // tbLastName - TextBox для ввода фамилии
        }
        set
        {
            tbLastName.Text = value;
        }
    }

    сделал бы передачу зачений для редактирования. А когда пользователь закрыл форму, я бы считал введнные значения из тех же свойств и изменив имеющийся у меня DataTable сохранил бы его. Так делать правильнее, по той причине, что лучше зоны ответственности сжимать. Есть форма для работы с БД, есть форма для редактирования объекта в памяти. При внисении изменений апм будет намного легче, да и разбираться с такой архитектурой проще.
    • Помечено в качестве ответа Abolmasov Dmitry 6 июня 2012 г. 7:48
    Отвечающий

Все ответы

  • Добрый день.

    У меня складывается ощущение, что вы параметры не правильно добавляете. Правильно вот так:

    thisCommand.Parameters.Add("@StaffAddress", typeof(string));
    thisCommand.Parameters["@StaffAddress"].Value = "ну что вы там хотите присвоить";
    Отвечающий
  • Читал, что нужно воспользоваться методов Update(), но правильно использовать не получилось.

    Update работает так же как Fill только в обратном направлении, то есть FIll заполняет локальную таблицу а dataAdapter.Update передаст измененные данные из локальной в исходную таблицу.

    Если Update не работает, то значит у него не верно сформирована команда UpdateCommand. Вот тут я подробно описывал как правильно сформировать Update.


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    • Помечено в качестве ответа Abolmasov Dmitry 6 июня 2012 г. 7:48
    Отвечающий
  • А как правильно применить Update()?

    dataAdapter.Update(DataTable);

    Или как?

  • Почитайте еще и эту статью, даст ответы.

    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    • Помечено в качестве ответа Abolmasov Dmitry 6 июня 2012 г. 7:48
    Отвечающий
  • Уважаемый пользователь, если вы решили проблему с помощью одного из ответов, то пожалуйста пометьте этот ответ (кнопка "Пометить как ответ" под нужным ответом).

    Если решили проблему сами, то поделитесь решением и помете его как ответ.

    Если не решили проблему, пишите почему, будем продолжать помогать.


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    Отвечающий
  • Не могу понять как связать DataSet с DataTable. Сам DataTable обьявлен у меня в отдельной форме, где происходит вывод в DataGridView. Добавление же происходит в другой форме, как можно обратиться к нужному DataTable?

    Update(DataTable.DataSet) - примерно так будет как-то?

  • Примерно да. Update принимает объект DataSet, поэтому должно работать. Если не получится, то нужен будет более подробно описание структуры приложения, что бы можно было понять почему не получается.

    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    Отвечающий
  • Структура такая: форма с DataGridView данные в который выводяться с использованием DataTable через DataAdapter, которые объявлены в этой форме.

    Есть вторая форма, где заполняются поля для добавления. (Вот тут и надо вызвать Update после thisCommand.ExecuteNonQuery(), для DataTable, который объявлен был в другой форме), для обновления содержимого БД.

  • Храниете деньги в сберегательной кассе, а ссылку на форму с загруженными данными в форме с редактированием. Т.е. у второй формы (для редактирования) объявляете поле класса перавой форме и, когда, создаете в первой форме вторую в ее поле присваиваете ссылку на первую форму. На первой форме DataTable, если он у вас переменная метода, делаете свойством. Во второй, закончив редактирование, по имеющейся ссылке на первую форму извлекаете DataTable. Вуаля. Все работает.

    P.s. Кстати, если бы я проектировал ваше приложение, то вторая форма про базы данных у меня бы ничего не знала. Есть форма на которой показывается таблица, есть форма для редактирования. При нажатии на кнопку редактировать на первой форме, она создает вторую, через написанные в ней свойства вида:

    public string LastName
    {
        get
        {
            return tbLastName.Text; // tbLastName - TextBox для ввода фамилии
        }
        set
        {
            tbLastName.Text = value;
        }
    }

    сделал бы передачу зачений для редактирования. А когда пользователь закрыл форму, я бы считал введнные значения из тех же свойств и изменив имеющийся у меня DataTable сохранил бы его. Так делать правильнее, по той причине, что лучше зоны ответственности сжимать. Есть форма для работы с БД, есть форма для редактирования объекта в памяти. При внисении изменений апм будет намного легче, да и разбираться с такой архитектурой проще.
    • Помечено в качестве ответа Abolmasov Dmitry 6 июня 2012 г. 7:48
    Отвечающий
  • А можете привести код по взаимодействию между формами, которые Вы описали? Пробовал разные способы, но получаю ошибку доступа к объекту и прочие. 

    С самим же UPDATE разобрался. А именно: dataAdapter.Update((DataTable)dtgrdvwManageStaff.DataSource);

    Вот как мне из второй формы выполнить такую команду, обращаясь к dataAdapter и dtgrdvwManageStaff первой формы, что бы было все было правильно?

  • А может вам проще объявить dataAdapter и dtgrdvwManageStaff не форме а на уровне приложения в классе Application и обращаться к ним так.

    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    Отвечающий
  • Вот код первой формы:

    public partial class Form1 : Form
    {
    	public Form1()
    	{
    		InitializeComponent();
    	}
    
    	public SqlDataAdapter dataAdapter { get; set; }
    
    	private void button1_Click(object sender, EventArgs e)
    	{
    		Form2 frm = new Form2();
    		frm.dataAdapterFromForm1 = dataAdapter;
    		frm.ShowDialog();
    	}
    }

    Вот код второй:

    public partial class Form2 : Form
    {
    	public Form2()
    	{
    		InitializeComponent();
    	}
    
    	public SqlDataAdapter dataAdapterFromForm1 { get; set; }
    
    	private void button1_Click(object sender, EventArgs e)
    	{
    		dataAdapterFromForm1.Update(...);
    	}
    }

    Но, я бы на вашем месте, лучше бы спросил как сделать по второму из предложенных мной вариантов. ))

    Удачно кодирования.

    Отвечающий
  • Вроде бы уже финиш, но 

    Для обращение к Гриду, который нужно обновить обращаюсь как: 

    MainWindow mw = new MainWindow();
    dataAdapterFromMainWindow.Update((DataTable)mw.dtgrdvwManageStaff.DataSource);

    Ошибка:
    Значение не может быть неопределенным.
    Имя параметра: dataTable

    Если же сделать по аналогии с dataAdapter

    dataAdapterFromMainWindow.Update((DataTable)dtgrdvwManageStaffFromMainWindow.DataSource);

    Ошибка: 

    Ссылка на объект не указывает на экземпляр объекта

    Что я упустил важное?

  • В первом случае, вы создаете новую форму и пытаетесь обратиться к датагриду на ней расположенному. Само собой он пуст. Не создавайте новую форму, а воспользуйтесь уже существующией. Для этого, как у меня в примере для дата адаптера, сделайте тоже самое для MainWindow. Только при передаче ссылки на первую форму во вторую придеться воспользоваться ключевым словом this:

    Form2 frm = new Form2();
    frm.dataAdapterFromForm1 = dataAdapter;
    frm.MainForm = this;
    frm.ShowDialog();

    Отвечающий
  • Тоесть получаем, что-то типа:

    public partial class Form1 : Form { public Form1() { InitializeComponent(); } public SqlDataAdapter dataAdapter { get; set; } private void button1_Click(object sender, EventArgs e) { Form2 frm = new Form2(); frm.dataAdapterFromForm1 = dataAdapter;

    frm.Form1 = this; frm.ShowDialog(); } }


    и 

    public partial class Form2 : Form
    {
    	public Form2()
    	{
    		InitializeComponent();
    	}
    
    	public SqlDataAdapter dataAdapterFromForm1 { get; set; }
    
    	private void button1_Click(object sender, EventArgs e)
    	{
    		dataAdapterFromForm1.Update(...);
    	}
    }

    Оно такого не даст сделать.. Или я не правильно понял, что Вы имели ввиду?

  • Смотрите, на второй форме у вас есть потребность поработать с датаадаптером и гридом (ну или еще чемто) с первой формы. Я вам показал пример, как во вторую форму передать датаадаптер. По аналогичной схеме, объявляя на второй форме свойства и инициализируя их из первой формы перед показом второй, вы можете передать туда и датаадаптер, и датагрид, и, если надо, хоть саму первую форму. Вы же, если брать мой пример, забыли во второй форме объявить свойство:

    public Form1 Form1 { get; set; }
    Отвечающий
  • Поправил, что бы не ругалось, но в базу почему-то не обновляет. Сохраняет данные в гриде, на пару запусков оно храниться, а потом пропадает. В чем может быть проблема?

    public partial class MainWindow : Form
    {
    	public MainWindow()
    	{
    		InitializeComponent();
    	}
    
    	public SqlDataAdapter dataAdapter { get; set; }
    
    	private void button1_Click(object sender, EventArgs e)
    	{
    		Form2 frm = new Form2();
    		frm.dataAdapterFromForm1 = dataAdapter;
    		frm.Form1 = this;
    		frm.ShowDialog();
    	}
    }

    и 

    public partial class Form2 : Form { public Form2() { InitializeComponent(); } public SqlDataAdapter dataAdapterFromForm1 { get; set; }

    public MainWindow MainWindow; private void button1_Click(object sender, EventArgs e) { dataAdapterFromMainWindow.Update((DataTable)MainWindow.dtgrdvwManageStaff.DataSource); } }

  • Здравствуйте, вы разобрались с первоначальной проблемой? Если да - то пожалуйста, отметьте сообщения, которые являются решением проблемы или помогли вам в решении.

    По поводу не сохранения данных - у вас БД это SQL Server или вы используете подключение к файлу?


    Для связи [mail]