2012-02-29 13 views
1

失敗,我有以下表中數據的基礎上(CustomerType,客戶和公司):無法檢索sql查詢中的數據。作品在SQL Server中,但在Visual Studio

enter image description here

在asp.net,我想寫一個這樣的查詢得到一些符合標準的數據。我的SQL查詢如下:

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 

我從查詢字符串中檢索「CompnayID」和「CustTypeID」。但是當我測試在Visual Studio這個查詢,就引起了一個錯誤,說「失敗,使約束。一個或多個行包含違反非空,唯一或FK約束」

如何過,當我運行相同在SQL服務器管理工​​作室中查詢它正確地檢索數據。這是爲什麼?

這是我在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 

更新:

我甚至嘗試簡單的查詢AS:

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

這其中也導致同樣的問題,但在SQL Server中工作。

更新1: 通過添加「和cu.CustID = @CustID」,SQL查詢工作正常。但我仍然不明白爲什麼我以前的查詢不起作用?有人可以解釋嗎?

這是我的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" 
      ConnectionString="<%$ ConnectionStrings:ICT_IdealComputerConnectionString %>" 
    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:QueryStringParameter Name="CustTypeID" QueryStringField="CustTypeID" /> 
       <asp:QueryStringParameter Name="CompanyID" QueryStringField="CompanyID" /> 
       <asp:QueryStringParameter Name="CustID" QueryStringField="CustID" /> 
      </SelectParameters> 
     </asp:SqlDataSource> 
+0

先嚐試一個更簡單的查詢,以確保一切正常:從公司 – 2012-02-29 15:52:23

+0

選擇頂部10 *是的這個「從公司選擇最佳10 *」的作品,我試着像「選擇合作[公司ID],[公司名稱]公司] AS co INNER JOIN [客戶] AS cu ON co。[CompanyID] = cu。[CompanyID]「。即使這個連接在Visual Studio中失敗,但在Sql Server中工作 – Sas 2012-02-29 15:58:20

+0

你用什麼來做你的.NET數據訪問;實體框架,輸入數據集,原始ADO.NET?你可以顯示你正在嘗試運行的.NET代碼嗎? – JamieSee 2012-02-29 16:21:49

回答

2

檢查DataKeys屬性 - 很可能是有意或自動創建了唯一的密鑰。

添加重複行可能會導致您看到的錯誤。

重複來自哪裏?

在您最初的查詢中,如果沒有指定客戶ID,如果您有任何公司鏈接到多個客戶,您將獲得重複行,因爲客戶與客戶之間可能存在一對多關係公司(這是有道理的,因爲你可以有同一家公司的多個客戶!)。

當您按客戶過濾時,您只會獲得該客戶的唯一公司列表,可能會刪除任何重複項。

+0

好了解釋,thanx – Sas 2012-02-29 18:16:54

1

當你說「無法在Visual Studio中」我想你的意思是從Visual Studio調試器啓動時程序會拋出一個異常?該錯誤意味着您試圖將數據放入的數據集/數據結構有一些非空約束。我無法從屏幕截圖中知道它是哪一個,但例如,讓我們假設Contact爲「Not null」。由於它不包含在你的任何一個查詢中,框架將嘗試將它設置爲Null,這會導致約束失敗。檢查以確保在所有查詢的select子句中包含任何非null(尤其是CompanyID,因爲它是主鍵)。

+0

通過添加「和cu.CustID = @CustID」查詢工作正常。我的問題解決了,但我很困惑。仍然不明白爲什麼我以前的代碼不起作用。 – Sas 2012-02-29 16:46:17

0

從你的錯誤描述中可以推斷出什麼,聽起來好像你沒有在.NET代碼中設置參數@CompanyID和@CustTypeID參數。

+0

即使我手動嘗試在瀏覽器上正確輸入值,我也能正確發送參數。 – Sas 2012-02-29 16:43:15

+0

向我們展示您的.NET代碼將幫助我們縮小您的問題範圍。 – 2012-02-29 16:50:53

+0

我貼的代碼請看 – Sas 2012-02-29 16:55:09

0

在你的GridView上,DataKeyNames應該是「CustId」,它是一個唯一的值。

相關問題