Home All Groups Group Topic Archive Search About

Strange error when querying FoxPro dbase

Author
31 Oct 2006 9:56 AM
Nadav Popplewell
Hi Everybody,

I've got a dotnet application (1.1) that works with a foxpro dbase (using
the oledb provider for FoxPro 8.0).

Most of the code works, But I've run across a strange problem:

When I run the following sql statement:

SELECT     fldscorpio.id AS POINT_ID, fu_id, fldunit.name as fu_name,
fldscorpio.name, fldscorpio.description,slavetype,  fldscorpio.dc_status
+IIF(fldscorpio.ac_fail,524288,000000)+fldscorpio.comm_fail*15 as status,
0 as channel,0 as slot, fldscorpio.address as address, fldscorpio.piu as
piu, 0 as base_type,
(fldscorpio.dc_status
+IIF(fldscorpio.ac_fail,256,000)+fldscorpio.comm_fail)>0 as FAULT
FROM         fldscorpio
  INNER JOIN fldunit ON fldunit.id=fldscorpio.fu_id
  LEFT OUTER JOIN userarea ON userarea.area=fldunit.area
WHERE (((? IS NULL) OR (slavetype=?))) AND  (((? IS NULL) OR (FAULT=?)))

UNION

SELECT fldpoint.POINT_ID as POINT_ID,  fldpoint.fu_id, fldunit.name as
fu_name, fldpoint.name, fldpoint.desc as description,0 as slavetype, 
fldpoint.status as status,
fldpoint.channel as channel,fldpoint.slot as slot, fldpoint.rack as address,
0 as piu,
fldpoint.base_type as base_type,
fldpoint.status >0 as FAULT
from fldpoint
  INNER JOIN fldunit ON fldpoint.fu_id=fldunit.id
  LEFT OUTER JOIN userarea ON userarea.area=fldunit.area
where (((? IS NULL) OR (slavetype=?))) AND  (((? IS NULL) OR (FAULT=?))) AND
fldpoint.slot >0 and not(exists(select id from fldscorpio where
fldpoint.slot=fldscorpio.id))

I get an error:
System.Data.OleDb.OleDbException: SQL: Column 'FAULT' is not found.

In the sql , in both statements I've got a calculated column called 'FAULT',
so why does it complain that it can't find column 'FAULT'?

Nadav

Author
31 Oct 2006 10:02 AM
Nadav Popplewell
I did some more testing.

It looks like I can't use columns defined with AS inside the where clause.
If I replace the column name with the expression the query works.

Nadav

Show quote
"Nadav Popplewell" wrote:

> Hi Everybody,
>
> I've got a dotnet application (1.1) that works with a foxpro dbase (using
> the oledb provider for FoxPro 8.0).
>
> Most of the code works, But I've run across a strange problem:
>
> When I run the following sql statement:
>
> SELECT     fldscorpio.id AS POINT_ID, fu_id, fldunit.name as fu_name,
> fldscorpio.name, fldscorpio.description,slavetype,  fldscorpio.dc_status
> +IIF(fldscorpio.ac_fail,524288,000000)+fldscorpio.comm_fail*15 as status,
> 0 as channel,0 as slot, fldscorpio.address as address, fldscorpio.piu as
> piu, 0 as base_type,
> (fldscorpio.dc_status
> +IIF(fldscorpio.ac_fail,256,000)+fldscorpio.comm_fail)>0 as FAULT
> FROM         fldscorpio
>   INNER JOIN fldunit ON fldunit.id=fldscorpio.fu_id
>   LEFT OUTER JOIN userarea ON userarea.area=fldunit.area
>  WHERE (((? IS NULL) OR (slavetype=?))) AND  (((? IS NULL) OR (FAULT=?)))
>
> UNION
>
> SELECT fldpoint.POINT_ID as POINT_ID,  fldpoint.fu_id, fldunit.name as
> fu_name, fldpoint.name, fldpoint.desc as description,0 as slavetype, 
> fldpoint.status as status,
> fldpoint.channel as channel,fldpoint.slot as slot, fldpoint.rack as address,
> 0 as piu,
> fldpoint.base_type as base_type,
> fldpoint.status >0 as FAULT
> from fldpoint
>   INNER JOIN fldunit ON fldpoint.fu_id=fldunit.id
>   LEFT OUTER JOIN userarea ON userarea.area=fldunit.area
> where (((? IS NULL) OR (slavetype=?))) AND  (((? IS NULL) OR (FAULT=?))) AND
>  fldpoint.slot >0 and not(exists(select id from fldscorpio where
> fldpoint.slot=fldscorpio.id))
>
> I get an error:
> System.Data.OleDb.OleDbException: SQL: Column 'FAULT' is not found.
>
> In the sql , in both statements I've got a calculated column called 'FAULT',
> so why does it complain that it can't find column 'FAULT'?
>
> Nadav
>
>
Author
1 Nov 2006 9:12 AM
WenYuan Wang
Hi Nadav,

First of all, I'd like to confirm my understanding of your issue.
According to your description, I understand that you get the error message
when using columns defined with AS inside the WHERE clause.
If I misunderstood anything here, please don't hesitate to correct me.

If the value contained in the column referenced by the column alias is the
result of a set function, it can not occur in the WHERE clause;
if we tried to do that, we will get the error message as below:
Invalid column name 'fault'.
For detailed information, you can refer to the following article According
to
http://publib.boulder.ibm.com/infocenter/rbhelp/v6r3/index.jsp?topic=/com.ib
m.redbrick.doc6.3/ssg/ssg32.htm.

I'm afraid that we can't use columns defined with AS inside the where
clause.
This is a restriction related to SQL Command.

For this reason, we suggest you can modify your select command as below:
SELECT fldscorpio.id AS POINT_ID, fu_id, fldunit.name as fu_name, 
fldscorpio.name, fldscorpio.description,slavetype, 
fldscorpio.dc_status+IIF(fldscorpio.ac_fail,524288,000000)+fldscorpio.comm_f
ail*15 as status,
0 as channel,0 as slot, fldscorpio.address as address, fldscorpio.piu as
piu, 0 as base_type,
(fldscorpio.dc_status+IIF(fldscorpio.ac_fail,256,000)+fldscorpio.comm_fail)>
0 as FAULT FROM fldscorpio
INNER JOIN fldunit ON fldunit.id=fldscorpio.fu_id
LEFT OUTER JOIN userarea ON userarea.area=fldunit.area
WHERE (((? IS NULL) OR (slavetype=?))) AND  (((? IS NULL) OR
(((fldscorpio.dc_status+IIF(fldscorpio.ac_fail,256,000)+fldscorpio.comm_fail
)>0)=?)))

If you have any question, please feel free to post here.

Wen Yuan
===============================
When responding to posts, please "Reply to Group" via your newsreader so
that others may learn and benefit from your issue.
===============================
(This posting is provided "AS IS", with no warranties, and confers no
rights.)
Author
1 Nov 2006 11:13 AM
Nadav Popplewell
Hi WenYuan,

Thanks for your reply.

I changed the select statement as you suggested and it works.

I knew I could solve this problem this way (i.e. copying the expression to
the where clause).
I just wanted to make sure that this behavior is 'as designed'.

Thanks

Nadav
Author
2 Nov 2006 3:12 AM
WenYuan Wang
Hi Nadav,

Yes, this is designed by SQL(Structured Query Language) Standard.
As you mentioned above, we should copy the expression to the where clause.

If there is anything unclear, please don't hesitate to post in the
newsgroup and we will follow up.

Sincerely,
Wen Yuan

AddThis Social Bookmark Button