powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / DataGrid + DataTable +БД MS SQqlServer ошибка при добавлении/изменении записи
4 сообщений из 4, страница 1 из 1
DataGrid + DataTable +БД MS SQqlServer ошибка при добавлении/изменении записи
    #39563255
r.gribachev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго всем времени суток. Работаю с VS2015 несколько дней - тапками и табуретками прошу не бросаться. Словил ошибку, которую не могу самостоятельно определить.
Определение таблицы :
Три поля. Поле IDC в БД является первичным ключом

Код: c#
1.
2.
3.
4.
5.
6.
7.
public partial class Customers1DataTable : global::System.Data.TypedTableBase<Customers1Row> {

private global::System.Data.DataColumn columnIDC;

private global::System.Data.DataColumn columnCustomer_Name;

private global::System.Data.DataColumn columnCustomer_Adress;



Code Behind:
Код: 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.
39.
40.
41.
42.
43.
44.
45.
46.
47.
namespace TST
{
/// <summary>
/// Логика взаимодействия для MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}


}
public class CustomerDataProvider
{
public TST.DataSetTST TESTDataSet;
public TST.DataSetTSTTableAdapters.Customers1TableAdapter TESTAdapter;


public CustomerDataProvider()
{
TESTDataSet = new DataSetTST();
TESTAdapter = new DataSetTSTTableAdapters.Customers1TableAdapter();
TESTAdapter.Fill(TESTDataSet.Customers1);
TESTDataSet.Customers1.Customers1RowChanged += new DataSetTST.Customers1RowChangeEventHandler(CustomersRowModified);
TESTDataSet.Customers1.Customers1RowDeleted += new DataSetTST.Customers1RowChangeEventHandler(CustomersRowModified);
}
public DataView GetCustomers()
{
return TESTDataSet.Customers1.DefaultView ;
}

void CustomersRowModified(object sender, DataSetTST.Customers1RowChangeEvent e)
{
try
{
TESTAdapter.Update(TESTDataSet.Customers1);
TESTDataSet.Customers1.AcceptChanges();
}
catch (Exception ex)
{
MessageBox.Show("Ошибка:" + ex.GetBaseException()+' '+ ex.HResult +' '+ ex.Message +' '+ex.Source );
}
}
}
} 



XAML:
<Window x:Class="TST.MainWindow"
xmlns=" http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x=" http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d=" http://schemas.microsoft.com/expression/blend/2008"
xmlns:dg=" http://schemas.microsoft.com/wpf/2008/toolkit"
xmlns:mc=" http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:TST"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<ObjectDataProvider x:Key="CustomerDataProvider" ObjectType="{x:Type local:CustomerDataProvider}" />
<ObjectDataProvider x:Key="Customers1" ObjectInstance="{StaticResource CustomerDataProvider}" MethodName="GetCustomers"/>
</Window.Resources>
<Grid DataContext="{Binding Source={StaticResource Customers1}}" >
<DataGrid x:Name="dataGrid" ItemsSource="{Binding}" HorizontalAlignment="Left" Margin="18,11,0,0" VerticalAlignment="Top" Height="296" Width="487" AutoGenerateColumns="True"/>
</Grid>
</Window>

Собственно проблема: при удалении строки в DataGrid код отрабатывает без ошибок. При попытке добавления записи или редактирования существующей возникает исключение. Скрин сообщения системы об ошибке во вложении.
Формат вывода сообщения об ошибке: MessageBox.Show("Ошибка:" + ex.GetBaseException()+' '+ ex.HResult +' '+ ex.Message +' '+ex.Source );


Ткните, пожалуйста, в какую сторону копать?
...
Рейтинг: 0 / 0
DataGrid + DataTable +БД MS SQqlServer ошибка при добавлении/изменении записи
    #39563349
r.gribachev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Локализовал источник ошибки.

Для заполнения DataTable используется метод Fill адаптера TableAdapter.

Про Fill пишутЬ следующее:

Метод Fill объекта DataAdapter служит для заполнения набора данных DataSet результатами выполнения метода SelectCommand объекта DataAdapter. Метод Fill принимает в качестве аргумента подлежащий заполнению набор данных DataSet, а также объект DataTable или имя объекта DataTable, который должен быть заполнен строками, возвращенными методом SelectCommand.

Метод Fill неявно использует объект DataReader
для возврата имен и типов столбцов, используемых для создания таблиц в DataSet, и данных для заполнения строк таблиц в DataSet.
https://msdn.microsoft.com/ru-ru/library/bh8kx08z(v=vs.110).aspx

Про DataReader пишутЬ:
По окончании использования объекта DataReader всегда следует вызывать метод Close.

Если метод Command содержит выходные параметры или возвращаемые значения, они будут недоступны до закрытия объекта DataReader.

Имейте в виду, что пока объект DataReader открыт, соединение Connection используется исключительно этим объектом DataReader . Невозможно выполнять какие-либо команды для Connection, включая создание другого объекта DataReader, пока исходный объект DataReader не будет закрыт.
https://msdn.microsoft.com/ru-ru/library/haa3afyz(v=vs.110).aspx

Возникает вопрос. Неужели в Microsoft не включили инструкцию Close() в тело метода Fill.

В проекте Connection к БД висит открытым с самого начала. Думаю, если добавить после вызова метода Fill в коде инструкцию закрытия Connection, а перед следующими вызовами Fill, Insert, Update, Delete соединение снова открывать это решит проблему.
...
Рейтинг: 0 / 0
DataGrid + DataTable +БД MS SQqlServer ошибка при добавлении/изменении записи
    #39566576
r.gribachev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нашёл таки саму ошибку. Ошибка была не в коде приложения, а в ХП БД, которые обеспечивают Update и Insert.

Конструктор VS, который помогает создать DataSet и TableAdapter, поче му то включил в тело обоих ХП помимо собственно инструкций Update и Insert ещё и Select. Достаточно было закомментить в теле ХП эти Select'ы и код стал отрабатывать в проектном режиме. Причём в ХП, отвечающую за Delete, конструктором инструкция Select не добавлялась.
Привожу обе ХП с уже закомментированными Select'ами
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
USE [semist]
GO
/****** Object: StoredProcedure [dbo].[NewUpdateCommand] Script Date: 12/08/2017 18:33:53 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[NewUpdateCommand]
(
@IDC int,
@Customer_Name nchar(20),
@Customer_Adress nchar(20),
@Original_IDC int,
@Original_Customer_Name nchar(20),
@Original_Customer_Adress nchar(20)
)
AS
SET NOCOUNT OFF;
UPDATE [Customers] SET [IDC] = @IDC, [Customer Name] = @Customer_Name, [Customer Adress] = @Customer_Adress WHERE (([IDC] = @Original_IDC) AND ([Customer Name] = @Original_Customer_Name) AND ([Customer Adress] = @Original_Customer_Adress));

--SELECT IDC, [Customer Name], [Customer Adress] FROM Customers WHERE (IDC = @IDC) 



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
 USE [semist]
GO
/****** Object: StoredProcedure [dbo].[NewInsertCommand] Script Date: 12/08/2017 18:34:30 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[NewInsertCommand]
(
@IDC int,
@Customer_Name nchar(20),
@Customer_Adress nchar(20)
)
AS
SET NOCOUNT OFF;
INSERT INTO [Customers] ([IDC], [Customer Name], [Customer Adress]) VALUES (@IDC, @Customer_Name, @Customer_Adress);

--SELECT IDC, [Customer Name], [Customer Adress] FROM Customers WHERE (IDC = @IDC)
...
Рейтинг: 0 / 0
DataGrid + DataTable +БД MS SQqlServer ошибка при добавлении/изменении записи
    #39566686
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
r.gribachev,
Впервые вижу чтобы студия сама правила хранимки
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / DataGrid + DataTable +БД MS SQqlServer ошибка при добавлении/изменении записи
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]