SqlDataAdapter 更新不起作用

Posted

技术标签:

【中文标题】SqlDataAdapter 更新不起作用【英文标题】:SqlDataAdapter Update not working 【发布时间】:2013-12-23 17:32:41 【问题描述】:

我是 Windows 开发的新手,我正在尝试选择一个好的数据库管理模式,以便我可以将它用于我未来的应用程序。我发现的是这种行为,创建本地 Db-> 将其关联到 wpf DataGridView 和 DataSet-> 使用 sql 适配器来反映数据库中的数据更改。这是我写的:

<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() 不会从真实数据库中删除同一行,所以当我重新启动应用程序时我删除的记录再次出现...没有显示错误消息。我该怎么做才能从我的数据库中删除“真正”的记录?

编辑

我在某处读到 SelectCommand 应该使用 Adapter init 自动创建...无论如何我已经尝试添加:

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

这不起作用,也许我做错了什么?

【问题讨论】:

【参考方案1】:

您需要为适配器设置SelectCommand 属性,以便其他命令生成正常工作。请注意,这种方式会导致性能问题,具体取决于此代码在应用程序中的使用量。

【讨论】:

感谢您的回复,我已经编辑了我的问题。但是,你说如果我多次使用这段代码会导致性能不佳,你能告诉我一个正确的方法来管理像我这样的情况吗?【参考方案2】:

找到了解决方案,我的代码没问题,行确实被删除并插入到数据集和数据库中......问题是另一个问题,每次构建和运行应用程序时,默认设置数据库都会被覆盖。通过这种方式,我看不到我对查询所做的任何更改......所以我将我的数据库文件的属性设置为“从不复制”,第一次启动应用程序时,我必须手动复制项目 Debug 文件夹中的数据库,但对于所有其他构建,数据库正确响应更改。

【讨论】:

以上是关于SqlDataAdapter 更新不起作用的主要内容,如果未能解决你的问题,请参考以下文章

sqldataadapter 在 powershell 中不起作用

使用 SqlDataAdapter 填充 DataTable 时,CommandTimeout 不起作用

在 C# 中使用 SqlDataAdapter 更新数据库

为啥java更新查询不起作用?

SqlDataAdapter 插入后无法获取行

每秒更新 ListView 处理程序不起作用