2013-12-12 46 views
1

我有一個存儲過程。數據集數據與存儲過程不同

SELECT ADDRESS.ADDRESSID, NAME, DOORNO, STREET, STATE, COUNT(SUB.ADDRESSID) AS FREQUENCY 
FROM ADDRESS 
JOIN 
(
(SELECT ADDRESSID FROM ADDRESS WHERE KEYWORD LIKE '%' + @name + '%') 
UNION ALL 
(SELECT ADDRESSID FROM ADDRESS WHERE KEYWORD LIKE '%' + @doorno + '%') 
UNION ALL 
(SELECT ADDRESSID FROM ADDRESS WHERE KEYWORD LIKE '%' + @street + '%') 
UNION ALL 
(SELECT ADDRESSID FROM ADDRESS WHERE KEYWORD LIKE '%' + @state + '%') 
) 
SUB 
ON SUB.ADDRESSID=ADDRESS.ADDRESSID 
GROUP BY ADDRESS.ADDRESSID, NAME, DOORNO, STREET, STATE 
ORDER BY FREQUENCY DESC 

當我手動執行此操作時,我得到正確的結果。 可以說這些都是結果

╔════╦══════╦════════════════╦═════════════════════╦═══════╦═══════════╗ 
║ ID ║ NAME ║  DOORNO  ║  STREET  ║ STATE ║ FREQUENCY ║ 
╠════╬══════╬════════════════╬═════════════════════╬═══════╬═══════════╣ 
║ 4 ║ John ║ 29    ║ Police Station  ║ DC ║   3 ║ 
║ 1 ║ John ║ Door 13-9-16/A ║ patimeeda   ║ NJ ║   2 ║ 
║ 3 ║ Paul ║ Plot 304  ║ Near Police Station ║ NJ ║   1 ║ 
╚════╩══════╩════════════════╩═════════════════════╩═══════╩═══════════╝ 

但是,當我打電話使用的SqlDataAdapter從C#代碼這個SP和數據集,我總是得到頻率1 像下面。

╔════╦══════╦════════════════╦═════════════════════╦═══════╦═══════════╗ 
║ ID ║ NAME ║  DOORNO  ║  STREET  ║ STATE ║ FREQUENCY ║ 
╠════╬══════╬════════════════╬═════════════════════╬═══════╬═══════════╣ 
║ 1 ║ John ║ Door 13-9-16/A ║ patimeeda   ║ NJ ║   1 ║ 
║ 3 ║ Paul ║ Plot 304  ║ Near Police Station ║ NJ ║   1 ║ 
║ 4 ║ John ║ 29    ║ Police Station  ║ DC ║   1 ║ 
╚════╩══════╩════════════════╩═════════════════════╩═══════╩═══════════╝ 

排序對我來說非常重要。任何想法,爲什麼我失去了這一點?

C#.NET代碼

SqlCommand cmd = new SqlCommand("Add_GetAddressSearchResults", con); 
     cmd.CommandType=CommandType.StoredProcedure; 
     cmd.Parameters.Add("@name", SqlDbType.VarChar, 50).Value=addressModel.Name; 
     cmd.Parameters.Add("@doorno", SqlDbType.VarChar, 50).Value=addressModel.DoorNo; 
     cmd.Parameters.Add("@street", SqlDbType.VarChar, 50).Value=addressModel.Street; 
     cmd.Parameters.Add("@state", SqlDbType.VarChar, 50).Value=addressModel.State; 

     SqlDataAdapter da = new SqlDataAdapter(cmd); 
     DataSet ds= new DataSet(); 
     da.Fill(ds); 
     ds.WriteXml("c:/ram.xls"); // to check the data 
+0

你可以在你調用過程的地方添加代碼嗎? –

+0

您確定sqldataadapter正在與同一個服務器,同一個命名實例,同一個數據庫,調用相同的sp,並且特​​別是sp的相同**版本**?一個常見的錯誤是在SQL工具(SSMS)中運行'rams.my_proc',但通過sql-data-adapter或類似工具運行'dbo.myproc'。 –

+0

@MarcGravell我只有一個服務器和數據庫,我相信我正在執行正確的過程。我有同樣的疑問,我試着將FREQUENCY列的名稱更改爲FREQUENCI,並進行了測試以符合我正在與同一個DB進行交談。這很奇怪..! – Robert

回答

0

如果你已經消除了其他顯而易見的原因(不同的數據庫,不同的查詢,...),我強烈懷疑你有在ADDRESSID列NULL值,以及ANSI_NULLS配置不同。

我相信C#連接的默認值與SQL Server Management Studio中的默認值不同。

要測試這一點,可以嘗試手動執行查詢時開啓和關閉ANSI_NULLS,和/或嘗試修改查詢以顯式處理您希望的NULL值。例如:

ON ISNULL(SUB.ADDRESSID,0)=ISNULL(ADDRESS.ADDRESSID,0) 

您也可以嘗試在存儲過程中明確地設置此設置(以及其他類似的設置,如ANSI_PADDING)。

0

我可能是錯的,但SUB你是從子查詢中提取再次含有記錄ADDRESSADDRESSID內部連接很可能會給頻率爲1,除非SUB包含比你在ADDRESS更重要的是,你的正確的結果,肯定是因爲通過參數給你的超集ADDRESSSUB