Обновление SqlDataAdapter не работает

Я новичок в разработке Windows, я пытаюсь выбрать хороший шаблон управления базой данных, чтобы я мог использовать его для своих будущих приложений. Я обнаружил такое поведение: Create Local Db-> связать его с wpf DataGridView и DataSet-> Use of the sql Adapter, чтобы отразить изменение данных в базе данных. Вот что я написал:

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:DB" x:Class="DB.MainWindow"
    Title="MainWindow" Height="350" Width="800" Loaded="Window_Loaded">

<Window.Resources>
    <local:DataBaseMioDataSet x:Key="dataBaseMioDataSet"/>
    <CollectionViewSource x:Key="gallerieViewSource" Source="{Binding Gallerie, Source={StaticResource dataBaseMioDataSet}}"/>
</Window.Resources>

<Grid DataContext="{StaticResource gallerieViewSource}">


    <DataGrid x:Name="gallerieDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected" Margin="10,10,210,109" ItemsSource="{Binding}" EnableRowVirtualization="True" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn x:Name="idColumn" Width="SizeToHeader" Header="Id" Binding="{Binding Id}"/>
            <DataGridTextColumn x:Name="idgalleriaColumn" Width="SizeToHeader" Header="idgalleria" Binding="{Binding idgalleria}"/>
            <DataGridTextColumn x:Name="pathImgColumn" Width="SizeToHeader" Header="path Img" Binding="{Binding pathImg}"/>
        </DataGrid.Columns>
    </DataGrid>
    <TextBox x:Name="idgalleriaAdd" HorizontalAlignment="Left" Height="23" Margin="612,14,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="98"/>
    <TextBox x:Name="pathgalleriaAdd" HorizontalAlignment="Left" Height="23" Margin="612,51,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="98"/>
    <Label x:Name="labell" Content="idgalleria" HorizontalAlignment="Left" Margin="724,14,0,0" VerticalAlignment="Top" />
    <Label x:Name="labell_Copy" Content="pathgalleria" HorizontalAlignment="Left" Margin="715,51,0,0" VerticalAlignment="Top" />
    <Button Content="Add" HorizontalAlignment="Left" Margin="612,96,0,0" VerticalAlignment="Top" Width="170" Click="addrow"/>
    <Button Content="Delete" HorizontalAlignment="Left" Margin="612,145,0,0" VerticalAlignment="Top" Width="170" Click="deleterow"/>

</Grid>

Code Behind :

 private void Window_Loaded(object sender, RoutedEventArgs e)
    {

        DB.DataBaseMioDataSet dataBaseMioDataSet = ((DB.DataBaseMioDataSet)(this.FindResource("dataBaseMioDataSet")));
        // Carica i dati nella tabella Gallerie. Se necessario, è possibile modificare questo codice.
        DB.DataBaseMioDataSetTableAdapters.GallerieTableAdapter dataBaseMioDataSetGallerieTableAdapter = new DB.DataBaseMioDataSetTableAdapters.GallerieTableAdapter();
        dataBaseMioDataSetGallerieTableAdapter.Fill(dataBaseMioDataSet.Gallerie);
        System.Windows.Data.CollectionViewSource gallerieViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("gallerieViewSource")));
        gallerieViewSource.View.MoveCurrentToFirst();
    }


        public static SqlDataAdapter GetTableRecord(DataBaseMioDataSet datSet)
    {

        SqlConnection connection = new SqlConnection(Properties.Settings.Default.DataBaseMioStringaConnessione);//Set the connection to the SQL server
        connection.Open();


        string query = "SELECT * from Gallerie";
        SqlCommand command = new SqlCommand(query, connection);
        SqlDataAdapter adp = new SqlDataAdapter(command);
        SqlCommandBuilder commandBuilder = new SqlCommandBuilder(adp);
        adp.UpdateCommand = commandBuilder.GetUpdateCommand();
        adp.InsertCommand = commandBuilder.GetInsertCommand();
        adp.DeleteCommand = commandBuilder.GetDeleteCommand();



        return adp;
    }


 public void deleterow(object sender, RoutedEventArgs e)
    {




        DB.DataBaseMioDataSet DataBaseMioDataSet = ((DB.DataBaseMioDataSet)(this.FindResource("dataBaseMioDataSet")));

        int totalrow= DataBaseMioDataSet.Tables["Gallerie"].Rows.Count;
        int lastrow= totalrow- 1;

        DataBaseMioDataSet.Tables["Gallerie"].Rows[lastrow].Delete();

        SqlDataAdapter adp = GetTableRecord(DataBaseMioDataSet);
        adp.Fill(DataBaseMioDataSet, "Gallerie");
        adp.Update(DataBaseMioDataSet, "Gallerie");


    }

С помощью этого кода я могу правильно визуализировать данные в моей таблице «Галерея». Проблема связана с модификацией таблицы, я могу правильно удалить из набора данных последнюю строку (я вижу, что она исчезает из dataGrid), но adp.Update() не удаляет ту же строку из реальной базы данных, поэтому, когда я перезапускаю приложение запись, которую я удалил, появляется снова... Сообщение об ошибке не отображается. Как я могу удалить «действительно» запись из моей БД?

РЕДАКТИРОВАТЬ

Я где-то читал, что SelectCommand должен создаваться автоматически с инициализацией адаптера... Во всяком случае, я попытался добавить:

string query = "SELECT * from Gallerie";
SqlCommand command = new SqlCommand(query, connection); 
adp.SelectCommand = command;

Это не работает, может быть, я делаю что-то еще не так?


person user31929    schedule 23.12.2013    source источник


Ответы (2)


Вам необходимо установить свойство SelectCommand для адаптера, чтобы генерация других команд работала. Обратите внимание, что этот способ приводит к проблемам с производительностью в зависимости от того, насколько этот код используется в приложении.

person danish    schedule 23.12.2013
comment
спасибо за ответ, я отредактировал свой вопрос. Однако вы говорите, что этот код может вызвать проблемы с производительностью, если я буду использовать его много раз, можете ли вы сказать мне, как правильно справиться с ситуацией, подобной моей? - person user31929; 30.12.2013

Решение найдено, мой код в порядке, строки действительно удаляются и вставляются в набор данных и базу данных... Проблема в другом, с настройками по умолчанию база данных будет перезаписываться каждый раз, когда я создаю и запускаю приложение. Таким образом, я не вижу никаких изменений, которые я сделал с моими запросами... Поэтому я установил для свойства моего файла базы данных значение «Никогда не копировать», при первом запуске приложения я должен сделать ручную копию базы данных в папке отладки проекта, но для всех остальных сборок база данных корректно реагирует на изменения.

person user31929    schedule 30.12.2013