Windows Mobile: внутренний запрос на соединение не работает - PullRequest
0 голосов
/ 18 октября 2011

Я уже развиваюсь из более ранних приложений для 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 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();
        }
    }

что я должен сделать, чтобы исправить эту ошибку ?? спасибо

1 Ответ

0 голосов
/ 18 октября 2011

Ошибка, скорее всего, связана с неподдерживаемым запросом. Проверьте это, разбив его на части и запустив их по отдельности - это можно сделать прямо в Studio с базой данных на рабочем столе с помощью обозревателя сервера. Я не знаю, поддерживается ли count (*) (IIRC не было в более ранних версиях, хотя вполне может быть в 3.5). Я не уверен, поддерживается ли псевдоним. Я вполне уверен, что использование результатов запроса в качестве входных данных не так.

Ошибка в стороне, это сложный запрос - слишком сложный. Объединение результатов двух других объединений (которые также сгруппированы) немедленно бросает красный флажок для производительности и использования памяти во встроенной системе на мой взгляд.

Если бы я увидел это в обзоре кода клиентского кода, я бы настоятельно рекомендовал денормализовать таблицы, чтобы сократить всю эту работу (вы не находитесь на четырехъядерном сервере с гигабайтами оперативной памяти). Возможно, попытка сохранить данные таким образом, чтобы они были ближе к тому, что вы хотите, так как вывод также был бы хорошим шагом. Я также рекомендовал бы попытаться разбить его на более мелкие единицы работы, которые можно выполнить при меньшем взаимодействии с обработчиком запросов (я фанат того, что вообще не использую анализатор запросов).

Если бы я видел это при просмотре кода кем-то, кто работал на меня, я бы дал им пощечину, поскольку это прямое нарушение "будь проще", что вы должны делать в среде с ограниченными ресурсами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...