2011-10-18 78 views
0

我已經從早期的Windows移動應用開發。 我有表:Windows Mobile:內部連接查詢不起作用

assetNo nvarchar(20) 
roomno nvarchan(8) 
status ncarchar(4) 

Asset no  RoomNo  Status 
001   DPN   0   
002   TRG   4   
003   SHW   1   
004   ROOM   1   
005   DPN   1 
. 
. 

我想狀態和分離狀態0和所有的紀錄,小組收集由roomno

輸出將是這樣的:

RoomNo Status0 sllstatus 
DPN  1   2 
TRG  0   1 
SHW  0   1 
ROM  1   1 

我有查詢像這樣:

SELECT a.RoomNo , a.Scanmanual AS ScanManual, b.allscan AS AllScan 
FROM 
    (SELECT roomno, count(*) AS scanmanual 
    FROM assets 
    WHERE status = 0 
    GROUP BY roomno) AS a 
INNER JOIN 
    (SELECT roomno, count(*) AS allscan 
    FROM assets 
    GROUP BY roomno) AS b ON (a.roomno=b.roomno) 

這個查詢在sql中運行得很好ER緊湊版,但是當我在Visual Studio 2005中運行具有錯誤 「有一個錯誤解析查詢,[令牌行號= 1,Toker OFSET = 78,在誤差=選擇]」

private void Summary_Load(object sender, EventArgs e) 
    { 
     Cursor.Current = Cursors.WaitCursor; 
     string sql ="SELECT a.RoomNo , a.Scanmanual AS ScanManual, b.allscan AS  AllScan from (select roomno, count(*) AS scanmanual from assets WHERE status = 0 group by roomno) AS a inner join (select roomno, count(*) AS allscan FROM assets group by roomno) as b on(a.roomno=b.roomno)" 


     SqlCeDataAdapter da = new SqlCeDataAdapter(); 
     try 
     { 
      DataSet ds = new DataSet(); 
      da.SelectCommand = new SqlCeCommand(sql, dbConn); 
      da.Fill(ds, "Assets"); 

      dataGrid.DataSource = ds.Tables["Assets"]; 
     } 
     catch (SqlCeException ex) 
     { 
      MessageBox.Show(ex.Message, 
       "DB Operation SDF", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, 
       MessageBoxDefaultButton.Button1); 
     } 
     finally 
     { 
      Cursor.Current = Cursors.Default; 
      da.SelectCommand.Dispose(); 
      da.Dispose(); 
     } 
    } 

我應該怎麼做才能解決這個錯誤?謝謝

+0

SQL查詢中的'status'是SQL關鍵字還是SQL表格字段?也許Visual Studio也不知道。 – jp2code

回答

0

該錯誤可能會導致不支持的查詢。通過將其分解爲子部分並單獨運行它們來進行檢查 - 這可以在Studio中使用Server Explorer在桌面上針對桌面上的數據庫完成。我不知道count(*)是否被支持(IIRC它不在早期版本中,儘管它可能在3.5)。我不確定是否支持別名。我相當確定使用查詢結果作爲輸入不是。

拋開錯誤,這是一個複雜的查詢 - 太複雜。加入其他兩個連接(也被分組)的結果會在我眼中嵌入式系統中引發性能和內存使用的立即紅旗。

如果我在客戶代碼的代碼審查中看到了這一點,我強烈建議將表格非規格化以減少所有這些工作(您不是在具有千兆字節RAM的四核服務器計算機上) 。也許試圖以更接近你想要的輸出方式存儲數據也是一個好的步驟。我也建議嘗試把它分解成更小的工作單元,這可以通過更少的查詢處理器交互來完成(我是根本不使用查詢分析器的粉絲)。

如果我在爲我工作的人審閱代碼時看到這一點,我會打他們,因爲這是直接違反「保持簡單」,這是您在資源有限的環境中必須執行的操作。

+0

SQLCE 3.5中支持COUNT(*)語句 按照建議將語句分解。您可以通過LINQ在運行時分組和加入。 –

+0

ctacke: 感謝btw ctacke,這個項目的目的是顯示這樣的輸出。你爲了簡單而做另一種方式。 mybe使用其他解決方案來踢這個目標? – indi60