Модераторы: gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Добавление записей в таблицу 
:(
    Опции темы
Vitkaz
Дата 1.4.2009, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 29.11.2006

Репутация: нет
Всего: нет



    Привет всем! Недавно начал изучать C#. Сейчас создаю базу данных, для чего проделал следующее: создал таблицы и связи между ними в SQL Server 2005, в Visual Studio 2008 установил соединение с сервером, создал форму, которая содержит Grid, textbox`ы и кнопку "Добавить клиента". Как добавить новую запись в таблицу я не знаю ? Помогите пожалуйста написать содержимое события button1_Click. 
PM MAIL   Вверх
Rififi
Дата 1.4.2009, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: нет
Всего: 36



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

скачай/купи любую книгу с названием ADO.NET 2.0, например Professional ADO.NET 2, Pro ADO.NET 2.0 ..., или от папиков - Programming Microsoft® ADO.NET 2.0, причём многие из них имеются в переводном виде.
там всё это описано 
PM MAIL   Вверх
kuller
Дата 2.4.2009, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 15.11.2007

Репутация: нет
Всего: нет



Цитата

Как добавить новую запись в таблицу я не знаю ? Помогите пожалуйста написать содержимое события 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

Это сообщение отредактировал(а) kuller - 2.4.2009, 09:31
PM MAIL   Вверх
Vitkaz
  Дата 2.4.2009, 15:38 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 29.11.2006

Репутация: нет
Всего: нет



Изменил код, который дал 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="Невозможно использовать ''; файл уже используется."
PM MAIL   Вверх
kuller
Дата 2.4.2009, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 15.11.2007

Репутация: нет
Всего: нет



Vitkaz, попробуйте заносить значения ни в 1 поле таблицы clients(InnCl), а во все и будьте внимательны с ТИПАМИ, из-за неправильного типа заносимых данных чаще всего и бывают ошибки!!!!
PM MAIL   Вверх
Vitkaz
Дата 2.4.2009, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 29.11.2006

Репутация: нет
Всего: нет



Чтобы с преобразованиями типов не напутать, я создал таблицу всего с одним полем и попробовал добавить запись, но возникает та же ошибка.
PM MAIL   Вверх
kuller
Дата 2.4.2009, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 15.11.2007

Репутация: нет
Всего: нет



Цитата

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



Vitkaz, Ваше поле в которое Вы в данный момент пытаетесь добавить значение КАКОГО ТИПА????
PM MAIL   Вверх
Vitkaz
Дата 2.4.2009, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 29.11.2006

Репутация: нет
Всего: нет



Тип 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();
                }
            }

        }


Это сообщение отредактировал(а) Vitkaz - 2.4.2009, 21:42
PM MAIL   Вверх
kuller
Дата 2.4.2009, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 15.11.2007

Репутация: нет
Всего: нет



Vitkaz, если Вы вставляете ТЕКСТ, то дорлно быть так записано в SQL-запросе:
'" + textBox1.Text + "', т.е. кавычки ОДИНАРНЫЕ затем ДВОЙНЫЕ .
PM MAIL   Вверх
Vitkaz
Дата 2.4.2009, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 29.11.2006

Репутация: нет
Всего: нет



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

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

PM MAIL   Вверх
KelTron
Дата 3.4.2009, 04:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 5
Всего: 38



Код

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();
            }

                    
                   


--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
Vitkaz
Дата 3.4.2009, 07:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 29.11.2006

Репутация: нет
Всего: нет



KelTron, спасибо за рекомендацию. После учебы попробую.



Это сообщение отредактировал(а) Vitkaz - 3.4.2009, 07:13
PM MAIL   Вверх
Vitkaz
Дата 3.4.2009, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 29.11.2006

Репутация: нет
Всего: нет



Если пишу так,
Код

 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();
            }
        }


Это сообщение отредактировал(а) Vitkaz - 3.4.2009, 15:32
PM MAIL   Вверх
Idsa
Дата 3.4.2009, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



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

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

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

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


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Vitkaz
Дата 3.4.2009, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 29.11.2006

Репутация: нет
Всего: нет



 Спасибо, Idsa! Причина была в этом.
PM MAIL   Вверх
Vitkaz
  Дата 3.4.2009, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 29.11.2006

Репутация: нет
Всего: нет



 А если использовать параметизированные запросы, как KelTron посоветовал, нужно ли производить преобразования типов ?
PM MAIL   Вверх
Idsa
Дата 3.4.2009, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



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


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Vitkaz
Дата 3.4.2009, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 29.11.2006

Репутация: нет
Всего: нет



С добавлением всё получилось. Скажите пожалуйста, а как сделать refresh т.е. чтобы внесенные изменения отобразились в Grid`е после добавления ? Попробовал делать, как ранее делал в FoxPro: this.dataGridView1.Refresh();, но что-то не получается.  
PM MAIL   Вверх
KelTron
Дата 4.4.2009, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 5
Всего: 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;
}






--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
Vitkaz
Дата 4.4.2009, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 29.11.2006

Репутация: нет
Всего: нет



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

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



Это сообщение отредактировал(а) Vitkaz - 6.4.2009, 23:44
PM MAIL   Вверх
Vitkaz
Дата 12.4.2009, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 29.11.2006

Репутация: нет
Всего: нет



 Не стал создавать новую тему. Возникла следующая проблема: мне нужно сделать запрос и результат этого запроса добавить в таблицу. Я решил посмотреть содержимое запроса, поместив результат в 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, все нормально. Подскажите пожалуйста, что не так.
PM MAIL   Вверх
KelTron
Дата 13.4.2009, 06:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 5
Всего: 38



Перед чтением данных из датаридера нужно вызвать метод Read

Код

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


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

Код

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


Это сообщение отредактировал(а) KelTron - 13.4.2009, 06:58


--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
Vitkaz
Дата 13.4.2009, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 29.11.2006

Репутация: нет
Всего: нет



Понял. Спасибо!  smile 

PM MAIL   Вверх
Vitkaz
Дата 26.4.2009, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 29.11.2006

Репутация: нет
Всего: нет



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

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

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

Это сообщение отредактировал(а) Vitkaz - 26.4.2009, 15:00
PM MAIL   Вверх
Vitkaz
Дата 26.4.2009, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 29.11.2006

Репутация: нет
Всего: нет



Цитата(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();
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0685 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.