2013-12-23 5 views
1

Я новичок в разработке окон, я пытаюсь выбрать хороший шаблон управления базой данных, поэтому я могу использовать его для своих будущих приложений. Я нашел это поведение, создайте локальный Db-> связать его с wpf DataGridView и DataSet-> Использование адаптера sql, чтобы отразить изменение данных в базе данных. Это то, что я писал:Обновление SqlDataAdapter не работает

<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> 

Код За:

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() не удаляет ту же строку из реального db, поэтому, когда я перезапускаю приложение, запись, что у меня есть удаление, снова появляется ... Не отображается сообщение об ошибке. Как я делаю, чтобы удалить «действительно» запись из моего db?

EDIT

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

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

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

ответ

0

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

0

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

+0

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

Смежные вопросы