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


Автор: Vitkaz 1.4.2009, 22:21
    Привет всем! Недавно начал изучать C#. Сейчас создаю базу данных, для чего проделал следующее: создал таблицы и связи между ними в SQL Server 2005, в Visual Studio 2008 установил соединение с сервером, создал форму, которая содержит Grid, textbox`ы и кнопку "Добавить клиента". Как добавить новую запись в таблицу я не знаю ? Помогите пожалуйста написать содержимое события button1_Click. 

Автор: Rififi 1.4.2009, 23:40
Vitkaz, 
есть несколько способов
в самом простом случае - создать объект Command и выполнить sql-запрос INSERT INTO

скачай/купи любую книгу с названием ADO.NET 2.0, например Professional ADO.NET 2, Pro ADO.NET 2.0 ..., или от папиков - Programming Microsoft® ADO.NET 2.0, причём многие из них имеются в переводном виде.
там всё это описано 

Автор: kuller 2.4.2009, 09:20
Цитата

Как добавить новую запись в таблицу я не знаю ? Помогите пожалуйста написать содержимое события button1_Click.  


Цитата

в самом простом случае - создать объект Command и выполнить sql-запрос INSERT INTO


Ну вот тебе пример добавления ЗАПИСИ в таблицу Список_блюд  в БД kafe.mdb:
(тут добавляемые данные вводятся в ТЕКСТБОКСЫ и также значения берутся с КОМБОБОКСОВ, по нажатию на кнопку происходит добавление данных)

Код
 
private void button1_Click(object sender, EventArgs e)
        {
            string s = textBox1.Text;
            string s1 = textBox3.Text;
            string s2 = textBox4.Text;
            if (s == "" || s1 == "" || s2 == "")
            {
                MessageBox.Show("Ошибка, не все поля заполнены", "Добавление блюда", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
            else
            {
                OleDbConnection con = new OleDbConnection();
                con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + @"..\..\kafe.mdb";
                con.Open();
                OleDbCommand InsCom = new OleDbCommand("INSERT INTO Список_блюд VALUES (" + Convert.ToInt32(label2.Text) + ",'" + textBox1.Text + "','" + comboBox1.Text + "','" + textBox3.Text + "'," + Convert.ToSingle(textBox4.Text) + ")", con);
                if (InsCom.ExecuteNonQuery() == 1)
                {
                    MessageBox.Show("Сведения успешно добавлены", "Добавление", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    con.Close();
                }
            }
        }

P.S. using System.Data.OleDb

Автор: Vitkaz 2.4.2009, 15:38
Изменил код, который дал kuller. Пробую пока ввести только ИНН. 
Код

private void button1_Click(object sender, EventArgs e)
        {
            string s = textBox1.Text;
            
            if (s == "")
            {
                MessageBox.Show("Ошибка, не все поля заполнены", "Добавление блюда", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
            else
            {
                OleDbConnection con = new OleDbConnection();
                con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + @"D:\Bank\Database.mdf";
                con.Open();
                OleDbCommand InsCom = new OleDbCommand("INSERT INTO clients(InnCl) VALUES (" + textBox1.Text + ")", con);
                if (InsCom.ExecuteNonQuery() == 1)
                {
                    MessageBox.Show("Сведения успешно добавлены", "Добавление", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    con.Close();
                }
            }
        }


При добавлениии ругается на строку con.Close(). Пишет следующее сообщение: System.Data.OleDb.OleDbException не обработано
  Message="Невозможно использовать ''; файл уже используется."

Автор: kuller 2.4.2009, 19:08
Vitkaz, попробуйте заносить значения ни в 1 поле таблицы clients(InnCl), а во все и будьте внимательны с ТИПАМИ, из-за неправильного типа заносимых данных чаще всего и бывают ошибки!!!!

Автор: Vitkaz 2.4.2009, 20:28
Чтобы с преобразованиями типов не напутать, я создал таблицу всего с одним полем и попробовал добавить запись, но возникает та же ошибка.

Автор: kuller 2.4.2009, 21:15
Цитата

Чтобы с преобразованиями типов не напутать, я создал таблицу всего с одним полем и попробовал добавить запись, но возникает та же ошибка. 



Vitkaz, Ваше поле в которое Вы в данный момент пытаетесь добавить значение КАКОГО ТИПА????

Автор: Vitkaz 2.4.2009, 21:34
Тип nchar(10). У меня были проблемы с соединением, но теперь соединение устанавливается, но записи добавить не получается.
Решил добавить запись, используя SqlCommand, но не знаю,  что писать после SqlCommand command = new SqlCommand(queryString, con);
Код

private void button1_Click(object sender, EventArgs e)
        {
            string s = textBox1.Text;

            if (s == "")
            {
                MessageBox.Show("Ошибка, не все поля заполнены", "Добавление блюда", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
            else
            {
                SqlConnection con = new SqlConnection("Data Source=HP\\SQLEXPRESS;Initial Catalog=Database;Integrated Security=True");
               

                con.Open();
                if (con.State==ConnectionState.Open)
                {
                    MessageBox.Show("Соединение установлено", "Соединение", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    string queryString = "INSERT INTO Table(inn) VALUES (" + textBox1.Text + ")";
                    SqlCommand command = new SqlCommand(queryString, con);
                   /[color=red]/ ЧТО НАПИСАТЬ ДАЛЬШЕ НЕ ЗНАЮ.[/color]
                    con.Close();
                }
            }

        }

Автор: kuller 2.4.2009, 21:39
Vitkaz, если Вы вставляете ТЕКСТ, то дорлно быть так записано в SQL-запросе:
'" + textBox1.Text + "', т.е. кавычки ОДИНАРНЫЕ затем ДВОЙНЫЕ .

Автор: Vitkaz 2.4.2009, 22:18
Цитата(kuller @ 2.4.2009,  21:39)
Vitkaz, если Вы вставляете ТЕКСТ, то дорлно быть так записано в SQL-запросе:
'" + textBox1.Text + "', т.е. кавычки ОДИНАРНЫЕ затем ДВОЙНЫЕ .

Пробовал не помогает.

Автор: KelTron 3.4.2009, 04:58
Код

using (SqlConnection conn = new SqlConnection("Data Source=HP\\SQLEXPRESS;Initial Catalog=Database;Integrated Security=True"))
            {
                string queryString = "INSERT INTO Table(inn) VALUES (" + textBox1.Text + ")";

                SqlCommand command = new SqlCommand(queryString, conn);
                conn.Open();
                command.ExecuteNonQuery();
            }


Но лучше использовать параметизированные запросы:

Код

using (SqlConnection conn = new SqlConnection("Data Source=HP\\SQLEXPRESS;Initial Catalog=Database;Integrated Security=True"))
            {
                string queryString = "INSERT INTO Table(inn) VALUES (@inn)";

                SqlCommand command = new SqlCommand(queryString, conn);
                command.Parameters.AddWithValue("@inn", textBox1.Text);
                conn.Open();
                command.ExecuteNonQuery();
            }

                    
                   

Автор: Vitkaz 3.4.2009, 07:03
KelTron, спасибо за рекомендацию. После учебы попробую.


Автор: Vitkaz 3.4.2009, 15:00
Если пишу так,
Код

 using (SqlConnection conn = new SqlConnection("Data Source=HP\\SQLEXPRESS;Initial Catalog=Database;Integrated Security=True"))
                {
                    string queryString = "INSERT INTO Table(inn) VALUES (@inn)";

                    SqlCommand command = new SqlCommand(queryString, conn);
                    command.Parameters.AddWithValue("@inn", textBox1.Text);
                    conn.Open();
                    command.ExecuteNonQuery();
    
                 }

то ругается на строчку command.ExecuteNonQuery(); "Неправильный синтаксис около ключевого слова "Table"."

Ещё пробовал описать  CreateCommand(string queryString,string connectionString) в класее Program в Program.cs, не знаю как обратиться к CreateCommand с формы.
 
Код

private static void CreateCommand(string queryString,
            string connectionString)
        {
            using (SqlConnection connection = new SqlConnection(
                       connectionString))
            {
                SqlCommand command = new SqlCommand(queryString, connection);
                command.Connection.Open();
                command.ExecuteNonQuery();
            }
        }

Автор: Idsa 3.4.2009, 15:32
Цитата(Vitkaz @  3.4.2009,  19:00 Найти цитируемый пост)
Неправильный синтаксис около ключевого слова "Table"

А у Вас точно есть таблицы Table? И если она даже есть, лучше взять ее в квадратные скобки:
Код

INSERT INTO [Table](inn) VALUES (@inn)

, ибо Table - это зарезервированное слово.

Автор: Vitkaz 3.4.2009, 15:36
 Спасибо, Idsa! Причина была в этом.

Автор: Vitkaz 3.4.2009, 18:35
 А если использовать параметизированные запросы, как KelTron посоветовал, нужно ли производить преобразования типов ?

Автор: Idsa 3.4.2009, 19:02
Vitkaz, провайдеры обычно умные, поэтому реализуют приведение типов... но, конечно, в разумных пределах.

Автор: Vitkaz 3.4.2009, 20:20
С добавлением всё получилось. Скажите пожалуйста, а как сделать refresh т.е. чтобы внесенные изменения отобразились в Grid`е после добавления ? Попробовал делать, как ранее делал в FoxPro: this.dataGridView1.Refresh();, но что-то не получается.  

Автор: KelTron 4.4.2009, 09:38
Vitkaz, метод Refresh() заставляет грид перерисовать себя )

Как делать обновление грида зависит от того как ты биндишь к нему данные.

Могу предположить, что в твоём случае подойдёт такой код:

Код

private void button1_Click(object sender, EventArgs e)
{
   //...
   // Здесь мы добавили данные в таблицу
   //...

   // Теперь обновляем грид
    this.dataGridView.DataSource = GetTableData(connStr);
}

private DataTable GetTableData(string connStr) 
{
    string queryString = "SELECT * FROM [Table]";

    SqlConnection conn = new SqlConnection(connStr);
    SqlDataAdapter adapter = new SqlDataAdapter(queryString, conn);
    DataTable table = new DataTable();
    adapter.Fill(table);

    return table;
}




Автор: Vitkaz 4.4.2009, 22:44
На форме есть кнопки "Сохранить изменения" и "Удалить клиента", скажите пожалуйста:
1)Как после внесения изменений  в сетке Grid и кликнув соответствующую кнопку, сохранить эти изменения в БД. 
2)Как, выбрав строку в Grid`е и ---||---||---, удалить соответствующую запись из БД.
Данные принадлежат одной таблице. Если нетрудно, скажите как проделать тоже самое, когда данные принадлежат нескольким таблицам.

Надоел наверное с вопросами, понимаю что во многом можно разобраться самому, просто время ограничено. После сдачи сессии думаю заняться изучением .NET более полно.


Автор: Vitkaz 12.4.2009, 15:36
 Не стал создавать новую тему. Возникла следующая проблема: мне нужно сделать запрос и результат этого запроса добавить в таблицу. Я решил посмотреть содержимое запроса, поместив результат в TextBox, но при выполнении ругается на строку  textBox13.Text = reader[0].ToString();  "Недопустимая попытка чтения при отсутствии данных."
Код

  string connectionString = "Data Source=HP\\SQLEXPRESS;Initial Catalog=Database;Integrated Security=True";
         using (SqlConnection Connection = new SqlConnection(
                       connectionString))
            {
                SqlCommand command = new SqlCommand("SELECT DISTINCT MinSumma ,MinSummaDop AS 'Минимальная сумма доп. взноса',Srok AS 'Срок вклада',PercentRate AS 'Прцентная ставка' FROM Rate,ListContrib,Currency WHERE NameVklad=@NameVklad AND NameFull=@NameFull AND Rate.KodVklad=ListContrib.KodVklad AND Rate.KodCur=Currency.KodCur", Connection);
                command.Parameters.AddWithValue("@NameVklad", comboBox3.Text);
                command.Parameters.AddWithValue("@NameFull", comboBox1.Text);
                Connection.Open();
                SqlDataReader reader = command.ExecuteReader();
                
                textBox13.Text = reader[0].ToString(); 
                Connection.Close();
                {
                    
                    reader.Close();
                }
            }

Пробую выводить этот запрос в Grid, все нормально. Подскажите пожалуйста, что не так.

Автор: KelTron 13.4.2009, 06:55
Перед чтением данных из датаридера нужно вызвать метод Read

Код

SqlDataReader reader = command.ExecuteReader();
 
if (reader.Read()) // Если в ридере есть какие нить данные то Read вернёт true
{               
        textBox13.Text = reader[0].ToString();
}


если у тебя в результате возвращается множество записей то их все нужно читать в цикле:

Код

 
while (reader.Read()) 
{               
        //читаем данные...
}

Автор: Vitkaz 13.4.2009, 16:34
Понял. Спасибо!  smile 

Автор: Vitkaz 26.4.2009, 14:55
Заполняю Combobox, который зависит от выбранной строки в другом Combobox`е . Вот фрагмент кода.
Код

SqlDataReader readKodVklad = comKodVklad.ExecuteReader();
                while (readKodVklad.Read())
                {
                    comboBox8.Items.Add(readKodVklad[0].ToString()); 
                }
                
                {readKodVklad.Close();
                }

Подскажите, как перед заполнением Combobox`а очистить его содержимое.

Автор: Vitkaz 26.4.2009, 15:10
Цитата(Vitkaz @ 26.4.2009,  14:55)
Заполняю Combobox, который зависит от выбранной строки в другом Combobox`е . Вот фрагмент кода.
Код

SqlDataReader readKodVklad = comKodVklad.ExecuteReader();
                while (readKodVklad.Read())
                {
                    comboBox8.Items.Add(readKodVklad[0].ToString()); 
                }
                
                {readKodVklad.Close();
                }

Подскажите, как перед заполнением Combobox`а очистить его содержимое.

Уже нашел comboBox8.Items.Clear();

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