当我使用LINQ to SQL编辑或删除wpf datagrid中的行时,查询发生异常

当我使用LINQ to SQL编辑或删除wpf datagrid中的行时,查询发生异常,wpf,datagrid,wpfdatagrid,Wpf,Datagrid,Wpfdatagrid,我是WPF和C的新手 我正在WPF Datagrid上尝试CRUD操作。我的datagrid显示了两个表中与外键引用链接的记录 但是,当我编辑单元格数据并单击submit按钮时,就会出现问题。异常情况下会显示以下消息 错误:“Exception已在调用时由目标抛出”,并且它指向 我用编辑代码编写的LINQtoSQL查询 执行删除操作时也会出现相同的问题 private void LoadDataGrid() { DataClassesDataContext da

我是WPF和C的新手

我正在WPF Datagrid上尝试CRUD操作。我的datagrid显示了两个表中与外键引用链接的记录

但是,当我编辑单元格数据并单击submit按钮时,就会出现问题。异常情况下会显示以下消息

错误:“Exception已在调用时由目标抛出”,并且它指向 我用编辑代码编写的LINQtoSQL查询

执行删除操作时也会出现相同的问题

    private void LoadDataGrid()
    {

        DataClassesDataContext dataContext = new DataClassesDataContext();

        var results = from b in dataContext.iBankNames
                      join acc in dataContext.iBankAccountNos on b.BankID equals acc.BankId
                      orderby b.Name ascending
                      select new
                      {
                          BankID = b.BankID,
                          BankName = b.Name,
                          BankAccNo = acc.BankAccNo,
                          BranchName = acc.Branch
                      };

        MyDataGrid.ItemsSource = results;

    }
这是我的wpf的XML代码

   <DataGrid x:Name="MyDataGrid" x:Uid="MyDataGrid" AutoGenerateColumns="False"
                   SelectionMode="Single" 
                AlternationCount="2"

              >
        <DataGrid.Columns>
            <DataGridTemplateColumn Header="Bank ID" Width="SizeToHeader">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBox IsReadOnly="True" Text="{Binding BankID,Mode=OneWay}"
                                />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

           <!----HERE ARE SOME MORE COLOUMNS----->


            <DataGridTemplateColumn Header="Edit Row">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Button Content="Edit" Click="EditButton_Click" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTemplateColumn Header="Delete Row">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Button Content="Delete" Click="DeleteButton_Click" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>

我正在使用VS 2012和SQL Server 2012 Express。

您可以试试这个。我认为这是正确的工作

private void EditButton_Click(object sender, RoutedEventArgs e)
{
    try
    {

        DataClassesDataContext dataContextEdit = new DataClassesDataContext();
                   object item = MyDataGrid.SelectedItem;

        string m = (MyDataGrid.SelectedCells[cellNumber].Column.GetCellContent(item) as TextBlock).Text
        iBankName bank = (from p in dataContextEdit.iBankNames
                             where p.BankID == m
                             select p).Single();

        bank.Name = (MyDataGrid.SelectedCells[ColumnNumber].Column.GetCellContent(item) as TextBlock).Text

        //iBankAccountNo banAccRow = MyDataGrid.SelectedItem as iBankAccountNo;

//similarly another object create and access item
object item = MyDataGrid.SelectedItem;
        iBankAccountNo bankAccNo = (from p in dataContextEdit.iBankAccountNos
                                        where p.BankAccNo == banAccRow.BankAccNo
                                        select p).Single();

        bankAccNo.BankAccNo = (MyDataGrid.SelectedCells[columnNumber].Column.GetCellContent(item) as TextBlock).Text
        bankAccNo.Branch = (MyDataGrid.SelectedCells[columnNumber].Column.GetCellContent(item) as TextBlock).Text

        dataContextEdit.SubmitChanges();

        MessageBox.Show("Row Updated Successfully.");

    }
    catch (Exception Ex)
    {
        MessageBox.Show(Ex.Message);
       // return;
    }
}

我猜,您的问题在于sql操作(可能是:更改主键,或错误外键构造,等等)。尝试在SSMS中直接使用sql语句模拟linq试图做的事情。我在SSMS中做过,但没有发现错误。外键约束中的每一件事都很好。您需要指定更详细的错误消息,如may。哪个linq导致了错误,当您分配bank变量或bankAccNo变量时的那个错误?嗯。。我能想到的可能的错误源:Single()将抛出错误。如果没有与查询匹配的数据,请使用SingleOrDefault()避免此错误。@har07谢谢。银行变量发生错误。但我不知道如何打印整个堆栈错误。我使用了SigleOrDefault(),但它也不起作用。当我在cathc异常上应用ex.InnerException.Message()时,它显示“对象引用未设置为对象的实例”。
private void EditButton_Click(object sender, RoutedEventArgs e)
{
    try
    {

        DataClassesDataContext dataContextEdit = new DataClassesDataContext();
                   object item = MyDataGrid.SelectedItem;

        string m = (MyDataGrid.SelectedCells[cellNumber].Column.GetCellContent(item) as TextBlock).Text
        iBankName bank = (from p in dataContextEdit.iBankNames
                             where p.BankID == m
                             select p).Single();

        bank.Name = (MyDataGrid.SelectedCells[ColumnNumber].Column.GetCellContent(item) as TextBlock).Text

        //iBankAccountNo banAccRow = MyDataGrid.SelectedItem as iBankAccountNo;

//similarly another object create and access item
object item = MyDataGrid.SelectedItem;
        iBankAccountNo bankAccNo = (from p in dataContextEdit.iBankAccountNos
                                        where p.BankAccNo == banAccRow.BankAccNo
                                        select p).Single();

        bankAccNo.BankAccNo = (MyDataGrid.SelectedCells[columnNumber].Column.GetCellContent(item) as TextBlock).Text
        bankAccNo.Branch = (MyDataGrid.SelectedCells[columnNumber].Column.GetCellContent(item) as TextBlock).Text

        dataContextEdit.SubmitChanges();

        MessageBox.Show("Row Updated Successfully.");

    }
    catch (Exception Ex)
    {
        MessageBox.Show(Ex.Message);
       // return;
    }
}