Обновление базы данных при помощи TEXT BOX

Форум посвящён работе с базами данных в .NET.

Модератор: Ramzes

krakoss
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 06.08.2007 (Пн) 10:33

Обновление базы данных при помощи TEXT BOX

Сообщение krakoss » 07.08.2007 (Вт) 8:31

Имеется таблица REKVIZIT в ней попя nazvanie_vk и dolznost_vk созданная в ms access
создается интефейс управления в visual studio 2005

созданны
1. форма Rekvizity с двумя TextBox: 1. nazvanie_vk, 2. dolznost_vk, кнопка Button1
2. GpDataSet
3. RekvizitBindingSource
4. RekvizitTableAdapter

написан код программы:
Код: Выделить всё
Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.Windows.Forms


Public Class Rekvizity
    Dim Rekvizit As DataTable
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'TODO: This line of code loads data into the 'GpDataSet.Rekvizit' table. You can move, or remove it, as needed.
        Me.RekvizitTableAdapter.Fill(Me.GpDataSet.Rekvizit)
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Me.RekvizitTableAdapter.Update(Me.GpDataSet.Rekvizit)
        MsgBox("Обновление выполнено")
    End Sub

End Class[b][/b]

при изменении данных в text box необходимо обновить данные в таблице
но после нажатия кнопки не происходит обновление данных в таблице
Прошу подскажите в чем ошибка и как добится желаемого результата

Thomas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 246
Зарегистрирован: 12.11.2005 (Сб) 0:17
Откуда: "Сказочное королевство"

Сообщение Thomas » 07.08.2007 (Вт) 8:59

krakoss
Код: Выделить всё

Dim nazvanie As String = txtNazvanie.Text
Dim dolznost  As String = txtDolznost .Text
Dim sql As String = "INSERT INTO REKVIZIT (nazvanie_vk, dolznost_vk) VALUES (nazvanie, dolznost);"
'если надо изменить существующую запись, то UPDATE команду пиши
sql = "UPDATE REKVIZIT SET nazvanie_vk nazvanie,dolznost_vk=dolznost WHERE Id=123;" 'id нужно для того чтобы знать какую запись обновлять.
'создай соединение с БД, создай команду и выполни её
con=New OleDbConnection(conString)
cmd = New OleDbCommand(con)
cmd.CommandText = sql
cmd.ExcuteNonQuery
Met vriendelijke groetjes
VS2008 Pro FW3.5 SP1

krakoss
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 06.08.2007 (Пн) 10:33

Сообщение krakoss » 07.08.2007 (Вт) 12:36

Спасибо за оперативный ответ
но ...
возникает еще несколько вопросов
1. OleDbConnection был заменен в Visual Studio 2005 на OleDb.OleDbConnection
2. OleDbCommand был заменен в Visual Studio 2005 на OleDb.OleDbCommand

3. также: Error :Name 'con' is not declared, Name 'conString' is not declared, Name 'cmd' is not declared

то есть как я понимаю в Visual Studio 2005 другой синтаксис
Прошу еще раз подсказать как решить эту задачу.

AlexM
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 25.06.2002 (Вт) 11:26
Откуда: Украина, Житомир

Сообщение AlexM » 07.08.2007 (Вт) 16:08

Можно попробовать так:

Код: Выделить всё
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim drv As DataRowView
drv = CType(Me.RekvizitBindingSource.AddNew, DataRowView)
drv.Item("nazvanie_vk") = TextBox1.Text
drv.Item("dolznost_vk") = TextBox2.Text
Me.RekvizitBindingSource.EndEdit()
Me.RekvizitTableAdapter.Update(Me.GpDataSet.Rekvizit)

End Sub

krakoss
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 06.08.2007 (Пн) 10:33

Не получилось

Сообщение krakoss » 07.08.2007 (Вт) 18:29

Нет так тоже не работает

Нужно как я понял
после метода Update
1. произвести соединение с базой данных
2. написать sql запрос на изменение данных в таблице базы данных
3. закрыть соединение

весь вопрос в том как синтаксически правильно это выполнить.

потому как при отладке я определяю что данные в DataSet изменяются согласно сделанных изменений.

Прошу еще помощи у опытных.

cosmo_vk
Новичок
Новичок
 
Сообщения: 33
Зарегистрирован: 26.12.2006 (Вт) 12:07
Откуда: Владимирская обл, г.Ковров

Re: Не получилось

Сообщение cosmo_vk » 07.08.2007 (Вт) 19:09

krakoss писал(а):Нет так тоже не работает

Нужно как я понял
после метода Update
1. произвести соединение с базой данных
2. написать sql запрос на изменение данных в таблице базы данных
3. закрыть соединение
весь вопрос в том как синтаксически правильно это выполнить.
потому как при отладке я определяю что данные в DataSet изменяются согласно сделанных изменений.
Прошу еще помощи у опытных.

есть код на C#:
Код: Выделить всё
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.OleDb;
using System.Drawing;
using System.Text;
using System.IO;
using System.Windows.Forms;

namespace BUGReport
{
    public partial class Form1 : Form
    {
        // объявление переменных для сбора информации
        byte chkst;
        string sDate;
        string Prog;
        string sVer;
        string comment;
        // строка подключения к базе
        OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Program Files\Common Files\BRB\db1.mdb");
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            this.mainTableTableAdapter.Fill(this.db1DataSet.MainTable);
            string textbx;
            //загрузка инфы из файла в текстбокс c информацией
            System.IO.StreamReader fstx = new StreamReader("C:\\Program Files\\Common Files\\BRB\\Info.txt");
            while (fstx.EndOfStream == false)
            {
                textbx = fstx.ReadToEnd();
                textBox4.Text = textbx;
            }
            // присвоение дефолтовой даты sDate
            // убирается видимость формы удаления
            sDate = System.DateTime.Now.ToShortDateString();
            flowLayoutPanel1.Visible = false;
         
        }

        //если ставиться галка, то chkst меняется на 1, в противном случае оставляем по умолчанию 0
        private void CheckedChanged(object sender, EventArgs e)
        {
            if (checkBox1.Checked)
            {
                chkst = 1;
            }
        }

        // смена даты
        private void DateTimePicker_ValueChanged(object sender, EventArgs e)
        {
            sDate = dateTimePicker1.Value.ToShortDateString();           
            textBox4.Text = sDate.ToString();
        }

        // вызов окна о программе
        private void toolStripStatusLabel2_Click(object sender, EventArgs e)
        {
            AboutBox abc = new AboutBox();
            abc.Show();
        }

        // добавление данных, кнопка не активна, пока не введены все данные.
        private void button1_Click(object sender, EventArgs e)
        {
            string DBCom = "INSERT INTO MainTable (EventDate, Id_Prog, Vers, Comment, FixOrNo) VALUES ('" + sDate + "', '" + Prog + "', '" + sVer + "', '" + comment + "', '" + chkst + "')";
            con.Open();
            try
            {
                OleDbCommand cmd = new OleDbCommand(DBCom, con);
                cmd.ExecuteNonQuery();
                textBox4.Text = "Данные занесены";
            }
            catch (Exception exp)
            {
                textBox4.Text = "Ошибочка: " + exp.Message;
            }
            finally
            {
                con.Close();
            }
            // закрываем grid на редактирование
            dataGridView1.EndEdit();
            // представляем grid с новыми данными
            this.mainTableTableAdapter.Fill(this.db1DataSet.MainTable);
            // восстанавлиеваем состояние элементов
            EnableElement();
        }

        // закрытие приложения
        private void button2_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        // переход в режим удаления, все элементы скрываются,
        //а удаления восстанавливаю в состояние видимости
        private void button3_Click(object sender, EventArgs e)
        {
            DisableAddElement();
        }

        // собственно удаление
        private void Button4_Click(object sender, EventArgs e)
        {
             {
                 // "подготовка к удаления, берем значения из текстбокса, формируем строку удаления
                string nID;
                nID = textBox5.Text.ToString();
                string cmdDel = "Delete from MainTable where ID= " + nID;
                string messageDel = "Удалить запись?";
                string messageCaption = "Удаление!";
                DialogResult result;
                 // вывод сообщения на подтверждение удаления
                result = MessageBox.Show(messageDel, messageCaption, MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);               
                if (result == DialogResult.Yes)
                {
                    con.Open();
                    try
                    {
                        OleDbCommand mydeletecomm = new OleDbCommand(cmdDel, con);
                        mydeletecomm.ExecuteNonQuery();
                        textBox4.Text = "Данные c ID-"+ nID + " удалены";
                    }
                    catch (Exception exp)
                    {
                        textBox4.Text = "ошибка удаления: " + exp;
                    }
                    finally
                    {
                        EnableElement();
                        con.Close();
                    }                   
                }                               
                this.mainTableTableAdapter.Fill(this.db1DataSet.MainTable);
                textBox5.Clear();
               
            } 
        }

        //переход обратно в окно добавления/редактирования
        private void button5_Click(object sender, EventArgs e)
        {
            EnableElement();
        }

        // собственно редактирование
        private void button6_Click(object sender, EventArgs e)
        {
            OOps();
        }

        // возвращает все элементы в дефолтовое состояние(ну это c натяжкой можно сказать)
        private void button7_Click(object sender, EventArgs e)
        {
            Ochistka();
        }

        // в таймере идет проверка на "пустость" элементов, checkbox не проверяется.
        // если данные есть, кнопка Добавить становиться активной.
        private void timer1_Tick(object sender, EventArgs e)
        {
            ProverkaZnach();
        }

        private void Row_SelectionChanged(object sender, EventArgs e)
        {
            // редактирование при выделении строки в гриде
            // данные при выделении заносяться в соответствующие ячейки

        }
        private void EnableElement()
        {
            checkBox1.Visible = true;
            label2.Visible = true;
            textBox1.Visible = true;
            textBox2.Visible = true;
            label3.Visible = true;
            label1.Visible = true;
            label4.Visible = true;
            textBox3.Visible = true;
            button1.Visible = true;
            button2.Visible = true;
            button3.Visible = true;
            dateTimePicker1.Visible = true;
            Button4.Visible = false;
            button5.Visible = false;
            textBox5.Visible = false;
            label6.Visible = false;
            flowLayoutPanel1.Visible = false;
            button6.Visible = true;
            button7.Visible = true;
            Ochistka();
            checkBox1.Focus();
        }

        private void DisableAddElement()
        {
            checkBox1.Visible = false;
            label2.Visible = false;
            textBox1.Visible = false;
            textBox2.Visible = false;
            label3.Visible = false;
            label1.Visible = false;
            label4.Visible = false;
            textBox3.Visible = false;
            button1.Visible = false;
            button2.Visible = false;
            Button4.Visible = true;
            button5.Visible = true;
            button3.Visible = false;
            dateTimePicker1.Visible = false;
            button6.Visible = false;
            button7.Visible = false;
            textBox5.Visible = true;
            label6.Visible = true;
            flowLayoutPanel1.Visible = true;
            textBox5.Focus();
        }
       
        private void OOps()
        {
            // генерация моих "исключений" :)
            MessageBox.Show("Упс... Функция на данный момент не доступна или не заполнены значения!", "Внимание!", MessageBoxButtons.OK, MessageBoxIcon.Warning); 
        }
       
        private void ProverkaZnach()
        {
            //идет проверка на "пустость" элементов, checkbox не проверяется.
        // если данные есть, кнопка Добавить становиться активной.
            //значения берем из соотвествующих полей
            Prog = textBox1.Text;
            sVer = textBox2.Text;
            comment = textBox3.Text;
            if (Prog == "" || sVer == "" || comment == "")
            {               
                button1.Enabled = false;
            }
            else
            {
                button1.Enabled = true;
            }
        }

        private void Ochistka()
        {
            // возврат в дефолтовое состояние
            checkBox1.CheckState = CheckState.Unchecked;
            textBox1.Clear();
            textBox2.Clear();
            textBox3.Clear();
            dateTimePicker1.ResetText();
            checkBox1.Focus();
        }
    }
}

конвертировать можно с помощью этого: http://www.developerfusion.co.uk/utilit ... ptovb.aspx

krakoss
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 06.08.2007 (Пн) 10:33

Сообщение krakoss » 07.08.2007 (Вт) 20:10

Спасибо
сейчас попробую ... если не успею то завтра

Thomas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 246
Зарегистрирован: 12.11.2005 (Сб) 0:17
Откуда: "Сказочное королевство"

Сообщение Thomas » 07.08.2007 (Вт) 22:14

krakoss
1. OleDbConnection был заменен в Visual Studio 2005 на OleDb.OleDbConnection
2. OleDbCommand был заменен в Visual Studio 2005 на OleDb.OleDbCommand

А использовать Imports мы не умеем?
3. также: Error :Name 'con' is not declared, Name 'conString' is not declared, Name 'cmd' is not declared

Конечно студия на тебя ругается. Con, conStr и cmd это переменные, которые нужно обьявить и задать им значения.
Это делается либо глобально для всей формы либо по мере необходимости в методах или функциях.
Например так обьявляешь глобально для всего класса:

Код: Выделить всё

Imports System.Data
Imports System.Data.OleDb
Imports System.Configuration

''' <summary>
''' Класс для доступа к базе данных Access
''' </summary>
''' <remarks>Класс содержит методы для отображения и модификации данных в таблицах ДБ</remarks>
Public Class clsAccessToDB

#Region "Variable Declaration."

    Private con As OleDbConnection
    Private cmd As OleDbCommand
    Private da As OleDbDataAdapter
    Private cmdBuilder As OleDbCommandBuilder
    Private ds As DataSet
    Private dr As DataRow
    Private dt As DataTable
    Private dv As DataView
    Private conStr As String
#End Region
End Class

Или локально:
Код: Выделить всё
Private Sub ShowMailingTable(ByVal tableName As String)
        Dim Sql As String = "SELECT * FROM " + tableName
        db.FillDataSet(tableName, Sql, False) 'db это мой класс + его метод
        dgvOutputData.DataSource = Nothing
        dgvOutputData.DataSource = db.myDs
        dgvOutputData.DataMember = tableName
        dgvOutputData.Refresh()
    End Sub 'in orde

А вообще мой друг настоятельно рекомендую почитать MSDN

Плюс посмотри тут, может пригодиться. :wink:
Met vriendelijke groetjes
VS2008 Pro FW3.5 SP1

AlexM
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 25.06.2002 (Вт) 11:26
Откуда: Украина, Житомир

Re: Не получилось

Сообщение AlexM » 08.08.2007 (Ср) 10:31

krakoss писал(а):Нет так тоже не работает

Нужно как я понял
после метода Update
1. произвести соединение с базой данных
2. написать sql запрос на изменение данных в таблице базы данных
3. закрыть соединение

весь вопрос в том как синтаксически правильно это выполнить.

потому как при отладке я определяю что данные в DataSet изменяются согласно сделанных изменений.

Прошу еще помощи у опытных.


Так как-раз работает...
Просто, уважаемый krakoss у вас не совсем правильно создана база данных. Добавьте в вашу таблицу ключевое поле (например, ID), сделайте его автоинкрементным, затем обновите в вашем проекте DataSet и все заработает.

krakoss
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 06.08.2007 (Пн) 10:33

Один шаг от конечного результата ... Возможно

Сообщение krakoss » 08.08.2007 (Ср) 17:00

Thomas писал(а):krakoss
Код: Выделить всё
Dim nazvanie As String = txtNazvanie.Text
Dim dolznost  As String = txtDolznost .Text
Dim sql As String = "INSERT INTO REKVIZIT (nazvanie_vk, dolznost_vk) VALUES (nazvanie, dolznost);"
'если надо изменить существующую запись, то UPDATE команду пиши
sql = "UPDATE REKVIZIT SET nazvanie_vk nazvanie,dolznost_vk=dolznost WHERE Id=123;" 'id нужно для того чтобы знать какую запись обновлять.
'создай соединение с БД, создай команду и выполни её
con=New OleDbConnection(conString)
cmd = New OleDbCommand(con)
cmd.CommandText = sql
cmd.ExcuteNonQuery


Вот то что у меня получилось после чтения литературы и попытки решить эту задачу

Код: Выделить всё

Imports System
Imports System.Data
Imports System.Data.OleDb
Imports System.Windows.Forms
Imports System.Configuration

Public Class rekvizit
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim con As OleDbConnection
        Dim cmd As OleDbCommand
        Dim conStr As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=gp.mdb"
        Dim nazvanie As String = txtNazvanie.Text
        Dim sql As String = "UPDATE REKVIZIT SET nazvanie_vk=nazvanie WHERE Id_Rekvizit=?;"
        'id нужно для того чтобы знать какую запись обновлять.
        con = New OleDbConnection(conStr)
        con.Open()
        MsgBox("Соединение установлено!")
        cmd = New OleDbCommand(sql, con)
        cmd.CommandText = sql
        MsgBox(nazvanie, MsgBoxStyle.YesNo, "Призывник")
        cmd.ExecuteNonQuery()
        con.Close()
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.RekvizitTableAdapter.Fill(Me.GpDataSet.Rekvizit)
    End Sub
End Class


Код: Выделить всё

cmd = New OleDbCommand(con)

в этой строке происходит ошибка: Значения типа "System.Data.OleDb.OleDbConnection" не может быть преобразовано в "Строка".
После изменения на
Код: Выделить всё

cmd = New OleDbCommand(sql, con)

в строке
Код: Выделить всё

MsgBox(Nazvanie)

На экран выводится измененное значение Nazvanie, что свидетельствует о том что в DataSet изменения произошли успешно
Код: Выделить всё

cmd.ExecuteNonQuery()

а в этой строке происходит ошибка:
Отсутствует значение для одного или нескольких требуемых параметров.
И сколько не рыскал по файлам помощи так ничего и не смог найти и соответственно решить эту задачу…
Прошу Вас господа зубры не отпихивайте новичка … Помогите

krakoss
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 06.08.2007 (Пн) 10:33

Сообщение krakoss » 08.08.2007 (Ср) 17:28

Да вот пример из файла помощи в VB.NET

The following example creates an OleDbCommand and then executes it using ExecuteNonQuery. The example is passed a string that is an SQL statement such as UPDATE, INSERT, or DELETE, and a string to use to connect to the data source.
Перевод:
Следующий пример создает OleDbCommand и затем выполняет его, используя ExecuteNonQuery. Например передается строка, которая является SQL запросом, как UPDATE, INSERT или DELETE, и строки для соединения с источником данных

Код: Выделить всё

Private Sub CreateOleDbCommand( _
    ByVal queryString As String, ByVal connectionString As String)
    Using connection As New OleDbConnection(connectionString)
        connection.Open()
        Dim command As New OleDbCommand(queryString, connection)
        command.ExecuteNonQuery()
    End Using
End Sub

Данный пример был переделан для моего пример

Код: Выделить всё

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim queryString As String = "UPDATE REKVIZIT SET nazvanie_vk=nazvanie WHERE Id_Rekvizit=?;"
        Dim connectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=gp.mdb"
        Using connection As New OleDbConnection(connectionString)
            connection.Open()
            Dim command As New OleDbCommand(queryString, connection)
            command.ExecuteNonQuery()
        End Using
    End Sub

И появляется таже ошибка
в строке
Код: Выделить всё

command.ExecuteNonQuery()

Отсутствует значение для одного или нескольких требуемых параметров.
Господа помогите ну очень нужно ....
С уважением ко всем Юрий

cosmo_vk
Новичок
Новичок
 
Сообщения: 33
Зарегистрирован: 26.12.2006 (Вт) 12:07
Откуда: Владимирская обл, г.Ковров

Сообщение cosmo_vk » 08.08.2007 (Ср) 21:02

ваш код:
Код: Выделить всё
Public Class rekvizit
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim con As OleDbConnection
        Dim cmd As OleDbCommand
        Dim conStr As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=gp.mdb"
        Dim nazvanie As String = txtNazvanie.Text
        Dim sql As String = "UPDATE REKVIZIT SET nazvanie_vk=nazvanie WHERE Id_Rekvizit=?;"
        'id нужно для того чтобы знать какую запись обновлять.
        con = New OleDbConnection(conStr)
        con.Open()
        MsgBox("Соединение установлено!")
        cmd = New OleDbCommand(sql, con)
        cmd.CommandText = sql
        MsgBox(nazvanie, MsgBoxStyle.YesNo, "Призывник")
        cmd.ExecuteNonQuery()
        con.Close()
    End Sub

а вот так попробовать переделать:
Код: Выделить всё
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim con As OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Your_Directory\gp.mdb")           
        Dim nazvanie As String = txtNazvanie.Text
   ' тут в корне было не верно!
        Dim sql As String = "UPDATE REKVIZIT SET nazvanie_vk=" & nazvanie & " WHERE Id_Rekvizit=" & ID_From_Your_Table
        'id нужно для того чтобы знать какую запись обновлять.
   con.Open() 
   MsgBox.Show("Соединение установлено!", MessageBoxButtons.Ok, MessageBoxIcon.Exclamation)
   ' ВСТАВЛЯЕМ БЛОК ОБРАБОТКИ ИСКЛЮЧЕНИЙ!   
   try 
   Dim cmd as new OleDbConnection(sql, con)             
        cmd.ExecuteNonQuery()
   ' обработка исключения
   Catch exp as Exception
   ' выведите на какой-нибудь текстбокс
      textbox.text = "ошибка: " & exp
   ' данный блок будет обрабатываться всегда
   Finally
        con.Close()
   end try
    End Sub

ID-к в Update обязателен!!!

P.S. Вам пожелание научитесь пользоваться breakpoint и дебагером в VisualStudio. Кучу ошибок можно отловить еще на этом этапе, а уже потом в "безвыходной ситуации" кидать свои идеи сюда.

krakoss
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 06.08.2007 (Пн) 10:33

Спасибо за помощь НО все таки....

Сообщение krakoss » 09.08.2007 (Чт) 8:18

Код был преобразован к следующему виду:
Код: Выделить всё

Imports System.Data
Imports System.Data.OleDb
Imports System.Windows.Forms

Public Class rekvizit
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
          Me.RekvizitTableAdapter.Fill(Me.GpDataSet.Rekvizit)
    End Sub
   
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim con As OleDbConnection
        con = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=gp.mdb")
        Dim nazvanie As String = txtNazvanie.Text
        Dim Id_Rek As String = Id_Rekvizit.Text
        Dim sql As String = "UPDATE REKVIZIT SET nazvanie_vk=" & nazvanie & " WHERE Id_Rekvizit=" & Id_Rek
        con.Open()
        Try
            Dim cmd As New OleDbCommand(sql, con)
            MsgBox(nazvanie, MsgBoxStyle.OkOnly, "Призывник")
            cmd.ExecuteNonQuery()
        Finally
            con.Close()
        End Try
    End Sub
End Class

и после этого в точке
Код: Выделить всё

cmd.ExecuteNonQuery()

возникает ошибка:
1. Название диалога ошибки: OleDbException was unhandled (не поддерживается), текст ошибки: Ошибка синтаксиса (пропущен оператор) в выражении запроса
2. В этой точке наблюдения - Name ExecuteNonQuery is not declared (Имя не задекларировано).

Не судите строго но ... подскажите что же делать?
С Уважением Юрий

cosmo_vk
Новичок
Новичок
 
Сообщения: 33
Зарегистрирован: 26.12.2006 (Вт) 12:07
Откуда: Владимирская обл, г.Ковров

Сообщение cosmo_vk » 09.08.2007 (Чт) 9:35

новодящий вопрос: А каким образом вы узнаете ЧТО редактировать? То есть выделяя, например, строку в таблице, в ваших текстбоксах должны появиться редактируемые значения, ID записи должен определятся не внутри Button_Click, а намного раньше, например, в DataGridView__SelectionChanged. Надеюсь поняли в каком направлении идти?

krakoss
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 06.08.2007 (Пн) 10:33

Огромное спасибо всем за помощь

Сообщение krakoss » 09.08.2007 (Чт) 11:04

Вот очень ХОРОШИЙ Код который решает всё
Код: Выделить всё

Public Class MainForm

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.REKVIZITTableAdapter.Fill(Me.GpDataSet.REKVIZIT) 'Загрузим данные из БД в DataSet.
        RefreshRecordInfo() 'Обновим информацию о количестве записей в БД.
    End Sub

    Private Sub MainForm_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
        Me.REKVIZITTableAdapter.Update(Me.GpDataSet.REKVIZIT) 'Обновис данные в БД из DataSet.
    End Sub

    Private Sub RefreshRecordInfo()
        Me.lblInfo.Text = "Запись:" + Chr(32) + CStr(bsREKVIZIT.Position + 1) + Chr(32) + "из" + Chr(32) + CStr(bsREKVIZIT.Count)
    End Sub

    Private Sub btnFirstRecord_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnFirstRecord.Click
        bsREKVIZIT.MoveFirst() 'Переместить текущий указатель записи на первую запись.
        RefreshRecordInfo() 'Обновим информацию о количестве записей в БД.
    End Sub

    Private Sub btnPrevRecord_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrevRecord.Click
        bsREKVIZIT.MovePrevious() 'Переместить текущий указатель записи на предыдущую запись.
        RefreshRecordInfo() 'Обновим информацию о количестве записей в БД.
    End Sub

    Private Sub btnNextRecord_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNextRecord.Click
        bsREKVIZIT.MoveNext() 'Переместить текущий указатель записи на следующую запись.
        RefreshRecordInfo() 'Обновим информацию о количестве записей в БД.
    End Sub

    Private Sub btnLastRecord_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLastRecord.Click
        bsREKVIZIT.MoveLast() 'Переместить текущий указатель записи на последнюю запись.
        RefreshRecordInfo() 'Обновим информацию о количестве записей в БД.
    End Sub

    Private Sub btnAdd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAdd.Click
        Dim AEForm As New AddEditForm
        Dim drv As DataRowView
        AEForm.Text = "Добавить запись" 'Изменим заголовок окно диалога.
        If AEForm.ShowDialog = Windows.Forms.DialogResult.OK Then
            drv = CType(Me.bsREKVIZIT.AddNew, DataRowView) 'Создадим новую запись в DataSet.
            drv.Item("nazvanie_vk") = AEForm.TextBox1.Text 'Присвоим значение TextBox1 из окна диалога полю nazvanie_vk.
            drv.Item("dolznost_vk") = AEForm.TextBox2.Text 'Присвоим значение TextBox2 из окна диалога полю dolznost_vk.
            Me.bsREKVIZIT.EndEdit() 'Завершим редактирование записи.
            RefreshRecordInfo() 'Обновим информацию о количестве записей в БД.
        End If
    End Sub

    Private Sub btnEdit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEdit.Click
        Dim AEForm As New AddEditForm
        Dim drv As DataRowView

        drv = CType(Me.bsREKVIZIT.Current, DataRowView) 'Получим текущую запись из DataSet.
        AEForm.TextBox1.Text = CStr(drv.Item("nazvanie_vk")) 'Присвоим значение поля nazvanie_vk в TextBox1 окна диалога.
        AEForm.TextBox2.Text = CStr(drv.Item("dolznost_vk")) 'Присвоим значение поля dolznost_vk в TextBox2 окна диалога.
        AEForm.Text = "Править запись" 'Изменим заголовок окно диалога.

        If AEForm.ShowDialog = Windows.Forms.DialogResult.OK Then
            drv.Item("nazvanie_vk") = AEForm.TextBox1.Text 'Присвоим значение TextBox1 из окна диалога полю nazvanie_vk.
            drv.Item("dolznost_vk") = AEForm.TextBox2.Text 'Присвоим значение TextBox2 из окна диалога полю dolznost_vk.
            Me.bsREKVIZIT.EndEdit() 'Завершим редактирование записи.
        End If
    End Sub

    Private Sub btnDelete_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDelete.Click
        Dim drv As DataRowView
        Dim Ans As DialogResult

        drv = CType(Me.bsREKVIZIT.Current, DataRowView) 'Получим текущую запись из DataSet.

        'Запрос пользователю для подтверждения удаления записи.
        Ans = MessageBox.Show("Удалить запись?" + vbCrLf + vbCrLf + _
                              CStr(drv.Item("nazvanie_vk")) + vbCrLf + _
                              CStr(drv.Item("dolznost_vk")), _
                              "Удаление записей", MessageBoxButtons.YesNo, MessageBoxIcon.Question)

        If Ans = Windows.Forms.DialogResult.Yes Then
            Me.bsREKVIZIT.RemoveCurrent() 'Удаляем текущую запись из DataSet.
            RefreshRecordInfo() 'Обновим информацию о количестве записей в БД.
        End If
    End Sub

End Class

и редактирование и добавление и изменение и удаление записей ...

Еще раз огромное спасибо AlexM за помощь
Все удачи. Как говорят на форуме посвященному forex http://forum.masterforex-v.org/
"ПРОФИТОВ Вам огромных а ЛОСЕЙ поменьше ..."

С Уважением Юрий

cosmo_vk
Новичок
Новичок
 
Сообщения: 33
Зарегистрирован: 26.12.2006 (Вт) 12:07
Откуда: Владимирская обл, г.Ковров

Сообщение cosmo_vk » 10.08.2007 (Пт) 11:52

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

krakoss
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 06.08.2007 (Пн) 10:33

Сообщение krakoss » 07.06.2008 (Сб) 17:41

Практически год прошел с момента выхода данной темы
было время разбирался ... не было был занят другим. Основная ошибка было в правильно синтаксиса SQL запроса
вот он полностью:
Код: Выделить всё
Dim sql As String = "UPDATE Kartoteka SET First_Name = '" & FName & "', Lats_Name = '" & LName & "' WHERE Kartoteka.Id=" & IdK & ";"

Особое внимание уделили связке - АПОСТРОФ+ КАВЫЧКИ ( ' " )- Очень долго мучался но все таки смог побороть ошибку - ОТСУТВИЕ ОПЕРАТОРА В sql ЗАПРОСЕ ...

А вообще все работает уже в Visual Studio 2008 но одно но
изменения не сохраняются в базу данных
Вот код - подскажите что опять не верно:
Код: Выделить всё

Imports System.IO
Imports System.Data
Imports System.Data.OleDb
Imports System.Windows.Forms
Imports System.Drawing

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Close()
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'TODO: This line of code loads data into the 'U_GPPDataSet1.Kartoteka' table. You can move, or remove it, as needed.
        Me.KartotekaTableAdapter.Fill(Me.U_GPPDataSet1.Kartoteka)

    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim connection As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\U_GPP.accdb")
        connection.Open()
        MsgBox("Соединение +", MsgBoxStyle.OkOnly)
        Dim FName As String = First_NameTextBox.Text
        Dim IdK As String = IdTextBox.Text
        Dim LName As String = Lats_NameTextBox.Text
        Dim sql As String = "UPDATE Kartoteka SET First_Name = '" & FName & "', Lats_Name = '" & LName & "' WHERE Kartoteka.Id=" & IdK & ";"

        Try
            Dim command As New OleDbCommand(sql, connection)
            command.ExecuteNonQuery()

        Finally

        End Try
        connection.Close()
        MsgBox("Соединение -", MsgBoxStyle.OkOnly)
    End Sub

End Class


С уважением ко всем Юрий

krakoss
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 06.08.2007 (Пн) 10:33

Сообщение krakoss » 07.06.2008 (Сб) 17:42

Практически год прошел с момента выхода данной темы
было время разбирался ... не было был занят другим. Основная ошибка было в правильно синтаксиса SQL запроса
вот он полностью:
Код: Выделить всё
Dim sql As String = "UPDATE Kartoteka SET First_Name = '" & FName & "', Lats_Name = '" & LName & "' WHERE Kartoteka.Id=" & IdK & ";"

Особое внимание уделили связке - АПОСТРОФ+ КАВЫЧКИ ( ' " )- Очень долго мучался но все таки смог побороть ошибку - ОТСУТВИЕ ОПЕРАТОРА В sql ЗАПРОСЕ ...

А вообще все работает уже в Visual Studio 2008 но одно но
изменения не сохраняются в базу данных
Вот код - подскажите что опять не верно:
Код: Выделить всё

Imports System.IO
Imports System.Data
Imports System.Data.OleDb
Imports System.Windows.Forms
Imports System.Drawing

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Close()
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'TODO: This line of code loads data into the 'U_GPPDataSet1.Kartoteka' table. You can move, or remove it, as needed.
        Me.KartotekaTableAdapter.Fill(Me.U_GPPDataSet1.Kartoteka)

    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim connection As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\U_GPP.accdb")
        connection.Open()
        MsgBox("Соединение +", MsgBoxStyle.OkOnly)
        Dim FName As String = First_NameTextBox.Text
        Dim IdK As String = IdTextBox.Text
        Dim LName As String = Lats_NameTextBox.Text
        Dim sql As String = "UPDATE Kartoteka SET First_Name = '" & FName & "', Lats_Name = '" & LName & "' WHERE Kartoteka.Id=" & IdK & ";"

        Try
            Dim command As New OleDbCommand(sql, connection)
            command.ExecuteNonQuery()

        Finally

        End Try
        connection.Close()
        MsgBox("Соединение -", MsgBoxStyle.OkOnly)
    End Sub

End Class


С уважением ко всем Юрий

krakoss
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 06.08.2007 (Пн) 10:33

ВСЕ - РАБОТАЕТ !!!!

Сообщение krakoss » 09.06.2008 (Пн) 19:45

Порыскал по инету и нашел
ну в общем что то из этого но точно сказать нужными словами не могу ...
почитайте и сами все поймете

http://forum.vingrad.ru/forum/topic-214142.html

и

http://forum.vingrad.ru/forum/topic-212339.html

короче это примочка (сорри за сленг) MS Access
:oops:
С уважением ко всем Юрий


Вернуться в ADO.NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

    TopList