Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 28.09.2014
Сообщений: 103

Не получается обновить запись в таблице Access

24.06.2016, 18:17. Показов 3407. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, есть форма "Изменение пароля", содержащая 4 textbox (FIO - которое присваивается автоматически, CurrentPass - текущий пароль, сравнивается в таблице и включает следующие два текстбокса, с этим проблем нет, Pass1 - новый пароль, Pass2 - подтверждение пароля) и кнопку, при нажатии которой после всех проверок на заполненность выполняется запрос на обновление поля пароля "PasswordEmploee" в таблице "tblEmployee", при условии что FIO пользователя в таблице = FIO присвоенному в поле формы.
Код запроса такой:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 ... 
//Проверка на заполненность и другие действия, которые работают нормально
else
 {
//После всех проверок выполняется запрос
using (OleDbConnection connect = new OleDbConnection(GetConnectionString()))
 {
   connect.Open();
   OleDbCommand cmd = new OleDbCommand("UPDATE [tblEmployee] SET PasswordEmploee = Pass1 WHERE FIO=FIO.Text", connect);
   cmd.ExecuteNonQuery();
   MessageBox.Show("Пароль пользователя успешно изменен!", "Изменение пароля завершено.");
   this.Close();
  }
     }
Запрос заканчивается такой ошибкой: "Необработанное исключение типа "System.Data.OleDb.OleDbException" в System.Data.dll
Дополнительные сведения: Отсутствует значение для одного или нескольких требуемых параметров."
На этой строчке:
C#
1
OleDbCommand cmd = new OleDbCommand("UPDATE [tblEmployee] SET PasswordEmploee = Pass1 WHERE FIO=FIO.Text", connect);
Помогите, пожалуйста, найти ошибку или изменить запрос. Заранее спасибо.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.06.2016, 18:17
Ответы с готовыми решениями:

Не получается обновить строку в таблице БД
int x=1; do { //перенумерация String categ =...

Обновить запись в родительской таблице
Доброго времени суток участникам форума, прошу помощи в составлении запроса. Есть две таблицы: Инвентарные номера (родительская) и...

Как обновить запись в таблице (phpmyadmin)
Есть таблицa user c полями (id,login,data,password ),при авторизации вы вводим логин ,который уже есть в таблице,то время должно обновиться...

9
44 / 44 / 24
Регистрация: 01.05.2012
Сообщений: 178
24.06.2016, 19:36
Пример

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
using System;
using System.Data;
using System.Data.OleDb;
using System.Windows.Forms;
 
namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            string connetionString = null;
            OleDbConnection connection ;
            OleDbDataAdapter oledbAdapter = new OleDbDataAdapter();
            string sql = null;
            connetionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Your mdb filename;";
            connection = new OleDbConnection(connetionString);
            sql = "update Users set Password = 'new password' where UserID = 'user1'";
            try
            {
                connection.Open();
                oledbAdapter.UpdateCommand = connection.CreateCommand();
                oledbAdapter.UpdateCommand.CommandText = sql;
                oledbAdapter.UpdateCommand.ExecuteNonQuery();
                MessageBox.Show ("Row(s) Updated !! ");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
    }
}
0
0 / 0 / 0
Регистрация: 28.09.2014
Сообщений: 103
25.06.2016, 13:30  [ТС]
Sigma214,
А как указать универсальную привязку для моей бд, если делать по Вашему примеру?
Например, такую:
C#
1
2
3
4
5
6
7
8
9
 static string GetConnectionString()
        {
 
            OleDbConnectionStringBuilder csb = new OleDbConnectionStringBuilder("Provider=Microsoft.ACE.OLEDB.12.0");
            string dataSource;
            dataSource = Path.Combine(Application.StartupPath, "Database.accdb");
            csb.DataSource = dataSource;
            return csb.ConnectionString;
        }
Чтобы нормально открывалось на других компьютерах.

Добавлено через 17 часов 26 минут
Все еще актуально, требуется запрос на обновление, который будет работать на других компьютерах (без конкретной привязки базы к каталогу)
0
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
25.06.2016, 13:46
WalkingTalking,
вот строка подключения:
C#
21
connetionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Database.accdb";
Файл БД должен находиться в одной папке с exe.
0
0 / 0 / 0
Регистрация: 28.09.2014
Сообщений: 103
25.06.2016, 20:32  [ТС]
Даценд,
Добавил Вашу строку подключения к коду запроса, который предоставил Sigma214.
Ошибок не вылетает, но обновления в таблице не происходит. Что не так? Может, из-за того, что условие связано с FIO, а не с id пользователя в таблице?
Вот часть кода:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
   ...
             else if (Pass1.Text == Pass2.Text)
            {
                string connetionString = null;
                OleDbConnection connection;
                OleDbDataAdapter oledbAdapter = new OleDbDataAdapter();
                string sql = null;
                connetionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Database.accdb";
                connection = new OleDbConnection(connetionString);
                sql = "UPDATE tblEmployee SET PasswordEmploee = 'Pass1' WHERE FIO = 'FIO'";
                try
                {
                    connection.Open();
                    oledbAdapter.UpdateCommand = connection.CreateCommand();
                    oledbAdapter.UpdateCommand.CommandText = sql;
                    oledbAdapter.UpdateCommand.ExecuteNonQuery();
                    MessageBox.Show("Пароль пользователя успешно изменен!", "Изменение пароля завершено.");
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }
                this.Close();
            }
            }
 
        private void PassForm_Load(object sender, EventArgs e)
        {
            using (OleDbConnection connect = new OleDbConnection(GetConnectionString()))
            {
                connect.Open();
                OleDbCommand cmd = new OleDbCommand("SELECT PasswordEmploee FROM  [tblEmployee] WHERE FIO=?  AND idStatus=?", connect);
                cmd.Parameters.AddWithValue("FIO", FIO.Text);
                cmd.Parameters.AddWithValue("idStatus", idStatus.Text);
                tryPass.Text = cmd.ExecuteScalar().ToString();
            }
        }
Подключение при загрузке формы GetConnectionString (это нужно, чтобы вытянуть правильный пароль из таблицы для дальнейшего сравнения):
C#
1
2
3
4
5
6
7
8
 static string GetConnectionString()
        {
 
            OleDbConnectionStringBuilder csb = new OleDbConnectionStringBuilder("Provider=Microsoft.ACE.OLEDB.12.0");
            string dataSource;
            dataSource = Path.Combine(Application.StartupPath, "Database.accdb");
            csb.DataSource = dataSource;
            return csb.ConnectionString;
0
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
25.06.2016, 21:18
Цитата Сообщение от WalkingTalking Посмотреть сообщение
но обновления в таблице не происходит
Вот строка запроса:
C#
1
sql = "UPDATE tblEmployee SET PasswordEmploee = 'Pass1' WHERE FIO = 'FIO'";
Этот запрос для записи, у которой поле FIO='FIO', установит значение поля PasswordEmploee равным 'Pass1'.
Во-первых, есть ли такая запись?
Во-вторых, для передачи значений в запрос используйте параметры.
https://msdn.microsoft.com/en-... .110).aspx
0
0 / 0 / 0
Регистрация: 28.09.2014
Сообщений: 103
25.06.2016, 21:29  [ТС]
Даценд,
FIO - это textbox, куда присваивается имя юзера из другой формы (а там уже из таблицы, здесь все работает)
PasswordEmploee в таблице - это текущий пароль (textbox CurrentPass на форме), который присваивается в скрытый textbox для сравнения и дальнейшей работы. В результате имеем FIO юзера и его пароль, который надо для него изменить на веденный в textbox Pass1. Не пойму почему так не работает. Пользователь в таблице существует, пароль тоже, а обновлять не хочет. С Параметрами не умею работать, не знаю как под свой код сделать.
0
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
25.06.2016, 21:56
Лучший ответ Сообщение было отмечено WalkingTalking как решение

Решение

WalkingTalking,
что-то вроде этого должно работать:
C#
1
2
3
4
5
6
7
8
9
10
11
sql = "UPDATE tblEmployee SET PasswordEmploee = @Pass1 WHERE FIO = @FIO";
try
{
    connection.Open();
    oledbAdapter.UpdateCommand = connection.CreateCommand(); //не знаю насчет этой строки
    oledbAdapter.UpdateCommand.CommandText = sql;
    oledbAdapter.UpdateCommand.Parameters.AddWithValue("@Pass1", textBoxNewPassword.Text); //вместо textBoxNewPassword.Text используйте переменную/свойство, в которой хранится новый пароль
    oledbAdapter.UpdateCommand.Parameters.AddWithValue("@FIO", textBoxFIO.Text);
    oledbAdapter.UpdateCommand.ExecuteNonQuery();
    MessageBox.Show("Пароль пользователя успешно изменен!", "Изменение пароля завершено.");
}
Я обычно не прибегаю к помощи адаптера при работе с базой. Вот пример кода:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
private void btnOK_Click(object sender, EventArgs e)
{
    using (OleDbConnection conn = new OleDbConnection(connString))
    {
        string commText = "update employers set FIO=?, Phone=?, BirthDate=?, Department=? where ID=?";
        OleDbCommand comm = new OleDbCommand(commText, conn);
        comm.Parameters.AddWithValue("@fio", tbFIO.Text);
        comm.Parameters.AddWithValue("@phone", tbPhone.Text);
        comm.Parameters.Add("@birthdate", OleDbType.Date).Value = dtpBirthDate.Value.ToShortDateString();
        comm.Parameters.AddWithValue("@dep", (int)comboBox1.SelectedValue);
        comm.Parameters.AddWithValue("@id", tbID.Text);
        conn.Open();
        try
        {
            comm.ExecuteNonQuery();
        }
        catch
        {
            MessageBox.Show("Изменить не удалось!");
        }
    }
}
1
0 / 0 / 0
Регистрация: 28.09.2014
Сообщений: 103
26.06.2016, 00:05  [ТС]
Даценд, Спасибо за помощь и код, все работает! Странно, что при указании напрямую текстбоксов в запросе обновление не выполнялось, а параметры исправили ситуацию. В чем их различие и где еще лучше использовать, чтобы не получилась такая неразбериха?
0
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
26.06.2016, 00:46
WalkingTalking,
Можно и текстбоксы указывать в запросе. Только саму строку запроса по другому формировать нужно:
C#
1
OleDbCommand cmd = new OleDbCommand("UPDATE [tblEmployee] SET PasswordEmploee ='" + tbPass.Text + "' WHERE FIO='" + tbFIO.Text + "'", connect);
Причем в зависимости от типов данных в таблице БД в тексте запроса нужно использовать либо одинарные кавычки (если тип - строка) либо решетки (дата) либо ничего не использовать (число). Использование параметров избавляет от необходимости собирать строку запроса из десятка отдельных элементов. К тому же при использовании параметров не нужно следить за типами данных и добавлять кавычки, решетки и т.п.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.06.2016, 00:46
Помогаю со студенческими работами здесь

Как обновить последнюю запись в таблице
сабж, пробую так: "UPDATE USER SET name='" + name+ "' WHERE id=(SELECT TOP(1) FROM USER)") Добавлено через 43 минуты ...

Обновить данные в таблице excel на основе даннх из Access
Уважаемые форумчане. Помогите пожалуйста решить следующую проблему. Есть база данных аксес. В базе используется связанная...

Обновить данные в таблице Access на основе данных из Excel
Добрый день, подскажите, пожалуйста, как решить задачу: Есть книга Excel "C:\Data\Новые сотрудники.xls". В этой книге есть лист...

Обновить DGV, если в таблице БД появилась новая запись
Ребята, подскаджите как (какие идеи) Есть задача - обновить dataGridView, если появилась новая запись в таблице "messages" (БД...

Если есть запись обновить, иначе вставить в Access
Здравствуйте, надо мне сделать приложение на C# для работы с базой Access. Заступорил когда надо обновить данные, если артикул совпадает....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. На мобильном - сканируйте QR-код. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru