запрос с использованием Union?

Обсуждение Stimulsoft Reports.NET
Ответить
BeraleX
Сообщения: 114
Зарегистрирован: 17 авг 2006, 09:39

запрос с использованием Union?

Сообщение BeraleX »

Есть такая строка запроса:

select sum(val) as val, day, hour from
(
(select sum(dt.val*jn.ktt*jn.ktn*ch.direction) as val, dt.stamp,
Extract(DAY from dt.stamp) as day, Extract(HOUR from CAST(dt.stamp as TIMESTAMP))+1 as hour
from joins jn, channels ch, vhh dt
where jn.joininc=32 and
ch.dcid = jn.dcid and
ch.objid = jn.objid and
ch.devid = jn.devid and
ch.joinid = jn.joinid and
dt.dcid = jn.dcid and
dt.objid = jn.objid and
dt.devid = jn.devid and
dt.joinid = jn.joinid and
dt.stamp between :ReportDate and :EndDate and
ch.ar = 1
group by dt.stamp
)
union
(select sum(dt.val*jn.ktt*jn.ktn) as val, dt.stamp,
Extract(DAY from dt.stamp) as day, Extract(HOUR from CAST(dt.stamp as TIMESTAMP))+1 as hour
from joins jn, channels ch, vhh dt
where jn.joininc=32 and
ch.dcid = jn.dcid and
ch.objid = jn.objid and
ch.devid = jn.devid and
ch.joinid = jn.joinid and
dt.dcid = jn.dcid and
dt.objid = jn.objid and
dt.devid = jn.devid and
dt.joinid = jn.joinid and
dt.stamp between :ReportDate and :EndDate and
ch.ar = 1
group by dt.stamp
)
)
group by day,hour
order by day,hour

Она достаточно сложная и к сожалению не работает. Выдает ошибку типа Can not Allocate memory. Опытным путем удалось выяснить, что причина в строке
dt.stamp between :ReportDate and :EndDate and. Если ставить условие больше какой либо даты, меньше какой-либо даты, все работает. Вместе больше-меньше не работает (типа dt.stamp > :ReportDate and dt.stamp < :EndDate) и between тоже.
Более того, на стороне сервера, в данном случае Oracle XE, все выполняется замечательно c директивой between.

Для анализа попробовал упрощенный запрос к таблице Table состоящей из 3 столбцов ID, Val - числовое значение и Stamp - дата:

select Sum(Val), Stamp from Table
where Stamp between :ReportDate and :EndDate
group by Stamp
UNION
select Sum(Val), Stamp from Table
where Stamp between :ReportDate and :EndDate
group by Stamp

В Oracle все выполнилось замечательно, а из отчета - та же ошибка.

Как то не так использую Union? Просто без него никак, т.к. нужно объединить несколько таблиц, сгруппированнных по сложному значению.
Спасибо.
Edward
Сообщения: 930
Зарегистрирован: 09 июн 2006, 12:23

запрос с использованием Union?

Сообщение Edward »

Попробуйте использовать неименованные параметры вместо именованных. Для этого замените все параметры на ? в тексте запроса. Пример работы с этими параметрами: http://www.stimulsoft.com/livedemos/Rep ... ers_2.html

Вы используете OleDb или Odbc для связи с Oracle?

Спасибо.
BeraleX
Сообщения: 114
Зарегистрирован: 17 авг 2006, 09:39

запрос с использованием Union?

Сообщение BeraleX »

Пробовал по всякому, не получается. Использую OleDB. Получилось с помощью приблизительно такой конструкции, но все равно мне кажется, что это неправильно. Прям не знаю. Использовал встроеную функцию Oracle TO_DATE
select sum(val) as val, day, hour from
(
select sum(22.2+0.0000000018*val*val) as val, day, hour from
(
select sum(dt.val) as val, dt.stamp-30/1440 as stamp,
Extract(DAY from dt.stamp-30/1440) as day,
Extract(HOUR from CAST(dt.stamp-30/1440 as TIMESTAMP))+1 as hour
from joins jn, channels ch, vhh dt
where (jn.joininc = 32) and
ch.dcid = jn.dcid and
ch.objid = jn.objid and
ch.devid = jn.devid and
ch.joinid = jn.joinid and
dt.dcid = jn.dcid and
dt.objid = jn.objid and
dt.devid = jn.devid and
dt.joinid = jn.joinid and
ch.ar = 1 and
val 0 and
dt.stamp > TO_DATE({StartDate},'DD.MM.YYYY') and
dt.stamp 0 and
dt.stamp > TO_DATE({StartDate},'DD.MM.YYYY') and
dt.stamp TO_DATE({StartDate},'DD.MM.YYYY') and
dt.stamp <=TO_DATE({EndDate},'DD.MM.YYYY')
group by stamp
)
group by day,hour
order by day, hour

Вот такой вот запросик, может есть идеи?
Edward
Сообщения: 930
Зарегистрирован: 09 июн 2006, 12:23

запрос с использованием Union?

Сообщение Edward »

В Вашем запросе нет именованных и не именованных параметров. Попробуйте заменить {StartDate}, {EndDate} на ? как не именованные параметры с типом данных Date.

Спасибо.
Vital
Сообщения: 647
Зарегистрирован: 09 июн 2006, 12:23

запрос с использованием Union?

Сообщение Vital »

Если в запросе работают выражения {}, то можно использовать и их (многие наши клиенты так делают).
Главное не запустаться с видом передаваемой даты. Здесь скорей всего проблема в использовании именованных
параметров. OLE DB не всегда корректно может их отрабатывать (зависит от версии OLE DB провайдера, типа
базы данных).

Также приведите пожалуйста полный стек ошибки "Can not Allocate memory".

Спасибо.
BeraleX
Сообщения: 114
Зарегистрирован: 17 авг 2006, 09:39

запрос с использованием Union?

Сообщение BeraleX »

Нет, вы немного не поняли меня. Я пробовал все возможности. И что такое именованные и неименованные параметры и как они используются, я знаю. Просто в данном случае я показал случай, который заработал, с передачей в запрос значений переменных строкового типа (с параметрами именованными и нет, выдает ошибку).

Вот пример

select sum(val), stamp from vhh
where joinid = 0 and
stamp between ? and ?
group by stamp
union
select sum(val), stamp from vhh
where joinid = 1 and
stamp between ? and ?
group by stamp

Таблицу смотрите выше в посте.
Параметры в источнике данных - StartDate, EndDatenb. их значение - DateTime.Now.Date и DateTime.Now.AddMonths(1).Date

Стек ошибки

See the end of this message for details on invoking
just-in-time (JIT) debugging instead of this dialog box.

************** Exception Text **************
System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
at System.Data.Common.UnsafeNativeMethods.ICommandText.Execute(IntPtr pUnkOuter, Guid& riid, tagDBPARAMS pDBParams, IntPtr& pcRowsAffected, Object& ppRowset)
at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult)
at System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult)
at System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult)
at System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)
at System.Data.OleDb.OleDbCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.OleDb.OleDbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataTable[] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataTable dataTable)
at Stimulsoft.Report.Dictionary.StiOleDbSource.UpdateParameters()
at Stimulsoft.Report.Dictionary.StiOleDbAdapterService.ConnectDataSourceToData(StiDictionary dictionary, StiDataSource dataSource, Boolean loadData)
at Stimulsoft.Report.Dictionary.StiDataSource.Connect(StiDataCollection datas, Boolean loadData)
at Stimulsoft.Report.Dictionary.StiDataSource.Connect()
at Reports.Report.btnOK_Click(Object sender, EventArgs e)
at Stimulsoft.Report.Components.StiComponent.InvokeClick(Object sender, EventArgs e)
at Stimulsoft.Report.Render.StiFormsProvider.OnClick(Object sender, EventArgs e)
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnClick(EventArgs e)
at Stimulsoft.Controls.StiButton.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
at Stimulsoft.Controls.StiButton.OnMouseUp(MouseEventArgs e)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ButtonBase.WndProc(Message& m)
at System.Windows.Forms.Button.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


************** Loaded Assemblies **************
mscorlib
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.42 (RTM.050727-4200)
CodeBase: file:///c:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/mscorlib.dll
----------------------------------------
ReportsWrapper
Assembly Version: 1.0.2523.27595
Win32 Version:
CodeBase: file:///D:/Work/ktsCollection/release/ReportsWrapper.DLL
----------------------------------------
msvcm80
Assembly Version: 8.0.50608.0
Win32 Version: 8.00.50727.42
CodeBase: file:///C:/WINDOWS/WinSxS/x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0de06acd/msvcm80.dll
----------------------------------------
ktsReports
Assembly Version: 1.0.0.0
Win32 Version: 1.0.0.0
CodeBase: file:///D:/Work/ktsCollection/release/ktsReports.DLL
----------------------------------------
ktsClasses_pc
Assembly Version: 1.0.0.0
Win32 Version: 1.0.0.0
CodeBase: file:///D:/Work/ktsCollection/release/ktsClasses_pc.DLL
----------------------------------------
System.Windows.Forms
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.42 (RTM.050727-4200)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Windows.Forms/2.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
----------------------------------------
System
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.42 (RTM.050727-4200)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System/2.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
System.Drawing
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.42 (RTM.050727-4200)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Drawing/2.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
System.Data
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.42 (RTM.050727-4200)
CodeBase: file:///C:/WINDOWS/assembly/GAC_32/System.Data/2.0.0.0__b77a5c561934e089/System.Data.dll
----------------------------------------
Stimulsoft.Report
Assembly Version: 2007.1.0.0
Win32 Version: 2007.1.0.0
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/Stimulsoft.Report/2007.1.0.0__ebe6666cba19647a/Stimulsoft.Report.dll
----------------------------------------
Stimulsoft.Base
Assembly Version: 2007.1.0.0
Win32 Version: 2007.1.0.0
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/Stimulsoft.Base/2007.1.0.0__ebe6666cba19647a/Stimulsoft.Base.dll
----------------------------------------
System.Web
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.42 (RTM.050727-4200)
CodeBase: file:///C:/WINDOWS/assembly/GAC_32/System.Web/2.0.0.0__b03f5f7f11d50a3a/System.Web.dll
----------------------------------------
System.Xml
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.42 (RTM.050727-4200)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Xml/2.0.0.0__b77a5c561934e089/System.Xml.dll
----------------------------------------
System.Configuration
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.42 (RTM.050727-4200)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Configuration/2.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll
----------------------------------------
Stimulsoft.Controls
Assembly Version: 2006.4.0.0
Win32 Version: 2006.4.0.0
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/Stimulsoft.Controls/2006.4.0.0__ebe6666cba19647a/Stimulsoft.Controls.dll
----------------------------------------
System.Design
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.42 (RTM.050727-4200)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Design/2.0.0.0__b03f5f7f11d50a3a/System.Design.dll
----------------------------------------
System.Transactions
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.42 (RTM.050727-4200)
CodeBase: file:///C:/WINDOWS/assembly/GAC_32/System.Transactions/2.0.0.0__b77a5c561934e089/System.Transactions.dll
----------------------------------------
System.EnterpriseServices
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.42 (RTM.050727-4200)
CodeBase: file:///C:/WINDOWS/assembly/GAC_32/System.EnterpriseServices/2.0.0.0__b03f5f7f11d50a3a/System.EnterpriseServices.dll
----------------------------------------
Stimulsoft.Editor
Assembly Version: 2006.4.0.0
Win32 Version: 2006.4.0.0
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/Stimulsoft.Editor/2006.4.0.0__ebe6666cba19647a/Stimulsoft.Editor.dll
----------------------------------------
Accessibility
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.42 (RTM.050727-4200)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/Accessibility/2.0.0.0__b03f5f7f11d50a3a/Accessibility.dll
----------------------------------------
System.Security
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.42 (RTM.050727-4200)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Security/2.0.0.0__b03f5f7f11d50a3a/System.Security.dll
----------------------------------------
-jqywdib
Assembly Version: 0.0.0.0
Win32 Version: 2.0.50727.42 (RTM.050727-4200)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System/2.0.0.0__b77a5c561934e089/System.dll
----------------------------------------

************** JIT Debugging **************
To enable just-in-time (JIT) debugging, the .config file for this
application or computer (machine.config) must have the
jitDebugging value set in the system.windows.forms section.
The application must also be compiled with debugging
enabled.

For example:





When JIT debugging is enabled, any unhandled exception
will be sent to the JIT debugger registered on the computer
rather than be handled by this dialog box.

Если убрать between и поставить одно условие (> или <) все работает, с двумя - та же петрушка с ошибкой, странно как то выглядит.
В принципе, сильно не заморачиваюсь, ведь работающее решение все равно найдено, но все таки between было бы лучше ... эстетичнее что ли. Да и ошибка чуть чуть нервирует, тем более что на стороне сервера все работает отлично. Правда возможно, что это особенность драйвера OleDB, и все таки. Чуть чуть жалко потраченного времени на перебор возможных решений (только не расценивайте это как упрек, компонент действительно отличный у Вас получается, да и все, думаю, понимают, что проверить все существующие на сегодняшний день варианты просто нереально, а появляющиеся время от времени проблемы решаются хорошей поддержкой - как у Вас!) , очень привык использовать в запросах параметры, очень удобно для меня. :biggrin:

Vital
Сообщения: 647
Зарегистрирован: 09 июн 2006, 12:23

запрос с использованием Union?

Сообщение Vital »

Весьма странная ошибка.

System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

Таких ошибок было много во времена Net2 beta 1 и beta 2 причем в самых простейших случаях (к примеру часто при работе с ImageList).
К выходу финального релиза Net 2 подчистили, но судя по всему бывают случаи.

Спасибо.
Ответить