Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Интересная вещь в ADO [D7]


Страницы:   1 2

Patrick1968 ©   (2011-07-26 16:27:00) 

Не пойму в чем причина, написал запрос
select count(*)  from mytable where article='100' and propid='40'
при открытии ADOQuery, выходит сообщение, что "групповая функция не является одногруппной", хотя в SQL Plus'e всё проходит на "ура". Что-то непонятно? Может кто сталкивался?


Игорь Шевченко   (2011-07-26 21:42:00) [1]


> У нас изначально какой вопрос был?


У автора параметров изначально не было вообще. Ву компрене ?


>  Как автор такого добился.


автору давно пофиг, на вопрос в [5] ответа нет и не будет.

Но, включив телепатор, могу предположить, что у автора кривой/не тот провайдер, кривое ADO или кривое то, что у программистов обычно из задницы растет.

Более того, изменив пример на ADOQuery (вдруг местные последователи ислама правы в своих нападках на TADOQuery? )
я получил точно такой же результат, как с ADODataSet

object Form1: TForm1
 Left = 0
 Top = 0
 Caption = 'Form1'
 ClientHeight = 293
 ClientWidth = 426
 Color = clBtnFace
 Font.Charset = DEFAULT_CHARSET
 Font.Color = clWindowText
 Font.Height = -11
 Font.Name = 'Tahoma'
 Font.Style = []
 OldCreateOrder = False
 PixelsPerInch = 96
 TextHeight = 13
 object Button1: TButton
   Left = 340
   Top = 224
   Width = 75
   Height = 25
   Caption = 'Button1'
   TabOrder = 0
   OnClick = Button1Click
 end
 object Button2: TButton
   Left = 340
   Top = 260
   Width = 75
   Height = 25
   Caption = 'Button2'
   TabOrder = 1
   OnClick = Button2Click
 end
 object db: TADOConnection
   ConnectionString =
     'Provider=OraOLEDB.Oracle.1;Password=bar;Persist Security I' +
     'nfo=True;User ID=foo;Data Source=sles10'
   Provider = 'OraOLEDB.Oracle.1'
   Left = 32
   Top = 24
 end
 object ds: TADODataSet
   Connection = db
   CommandText = 'SELECT COUNT(*) FROM arg_city WHERE country_code = :CC'
   Parameters = <
     item
       Name = 'CC'
       DataType = ftString
       Size = -1
       Value = Null
     end>
   Left = 128
   Top = 24
 end
 object q: TADOQuery
   Connection = db
   Parameters = <>
   SQL.Strings = (
     'SELECT COUNT(*) FROM arg_city WHERE country_code = '#39'RU'#39)
   Left = 204
   Top = 24
 end
end


unit main;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, DB, ADODB, StdCtrls;

type
 TForm1 = class(TForm)
   db: TADOConnection;
   ds: TADODataSet;
   Button1: TButton;
   q: TADOQuery;
   Button2: TButton;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 db.Connected := true;
 ds.Parameters.ParamByName('CC').Value := 'RU';
 ds.Open;
 try
   ShowMessageFmt('count = %s', [ds.Fields[0].AsString]);
 finally
   ds.Close;
 end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 db.Connected := true;
 q.Open;
 try
   ShowMessageFmt('count = %s', [q.Fields[0].AsString]);
 finally
   q.Close;
 end;
end;

end.


число записей одинаковое.


SQLEXPRESS   (2011-07-26 20:59:00) [2]

теперь ты их в дизайне определил, а глючит, когда не до определишь в рантайме
да и не глючит, а аккуратнее надо быть просто.
У нас изначально какой вопрос был? Как автор такого добился. Я нашел как - именно если параметры в where не до определены.


Игорь Шевченко   (2011-07-26 20:54:00) [3]


> а глючит, когда они есть


object Form1: TForm1
 Left = 0
 Top = 0
 Caption = 'Form1'
 ClientHeight = 293
 ClientWidth = 426
 Color = clBtnFace
 Font.Charset = DEFAULT_CHARSET
 Font.Color = clWindowText
 Font.Height = -11
 Font.Name = 'Tahoma'
 Font.Style = []
 OldCreateOrder = False
 PixelsPerInch = 96
 TextHeight = 13
 object Button1: TButton
   Left = 332
   Top = 252
   Width = 75
   Height = 25
   Caption = 'Button1'
   TabOrder = 0
   OnClick = Button1Click
 end
 object db: TADOConnection
   Connected = True
   ConnectionString =
     'Provider=OraOLEDB.Oracle.1;Password=bar;Persist Security I' +
     'nfo=True;User ID=foo;Data Source=sles10'
   Provider = 'OraOLEDB.Oracle.1'
   Left = 32
   Top = 24
 end
 object ds: TADODataSet
   Connection = db
   CommandText = 'SELECT COUNT(*) FROM arg_city WHERE country_code = :CC'
   Parameters = <
     item
       Name = 'CC'
       DataType = ftString
       Size = -1
       Value = Null
     end>
   Left = 128
   Top = 24
 end
end


procedure TForm1.Button1Click(Sender: TObject);
begin
 db.Connected := true;
 ds.Parameters.ParamByName('CC').Value := 'RU';
 ds.Open;
 try
   ShowMessageFmt('count = %s', [ds.Fields[0].AsString]);
 finally
   ds.Close;
 end;
end;


И с параметрами не глючит. Это у тебя ADO кривое (или еще что)


SQLEXPRESS   (2011-07-26 19:05:00) [4]


> Parameters = <>

а глючит, когда они есть


Игорь Шевченко   (2011-07-26 18:35:00) [5]

У вас ADO кривое (или что-то еще)

object Form1: TForm1
 Left = 0
 Top = 0
 Caption = 'Form1'
 ClientHeight = 293
 ClientWidth = 426
 Color = clBtnFace
 Font.Charset = DEFAULT_CHARSET
 Font.Color = clWindowText
 Font.Height = -11
 Font.Name = 'Tahoma'
 Font.Style = []
 OldCreateOrder = False
 PixelsPerInch = 96
 TextHeight = 13
 object Button1: TButton
   Left = 332
   Top = 252
   Width = 75
   Height = 25
   Caption = 'Button1'
   TabOrder = 0
   OnClick = Button1Click
 end
 object db: TADOConnection
   ConnectionString =
     'Provider=OraOLEDB.Oracle.1;Password=bar;Persist Security I' +
     'nfo=True;User ID=foo;Data Source=sles10'
   Provider = 'OraOLEDB.Oracle.1'
   Left = 32
   Top = 24
 end
 object ds: TADODataSet
   Connection = db
   CommandText = 'SELECT COUNT(*) FROM arg_city WHERE country_code = '#39'RU'#39
   Parameters = <>
   Left = 128
   Top = 24
 end
end


procedure TForm1.Button1Click(Sender: TObject);
begin
 db.Connected := true;
 ds.Open;
 try
   ShowMessageFmt('count = %s', [ds.Fields[0].AsString]);
 finally
   ds.Close;
 end;
end;


результат вполне адекватен


SQLEXPRESS   (2011-07-26 18:03:00) [6]

да, не работает, так и пишет
не сингл группа функция, к Ораклу

select count(*) from debtor
where REG_ID = :RI

с параметрами надо играть.
Cheked, Prepare, PARse
у меня заработало, короче

А к MSSQL это не обязательно, и так работает :)


SQLEXPRESS   (2011-07-26 17:41:00) [7]

Ну а парсишь их?
Query.Parameters.ParseSQL ?


Игорь Шевченко   (2011-07-26 17:40:00) [8]


> Это как-так в оракле нет count?


ну вот нет


Patrick1968   (2011-07-26 17:35:00) [9]

Это как-так в оракле нет count?


MsGuns   (2011-07-26 17:34:00) [10]

А так ?
select count(A.*) from
 (select article,propid from mytable where article='100' and propid='40') A


MsGuns   (2011-07-26 17:32:00) [11]

Вот тольуо адо тут совершенно сбоку


Patrick1968   (2011-07-26 17:32:00) [12]

Все параметры по дефолту


MsGuns   (2011-07-26 17:32:00) [13]

Есть подозрение что в этой СУБД (клиенте ?) нет такой функции 'count' или не допускается выражение 'count(*)'


SQLEXPRESS   (2011-07-26 17:27:00) [14]

параметры есть? parse их?


Patrick1968   (2011-07-26 17:08:00) [15]

может свойства query какие-то на это влияют?


Patrick1968   (2011-07-26 17:03:00) [16]

про это и речь, поэтому и интересные вещиа какие подробности?


SQLEXPRESS   (2011-07-26 17:03:00) [17]


> Кстати а что за субд?

+1

такие простые агрегатные штуки должны работать

в oracle, работает
select
count(*)
from t_users U
where U.NAME like 'МЕЛ%' and U.STREET_ID = 0

в MSSQL, работает
SELECT count(*)
 FROM [InterStart].[dbo].[vCTVConstSVCDeactivate]
where [INFO] = 'NotActive' and ID_SVC = 55

в Access, работает
SELECT
count(*)
FROM Answert
where Answert.[IdQuest] = 10 and Answert.[Value] = 0


Игорь Шевченко   (2011-07-26 17:01:00) [18]


> при открытии ADOQuery, выходит сообщение, что "групповая
> функция не является одногруппной",


так прямо и выходит ?

подробности для вопроизведения будут ?


>  хотя в SQL Plus'e всё проходит на "ура".


везде должно проходить на ура


Patrick1968   (2011-07-26 16:50:00) [19]

А в этом случае ошибка, что выражение не является выражением GROUP BY


Patrick1968   (2011-07-26 16:45:00) [20]

Понял,спасибо


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо