Ошибка: Ошибка невозможности ограничения.. ;при привязке записей в RadGrid

Ниже приведен код, который я использую для привязки RadGrid с использованием Stored Procedure.
Я вызываю Stored Procedure с использованием .xsd файла - подход TableAdapter

HTML-код:

<telerik:RadGrid ID="rgData" runat="server" ShowFooter="true"
OnNeedDataSource="rgData_NeedDataSource"
AllowSorting="True" AllowFilteringByColumn="True" ShowGroupPanel="True" GroupLoadMode="Client"
EnableEmbeddedSkins="False" ImagesPath="../App_Themes/MetroRed/Grid" Skin="MetroRed">
   <ClientSettings AllowDragToGroup="True"></ClientSettings>
   <GroupingSettings ShowUnGroupButton="false" CaseSensitive="false"></GroupingSettings>
   <MasterTableView ShowGroupFooter="true" CommandItemDisplay="None" AutoGenerateColumns="false" AllowMultiColumnSorting="true">
   <CommandItemSettings ShowAddNewRecordButton="false" />
    <Columns>
           <telerik:GridBoundColumn HeaderText="Billing ID" DataField="BillingID" SortExpression="BillingID" FilterDelay="2000" ShowFilterIcon="false">
       </telerik:GridBoundColumn>
       <telerik:GridBoundColumn HeaderText="Direct Cost" DataField="DCIDescription" SortExpression="DCIDescription" FilterDelay="2000" ShowFilterIcon="false">
       </telerik:GridBoundColumn>
           <telerik:GridBoundColumn HeaderText="Business Unit" DataField="BUName" SortExpression="BUName" FilterDelay="2000" ShowFilterIcon="false">
           </telerik:GridBoundColumn>
    </Columns>
   </MasterTableView>
</telerik:RadGrid>

Код C#:

private DataTable _dtData = null; 

protected void rgData_NeedDataSource(object sender, GridNeedDataSourceEventArgs e)
    {
        try
        {
            _dtData = SDM.Invoice.GetInvoiceBySPID(_SPID);
            rgData.DataSource = _dtData;
        }
        catch (Exception ex)
        {
        }
    }

Файл класса в папке BLL:

#region Invoice
private static SDM_Invoice _Invoice = null;
public static SDM_Invoice Invoice
{
    get
    {
        if (_Invoice == null)
        _Invoice = new SDM_Invoice();

        return _Invoice;
    }
}
#endregion

private SDM_Tran_GenerateInvoiceTableAdapter _GenerateInvoiceTableAdapter = null;
protected SDM_Tran_GenerateInvoiceTableAdapter Adapter
{
    get
    {
        if (_GenerateInvoiceTableAdapter == null)
                _GenerateInvoiceTableAdapter = new SDM_Tran_GenerateInvoiceTableAdapter();

            return _GenerateInvoiceTableAdapter;
    }
} 

public SDMDAL.SDM_Tran_GenerateInvoiceDataTable GetInvoiceBySPID(string SPID)
{
    return Adapter.GetInvoiceBillingBySPID(SPID);
}

Хранимая процедура для привязки RadGrid:

ALTER PROCEDURE [dbo].[Select_InvoiceBillingBySPID]
    @SPID as nvarchar(50)
    AS
BEGIN

    SET NOCOUNT ON; 

SELECT 
--B.ID,
B.BillingID, 
DCIDescription,
(SELECT BUName FROM dbo.SDM_Master_BU WITH (NOLOCK) WHERE BUID=AfoBUID) as BUName

FROM SDM_Tran_Billing B WITH (NOLOCK),
dbo.SDM_Tran_DCI D WITH (NOLOCK), 
dbo.SDM_Tran_Allocation A WITH (NOLOCK)

WHERE B.BfoAllocationID=AllocationID 
and A.AfoDCIID=D.DCIID 
and D.DCIfoSPID=@SPID
and B.BfoStatusID=1

END

Файл .xsd — адаптер таблицы

введите описание изображения здесь

Всякий раз, когда я запускаю свою веб-страницу, я получаю следующую ошибку:

Не удалось выполнить ограничения. Одна или несколько строк содержат значения, нарушающие ограничения, отличные от нулевых, уникальные или внешние ключи.

Я думаю, что ошибка связана с тем, что я связываю данные в RadGrid, используя 3 разные таблицы (у которых есть собственный первичный ключ) в хранимой процедуре, а затем вызываю эту хранимую процедуру в какой-то другой адаптер таблицы, который имеет свой собственный первичный ключ. Но не уверен, верна ли причина, которую я понял, или нет.

ПРИМЕЧАНИЕ: когда я запускаю мастер запросов Stored Proc в Sql, он работает нормально, но когда я запускаю свою страницу, я получаю указанную выше ошибку.

Но мне нужно связать RadGrid, используя 3 таблицы (как указано выше).

Пожалуйста, дайте мне знать, как решить эту ошибку. Заранее спасибо.


person user3196511    schedule 25.09.2015    source источник


Ответы (1)


Заменено ниже строки кода:

_dtData = SDM.Invoice.GetInvoiceBySPID(_SPID); 

с участием:

_dtData = SDM.Billing.GetBillingBySPID(_SPID);

так как Invoice TableAdapter/Table уже имеет первичный ключ в своей таблице базы данных, и
я использовал другие таблицы базы данных, которые имеют свой собственный первичный ключ, с Invoice TableAdapter/Table, поэтому он выдавал мне ошибку. Проблема решена.

person user3196511    schedule 28.09.2015