Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Базы данных под .NET > Добавление записи в Базу Данных


Автор: D7na 16.6.2011, 00:59
Добрый вечер форумчане. C# учу недавно, в связи с этим возникают дурацкие вопросы, на которые не так просто найти ответы. В общем имеется таблица в БД MSSql в которой всего 2 колонки, и форма на которой: 2 TextBox'a 1 Button и 1 DataGrid. Хотелось бы чтобы данные введенные в TextBox1 и TextBox2, после нажатия на Button, помещались в соответствующие колонки в таблице БД, и отображались в DataGrid'e. База подключена посредством мастера. Интересует код в обработчике событий Button.OnClick.

Автор: MasterOfCode 16.6.2011, 05:38
Уже такой задавали. Например если пролистать страницу вниз, можно увидеть список похожих тем.

Автор: D7na 16.6.2011, 22:55
Пруфлинк в студию

Автор: jonie 17.6.2011, 00:51
http://forum.vingrad.ru/topic-141421.html

Автор: D7na 17.6.2011, 10:29
Добавление данных из textbox в базу MySql. Как я понимаю базы немного разные Вам не кажется?

Автор: D7na 17.6.2011, 11:39
Вот что имеется на данный момент.
При нажатии на кнопку - сообщение об ошибке.

Код

namespace Arbyte
{
    public partial class Form1 : Form
    {
        private SqlDataAdapter dataAdapter;
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // TODO: This line of code loads data into the 'arbyteDataSet.Auth' table. You can move, or remove it, as needed.
            this.authTableAdapter.Fill(this.arbyteDataSet.Auth);
        }
        private void button1_Click(object sender, EventArgs e)
        {
            string s = textBox1.Text;
            string s1 = textBox2.Text;
            if (s == "" || s1 == "")
            {
                MessageBox.Show("Ошибка, не все поля заполнены", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
            else
            {
                SqlConnection con = new SqlConnection();
                con.ConnectionString = "Data Source=localhost;Initial Catalog=arbyte;User Id=root;Password=";
                con.Open();
                SqlCommand InsCom = new SqlCommand("INSERT INTO Auth VALUES (" + Convert.ToInt32(textBox1.Text) + Convert.ToInt32(textBox2.Text), con);
                if (InsCom.ExecuteNonQuery() == 1)
                {
                    MessageBox.Show("Сведения успешно добавлены", "Добавление", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    con.Close();
                }
            }
        }
    }
}

Автор: jonie 17.6.2011, 21:28
Цитата(D7na @  17.6.2011,  11:39 Найти цитируемый пост)

При нажатии на кнопку - сообщение об ошибке.

Ошибка типа "ошибка"? Или предлагаете нам угадать7

Автор: D7na 18.6.2011, 10:01
Цитата(jonie @  17.6.2011,  21:28 Найти цитируемый пост)
Ошибка типа "ошибка"? Или предлагаете нам угадать7 



Не, ошибка "Не удается подключиться к базе данных", видимо connection string неправильный. Сейчас разбираюсь.

Автор: mongoloid 18.6.2011, 10:07
Поставленную задачу - добавление записи в БД  - можно решить множеством способов. Если вы работаете с использованием мастера, то почему бы не использовать преимущества, которые он дает? Самый простой способ:
  Из вкладки "Источники данных" перетащите свою таблицу на форму. Автоматически получите DataGridView и DataBinding, можете добавлять/удалять/менять записи прямо в таблице.
 
 Если вам нужно делать именно так, как написали вы, т.е. кинуть два TextBox"а и через них вводить данные, то можно сделать, например, так:
 
Код

        private void button1_Click(object sender, EventArgs e)
        {
            testDataSet.testRow nrow = (testDataSet.testRow)testDataSet.test.NewRow();
            nrow.id = 2;
            nrow.column1 = Convert.ToInt32(textBox1.Text);
            nrow.column2 = Convert.ToInt32(textBox2.Text);
            testDataSet.test.AddtestRow(nrow);
        }

 Где testDataSet.test - таблица, созданная мастером при подключении источника данных.   testDataSet.testRow.id, testDataSet.testRow.column1, testDataSet.testRow.column2 - это типизированные поля, созданные мастером согласно структуре вашей таблицы (нашем случае для таблицы test вида (id, column1, column2).

 Что касается кода, который вы привели, то сразу, что режет глаз, это текст запроса: с вашим кодом вы не получите запрос вида "INSERT INTO auth VALUES('value1','value2')". Там же ошибка с типами. Для чего конвертация Convert.ToInt32(textBox1.Text)? Она не нужна, и правильно кавычки с запятыми расставьте.

Добавлено через 8 минут и 2 секунды
 Короче говоря, текста запроса должен выглядеть как-то так:
SqlCommand("INSERT INTO Auth VALUES (" + textBox1.Text + ", " + textBox2.Text + ")"); 

 А вот пример работающего кода для Компакт Едишн:
Код

// подключение к БД
connection.ConnectionString = connString;
            try
            { connection.Open(); MessageBox.Show("БД подключена");}
            catch
            { MessageBox.Show("Не удалось подключиться"); }
            
        }
// Вставка данных
SqlCeCommand command = connection.CreateCommand();
            command.CommandText = "INSERT INTO Params([Name], [Comment1], [Comment2]) VALUES ('Параметр1','Комментарий11','Комментарий22')"; 
            int res = command.ExecuteNonQuery();


То, что перечислено в Params([Name], [Comment1], [Comment2]) - необязательно, можно было написать и так: "INSERT INTO Params VALUES ('Параметр1','Комментарий11','Комментарий22')"

Автор: D7na 18.6.2011, 11:35
Mongoloid, огромное Вам спасибо. Все заработало.
Единственное компилятор ругался на строчки
Код

nrow.Login = Convert.ToInt32(textBox1.Text);
nrow.Password = Convert.ToInt32(textBox2.Text);

Сообщением: Cannot implicitly convert type 'int' to 'string'

Заменив их на 
Код

nrow.Login = textBox1.Text;
nrow.Password = textBox2.Text;
 
Все скомпилировалось.

В итоге код обработчика нажатия кнопки выглядит следующим образом:

Код

private void button1_Click(object sender, EventArgs e)
        {
            arbyteDataSet.AuthRow nrow = (arbyteDataSet.AuthRow)arbyteDataSet.Auth.NewRow();
            nrow.Login = textBox1.Text;
            nrow.Password = textBox2.Text;
            arbyteDataSet.Auth.AddAuthRow(nrow);
        }


Как теперь сделать чтобы данные сохранялись в базе после добавления? При закрытии программы и открытии вновь, база данных пустая.

Ответ нашел сам:
Код

private void button2_Click(object sender, EventArgs e)
        {
            authTableAdapter.Update(arbyteDataSet.Auth);
        }

Автор: mongoloid 18.6.2011, 12:14
Код

            nrow.id = 2;
            nrow.column1 = Convert.ToInt32(textBox1.Text);
            nrow.column2 = Convert.ToInt32(textBox2.Text);


 У меня nrow.column1 = Convert.ToInt32(textBox1.Text) только потому, что в таблице test тип полей column1 и column2 - int. Поэтому потребовалось конвертировать. В вашем случае, очевидно, тип полей - string, поэтому все верно, вам не нужно конвертировать.

Автор: D7na 18.6.2011, 14:46
Создал вторую форму, на которой 2 кнопки и 1 DataGridView. Форма предназначена для удаления данных из таблицы. 

А вот с кодом для кнопки удаления записей, проблемы:

Код

private void button1_Click_1(object sender, EventArgs e)
        {
            (arbyteDataSetBindingSource.Current as DataRowView).Row.Delete();
        }


Необходимо чтобы удалялась строка выделенная в DataGrid'e.
При компиляции все нормально. 
При выполнении программы когда я нажимаю на кнопку удаления записи компилятор выдает ошибку:
"Object reference not set to an instance of an object."
Объясните что я делаю не так?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)