【问题标题】:Trying to delete entries from SQLite db in Visual Studio 2015, c#, Universal Windows App, no errors, but not deletes尝试从 Visual Studio 2015、c#、通用 Windows 应用程序中的 SQLite db 中删除条目,没有错误,但没有删除
【发布时间】:2016-06-14 15:59:18
【问题描述】:

我似乎无法从绑定数据库的 ListView 中删除条目。我可以看到数据库中的所有内容,并添加了复选框,我如何选择它并不重要......它不会删除条目。我要疯了,我已经尝试了我能找到的一切。所以这是我的列表视图代码

好的,然后更新。当我放入时

var existingconact = conn2.Query<Medications>("select * from Medications where Id = 4").FirstOrDefault();

我单击按钮,它会删除它并更新表格。所以我的 ID 有问题。

 <StackPanel Margin="20, 240, 0 0">
            <ListView Header="Medications" x:Name="myList" Background="DimGray" HorizontalAlignment="Right" Margin="0,0,0,0" Width="600">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <Grid Width="600">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*" />
                            <ColumnDefinition Width="*" />
                            <ColumnDefinition Width="*" />
                            <ColumnDefinition Width="*" />
                            <ColumnDefinition Width="*" />
                        </Grid.ColumnDefinitions>
                        <CheckBox  HorizontalAlignment="Right"  VerticalAlignment="Center" x:Name="CheckBoxItem"/>

                        <TextBlock x:Name="Id" Grid.Column="1" Text="{Binding Id}" TextWrapping="Wrap" />

                        <TextBlock x:Name="medName" Grid.Column="2" Text="{Binding MedName}" TextWrapping="Wrap" />
                        <TextBlock Grid.Column="3" x:Name="medDose" Text="{Binding MedDose}" TextWrapping="Wrap" />
                        <TextBlock Grid.Column="4" x:Name="whatFor" Text="{Binding WhatFor}" TextWrapping="Wrap" />


                    </Grid>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

    </StackPanel>

这是我用来尝试删除条目的按钮命令

   private void btn_Remove_Click(object sender, RoutedEventArgs e)
    {



        DBPath2 = Path.Combine(Windows.Storage.ApplicationData.Current.LocalFolder.Path, "meds.sqlite");
        using (SQLite.Net.SQLiteConnection conn2 = new SQLite.Net.SQLiteConnection(new SQLite.Net.Platform.WinRT.SQLitePlatformWinRT(), DBPath2))

        {
            var existingconact = conn2.Query<Medications>("select * from Medications where Id = ?").FirstOrDefault();
            if (existingconact != null)
            {
                conn2.RunInTransaction(() =>
                {
                    conn2.Delete(existingconact);
                });

如果你想看看,我的架构

 public class Medications
    {
        [PrimaryKey, AutoIncrement]
        public int Id { get; set; }
        public string MedName { get; set; }
        public string MedDose { get; set; }
        public string WhatFor { get; set; }


    }

【问题讨论】:

    标签: c# database sqlite win-universal-app


    【解决方案1】:

    好的,我明白了!这是 Meds.xaml.cs 中的一小行

    这是处理点击的按钮。

    private void btn_Remove_Click(object sender, RoutedEventArgs e)
        {
    
            DBPath2 = Path.Combine(Windows.Storage.ApplicationData.Current.LocalFolder.Path, "meds.sqlite");
            using (SQLite.Net.SQLiteConnection conn2 = new SQLite.Net.SQLiteConnection(new SQLite.Net.Platform.WinRT.SQLitePlatformWinRT(), DBPath2))
    
            {
    // **This as where the error was**
                var existingconact = conn2.Query<Medications>("select * from Medications where **Id = Id"**).FirstOrDefault();
                if (existingconact != null)
                {
                    conn2.RunInTransaction(() =>
                       {
                           conn2.Delete(existingconact);
                       });
                    myList.ItemsSource = conn2.Table<Medications>();
                }
            }
        }
    
    }
    

    }

    【讨论】:

      【解决方案2】:

      您从未传入 ID 来查找 SQLite 记录。这一行:

      var existingconact = conn2.Query<Medications>("select * from Medications where Id = ?").FirstOrDefault();
      

      需要传入Id的值:

      var existingconact = conn2
          .Query<Medications>(
                      "select * from Medications where Id = ?", 
                       myList.SelectedItem.Id)
          .FirstOrDefault();
      

      现在,您需要处理从选定行获取 ID。您可能必须将 myList.SelectedItem 强制转换为您预期的数据类型才能编译。

      您可以通过将硬编码测试重试到参数化测试中来验证这一点:

      var existingconact = conn2.Query<Medications>("select * from Medications where Id = ?", 4).FirstOrDefault();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-09
        • 1970-01-01
        • 2017-07-17
        • 2021-12-23
        相关资源
        最近更新 更多