我已经从早期的Windows移动应用开发了。 我有桌子:
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 server compact edition中运行良好,但是当我在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 :(得分:0)
错误很可能是由于查询不受支持。通过将其分解为子部件并单独运行来检查它 - 这可以在Studio中使用服务器资源管理器对照桌面上的数据库。我不知道是否支持count(*)(IIRC它不是在早期版本中,尽管它可能在3.5中)。我不确定是否支持别名。我非常确定使用查询结果作为输入不是。
除了错误,这是一个复杂的查询 - 太复杂了。加入另外两个连接的结果(也是分组的)会在我眼中的嵌入式系统上引发性能和内存使用的直接红色标记。
如果我在对客户代码的代码审查中看到这一点,我强烈建议对表进行非规范化以减少所有这些工作(您不在具有千兆字节RAM的四核服务器计算机上)。也许尝试以更接近你想要的方式存储数据作为输出也是一个很好的步骤。我还建议尝试将其分解为较小的工作单元,这可以通过较少的查询处理器交互来完成(我是不使用查询解析器的粉丝)。
如果我在为有人工作的人审查代码的过程中看到这一点,我会打电话给他们,因为它直接违反了“保持简单”,这是你在资源有限的环境中必须做的事情。