Impossible de récupérer datatables dans une requête SQL. Fonctionne dans le server SQL mais échoue dans Visual Studio

J'ai les tables suivantes (CustomerType, Customer et Company) dans une database:

entrez la description de l'image ici

Dans asp.net, j'essaye d'écrire une requête comme ceci pour get des données qui répondent aux critères. Ma requête SQL comme suit:

SELECT co.[CompanyID], [CompanyName], co.[Address], co.[Phone], co.[Email], co.[WebPage] FROM [Company] AS co INNER JOIN [Customer] AS cu ON co.[CompanyID] = cu.[CompanyID] INNER JOIN [CustomerType] AS cut ON cu.[CustTypeID] = cut.[CustTypeID] WHERE co.[CompanyID] = @CompanyID AND cu.[CustTypeID] = @CustTypeID AND cu.[CustTypeID] <> 11 

Je récupère le "CompnayID" AND "CustTypeID" à partir de la string de requête. Mais lorsque j'ai testé cette requête dans Visual Studio, cela a provoqué une erreur indiquant "Impossible d'activer la contrainte: une ou plusieurs lignes contient des valeurs qui violent une contrainte non nulle, unique ou FK".

Cependant, lorsque j'exécute la même requête dans SQL Server Management Studio, il récupère correctement datatables. Pourquoi donc?

Voici la requête que j'ai écrite dans SQL Server Management Studio:

 SELECT co.[CompanyID], [CompanyName], co.[Address], co.[Phone], co.[Email], co.[WebPage] FROM [Company] AS co INNER JOIN [Customer] AS cu ON co. [CompanyID] = cu.[CompanyID] INNER JOIN [CustomerType] AS cut ON cu.[CustTypeID] = cut.[CustTypeID] WHERE co.[CompanyID] = 10001 AND cu.[CustTypeID] = 12 AND cu.[CustTypeID] <> 11 

Mise à jour :

J'ai même essayé Simple requête AS:

 SELECT co.[CompanyID], [CompanyName] FROM [Company] AS co INNER JOIN [Customer] AS cu ON co. [CompanyID] = cu.[CompanyID] 

Celui-ci provoque également le même problème, mais fonctionne dans le server sql.

Mise à jour 1: En ajoutant "ET cu.CustID = @CustID", la requête SQL fonctionne correctement. Mais je ne comprends toujours pas Pourquoi ma requête précédente ne fonctionne pas? quelqu'un peut-il expliquer?

C'est mon code ASP.NET:

 <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="CompanyID" DataSourceID="SqlDataSource1"> <Columns> <asp:BoundField DataField="CompanyID" HeaderText="CompanyID" InsertVisible="False" ReadOnly="True" SortExpression="CompanyID" /> <asp:BoundField DataField="CompanyName" HeaderText="CompanyName" SortExpression="CompanyName" /> <asp:BoundField DataField="Address" HeaderText="Address" SortExpression="Address" /> <asp:BoundField DataField="Phone" HeaderText="Phone" SortExpression="Phone" /> <asp:BoundField DataField="Email" HeaderText="Email" SortExpression="Email" /> <asp:BoundField DataField="WebPage" HeaderText="WebPage" SortExpression="WebPage" /> </Columns> </asp:GridView> <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionSsortingng="<%$ ConnectionSsortingngs:ICT_IdealComputerConnectionSsortingng %>" SelectCommand="SELECT co.CompanyID, co.CompanyName, co.Address, co.Phone, co.Email, co.WebPage FROM Customer AS cu INNER JOIN CustomerType AS cut ON cu.CustTypeID = Cut.CustTypeID INNER JOIN Company AS co ON cu.CompanyID = co.CompanyID AND cu.CustTypeID = @CustTypeID AND co.CompanyID = @CompanyID AND cu.CustID = @CustID AND cu.CustTypeID &lt;&gt; 11"> <SelectParameters> <asp:QuerySsortingngParameter Name="CustTypeID" QuerySsortingngField="CustTypeID" /> <asp:QuerySsortingngParameter Name="CompanyID" QuerySsortingngField="CompanyID" /> <asp:QuerySsortingngParameter Name="CustID" QuerySsortingngField="CustID" /> </SelectParameters> </asp:SqlDataSource> 

Vérifiez la propriété DataKeys – il est probable qu'une key unique a été créée intentionnellement ou automatiquement.

L'ajout de lignes en double peut alors avoir provoqué l'erreur que vous avez vue.

D'où proviendraient les duplicates?

Dans votre requête d'origine, sans l'ID du client spécifié, si vous avez une société liée à plus d'un client, vous obtiendrez des duplicates car il existe potentiellement une relation 1-à-plusieurs entre le client et la société (ce qui est logique comme vous pourriez avoir plusieurs clients de la même entreprise!).

Lorsque vous avez filtré par client, vous avez seulement obtenu une list d'entresockets uniques pour ce client, supprimant probablement les duplicates.

Lorsque vous dites "échoue dans Visual Studio" je suppose que vous voulez dire que votre programme lève une exception lorsqu'il est lancé à partir du débogueur Visual Studio? Cette erreur signifie que l'set de données / la structure de données dans laquelle vous essayez de placer datatables a des contraintes non nulles. Je ne peux pas dire à partir de votre capture d'écran laquelle il est, mais par exemple, supposons que Contact est "Non null". Comme il n'est inclus dans aucune de vos requêtes, le framework essaiera de le définir sur Null, ce qui provoquera l'échec de la contrainte. Vérifiez que vous incluez tous les non-null (en particulier le CompanyID puisqu'il s'agit de la key primaire) dans la clause select de toutes vos requêtes.

D'après ce que vous pouvez déduire de votre description d'erreur, il semble que vous ne définissez pas les parameters @CompanyID et @CustTypeID parameters de votre code .NET.

Sur votre Gridview, DataKeyNames devrait être "CustId", qui est une valeur unique.