Отправляет email-рассылки с помощью сервиса Sendsay

RFpro.ru: Microsoft .NET

  Все выпуски  

RusFAQ.ru: .NET


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный платный хостинг на базе Windows 2008

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Чемпионы рейтинга экспертов в этой рассылке

Micren
Статус: Практикант
Рейтинг: 279
∙ повысить рейтинг >>
AMV007
Статус: 2-й класс
Рейтинг: 99
∙ повысить рейтинг >>
Абельхарисов Руслан/Marked One
Статус: Практикант
Рейтинг: 37
∙ повысить рейтинг >>

∙ / КОМПЬЮТЕРЫ И ПО / Языки программирования / Microsoft .NET

Выпуск № 150 от 06.06.2009, 22:35
Администратор рассылки: Alexey G. Gladenyuk, Управляющий
В рассылке: подписчиков - 307, экспертов - 49
В номере: вопросов - 1, ответов - 1

Нам очень важно Ваше мнение об этом выпуске рассылки. Вы можете оценить этот выпуск по пятибалльной шкале, пройдя по ссылке:
оценить выпуск >>

Вопрос № 168716: Доброго времени суток, уважаемые эксперты. Пытаюсь работать с базой данных ACCESS посредством DataSet. Данные загружаются нормально, но после удаления одной строки из виртуальной таблицы эти изменения не применяются к базе данных. Таблица в базе данн...



Вопрос № 168716:

Доброго времени суток, уважаемые эксперты. Пытаюсь работать с базой данных ACCESS посредством DataSet. Данные загружаются нормально, но после удаления одной строки из виртуальной таблицы эти изменения не применяются к базе данных. Таблица в базе данных имеет имя Avto и состоит из двух столбцов: Nomer - текстовый(20) и Ves - числовой(целое). Как применить изменения к базе данных? Заранее благодарен за ответ.

Отправлен: 01.06.2009, 22:28
Вопрос задал: Рязанов Максим Валерьевич, Студент
Всего ответов: 1
Страница вопроса >>


Отвечает Micren, Практикант :
Здравствуйте, Рязанов Максим Валерьевич.
Приведу пример с использованием адаптера данных.

Для примера я использовал MS SQL Server 2008 поэтому строка соединения отличается от Вашей.

База данных TestDB состоит из:

Для теста заполнил данными:


Теперь создадим хранимую процедуру:
Код:

CREATE PROCEDURE AvtoDelete(@Nomer NCHAR(10)) AS
SET NOCOUNT OFF
DELETE FROM [TestDB].[dbo].[Avto]
WHERE Nomer = @Nomer
GO

Эта процеду ра и будет удалять запись в базе данных по номеру.

Дальше программа. Тестировал в MS VS 2008. Программа просто удаляет записи где Ves>2000.
Код:

using System;
using System.Data;
using System.Data.SqlClient;

namespace _168716_2
{
class Program
{
// Строка соединения
static string connectionString = "server=(local); Database=TestDB;Integrated Security=True";

static void Main(string[] args)
{
try
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
// Создадим набор данных
DataSet dataSet = new DataSet();
// Создадим адаптер данных
SqlDataAdapter dataAdapter = new SqlDataAdapter("SELECT * FROM Avto", connection);
// Теперь самый важный момент ради которого Вы задавали вопрос
// Создаем команду
SqlCommand cmd = new SqlCommand("AvtoDelete", connection);
// Тип команды - хранимая процедура
cmd.CommandType = CommandType.StoredProcedure;
// Задаем параметры
cmd.Parameters.Add(new SqlParameter("@Nomer", SqlDbType.NChar, 10, "Nomer"));
// Игнорировать возврат
cmd.UpdatedRowSource = UpdateRowSource.None;
// Назначаем для команды удаления в адаптере данных нашу комманду
dataAdapter.DeleteCommand = cmd;
// Заполним набор данных
dataAdapter.Fill(dataSet, "Avto");
// Это чисто для примера
foreach (DataTable dt in dataSet.Tables)
{
Console.WriteLine("Таблица данных: {0}", dt.TableName);
Console.WriteLine("Таблица имеет следующие колонки:");
foreach (DataColumn dc in dt.Columns)
{
Console.WriteLine("{0} - {1}", dc.ColumnName, dc.DataType.Name);
}
}
// Выводим записи базы и сразу удаляем строки в которых Ves больше 2000
Console.WriteLine("Исходная база:");
foreach (DataRow dr in dataSet.Tables["Avto"].Rows)
{
Console.WriteLine("{0} - {1}", dr["Nomer"], dr["Ves"]);
if ((int)dr["Ves"] > 2000)
{
dr.Delete();
}
}
// На самом деле строки еще не удалены из набора данных, а только лишь помечены как Deleted
// А вот теперь настоящее удаление
dataAdapter.Update(dataSet.Tables["Avto"]);

// Выводим то, что получилось
Console.WriteLine("Результат:");
foreach (DataRow dr in dataSet.Tables["Avto"].Rows)
{
Console.WriteLine("{0} - {1}", dr["Nomer"], dr["Ves"]);
}
}
}
catch (System.Exception ex)
{
Console.WriteL ine("Исключение: {0}", ex.Message);
}
finally
{
Console.WriteLine("Нажмите любую клавишу для завершения");
Console.ReadKey();
}
}
}
}

Вывод программы:
Код:

Таблица данных: Avto
Таблица имеет следующие колонки:
Nomer - String
Ves - Int32
Исходная база:
1 - 1222
2 - 1500
3 - 2500
4 - 4000
5 - 1200
6 - 9999
Результат:
1 - 1222
2 - 1500
5 - 1200


В VS 2008 можно работать с базой данных еще так.
1. Предположим у нас есть следующая база ACCESS. Назвал ее ка к и у Вас MyBase.mdb

2. Создаем новый проект
3. На вкладке Data выбираем Add New Data Source.
4. Выбираем Database и жмем Next.
5. Выбираем New Connection.
6. Напротив Data Source выбираем Change.
7. Поскольку, на Vista x64 Microsoft не считает необходимым поддерживать OLEDB и т.п. драйвера я выбрал ODBC. Вы же вольны выбирать что Вам вздумается.
8. В Data Source Specification выбираем Use Connection String и Build.
9. Вкладка «Источник данных компьютера» и выбираем Создать.

10. Тип источника пользовательский.
11. Драйвер Microsoft Access Driver(*.mdb, *.accdb)

12. Завершив этот диалог мы увидим следующее окно. Задаем имя источника. Жмем «База данных» Выбрать.

13. Выбираем файл базы данных и завершаем диалог.
14. После этого можно проверить соединение нажав Test Connection. < br>15. Нажимаем OK и возвращаемся в Data Source Configuration Wizard. Нажимаем Next.
16. Далее следует предложение сохранить строку соединения в файле конфигурации. Жмем Next.
17. Видим структуру нашей базы данных. Выбираем таблицу и имя для набора данных и жмем Finish.

18. После этого видим в Solution Explorer добавились файлы. Клацнем на MyBaseDataSet.xsd и увидим окно дизайнера.

19. Перетащим из ToolBox компонент Query. Открывает ся окно Table Adapter Query Configuration Wizard. Жмем Next.
20. Выбираем Use SQL Statement или если есть хранимые процедуры можем использовать и их. Жмем Next.
21. Далее выбираем тип запроса. Для нашей задачи достаточно. DELETE и жмем Next.
22. Далее пишем все ту же процедуру удаления(для Вашей базы возможно придется подкорректировать)
Код:
CREATE PROCEDURE RowDelete(@Nomer NCHAR(10)) AS
SET NOCOUNT OFF
DELETE FROM [MyBase].[dbo].[Avto]
WHERE Nomer = @Nomer
GO

И жмем Next.
23. Выбираем имя для запроса и Finish.


Остальное смотрите в программе.
Код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Data.Odbc;

namespace MyBaseTest
{
class Program
{
static void Main(string[] args)
{
try
{
// Этот адаптер сам создаст соединение
MyBaseDataSetTableAdapters.AvtoTableAdapter da = new MyBaseDataSetTableAdapters.AvtoTableAdapter();
// Остальное Вам уже знакомо
MyBaseDataSet ds = new MyBaseDataSet();
da.Fill(ds.Avto);
Console.WriteLine("Исходная база:");
foreach (MyBaseDataSet.AvtoRow r in ds.Avto)
{
Console.WriteLine("{0} | {1}", r.Nomer, r.Ves);
if(r.Ves>2000)
{
r.Delete();
}
}
da.Update(ds.Avto);
Console.WriteLine("Результат:");
foreach (MyBaseDataSet.AvtoRow r in ds.Avto)
{
Console.WriteLine("{0} | {1}", r.Nomer, r.Ves);
}
}
catch (System.Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
Console.ReadKey();
}
}
}
}

Код:

Исходная база:
1 | 1111
2 | 1234
3 | 2001
4 | 2323
5 | 3211
6 | 1121
7 | 1211
Результат:
1 | 1111
2 | 1234
6 | 1121
7 | 1211

Если нужен файл проекта вышлю.
По просьбе эксперта добавлен его ответ из мини-форума.
-----
∙ Отредактировал: Николай Владимирович / Н.В., Старший модератор
∙ Дата редактирования: 05.06.2009, 14:15 (время московское)

Ответ отправил: Micren, Практикант
Ответ отправлен: 04.06.2009, 14:28

Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 250420 на номер 1151 (Россия) | Еще номера >>
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!



    Нам очень важно Ваше мнение об этом выпуске рассылки. Вы можете оценить этот выпуск по пятибалльной шкале, пройдя по ссылке:
    оценить выпуск >>

    подать вопрос экспертам этой рассылки >>

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров >>

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2009, Портал RFpro.ru, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2009.6.0 beta от 24.05.2009

    В избранное