无效列名 |
答題得分者是:change.jian
|
zzmbeyond01
中階會員 發表:98 回覆:167 積分:53 註冊:2003-09-07 發送簡訊給我 |
各位大大好:
我在Oracle执行查询:
select gnfqname as 分区名称, fdmj as 功能分区内分栋的建筑面积, lhmj as 绿化面积 from gnfq t WHERE 分区名称='生活娱乐区'
发生无效列名的错误。 select gnfqname as 分区名称, fdmj as 功能分区内分栋的建筑面积, lhmj as 绿化面积 from gnfq t WHERE gnfqname='生活娱乐区'
可以 我现在是在我的程序中依据选择的字段,要构造sql查询语句。请问应该怎么解决呢? 谢谢!
|
luowy651
高階會員 發表:257 回覆:313 積分:114 註冊:2003-04-09 發送簡訊給我 |
|
zzmbeyond01
中階會員 發表:98 回覆:167 積分:53 註冊:2003-09-07 發送簡訊給我 |
procedure TSearchInfoFrm.TableListBoxClick(Sender: TObject); begin //选择指定的表,往Fieldlistbox添加该表中的字段 if TableListbox.ItemIndex <> -1 then begin strTable := TableListbox.Items.Strings[TableListbox.itemindex]; //设置表名称 with DBInfoDM.FieldDataSet do begin close; CommandText := ''; //获得指定表的Sql statements CommandText := FieldQry(strTable); open; //**************************************** //应为这里选择出来的字段都已经改为了中文 //比如fdmj ——〉 功能分区内分栋的建筑面积 GetFieldNames(FieldListBox.Items); //********************************* close; end; end; end; //但是在获得需要查询的字段,也是中文 // strField := FieldListbox.Items.Strings[FieldListbox.ItemIndex];请问各位大大,构造sql 的where子句,字段怎么设置才有效? |
change.jian
版主 發表:29 回覆:620 積分:439 註冊:2003-06-02 發送簡訊給我 |
SQL指令where裡的欄位名稱並不會因為你在Select裡用了 as 就可以換名稱.如果你要在程序中依據選擇的欄位中文名稱組合成對應的sql,只能另外寫程序去對照.
const FieldMap = '分區名稱=gnfqname,功能分區內分棟的建築面積=fdmj'; //欄位與中文名稱對照表 var ssFieldMap,ssSQL:TStringList; sCon,sValue,sFn:String; iIndex:Integer; begin ssFieldMap:=TStringList.Create; try ssSQL:=TStringList.Create; try ssSQL.Add('select t.gnfqname as 分區名稱, '); ssSQL.Add(' t.fdmj as 功能分區內分棟的建築面積, '); ssSQL.Add(' t.lhmj as 綠化面積 '); ssSQL.Add(' from gnfq t '); sCon:=ComboBox1.Text; //ComboBox1裡是user輸入的欄位名稱 sValue:=Edit1.Text; //Edit1裡是user要查詢的值 iIndex:=ssFieldMap.IndexOfName(sCon); if iIndex>-1 then ssSQL.Add(' WHERE t.' ssFieldMap.Value[sCon] '='''' sValue ''''); //組合出sql指令,這是你要的嗎? ... finally ssSQL.Free; end; finally ssFieldMap.Free; end; end; |
zzmbeyond01
中階會員 發表:98 回覆:167 積分:53 註冊:2003-09-07 發送簡訊給我 |
change.jian:
//获得表名称: with ADOConnectionDM.DBDM.ADOConnection1 do begin Open; GetTablenames(TableListbox.Items, false); //单击表明,获得其字段名称 strTable := TableListbox.Items.Strings[TableListbox.itemindex]; with DBInfoDM.FieldDataSet do begin close; CommandText := ''; //获得指定表的Sql statements CommandText := FieldQry(strTable); open; GetFieldNames(FieldListBox.Items); close; end; //获得需要查询的字段 strField := FieldListbox.Items.Strings[FieldListbox.ItemIndex];我showmessage(strField)显示出来为中文阿;而且在Fieldlistbox中字段也只显示中文啊? |
zzmbeyond01
中階會員 發表:98 回覆:167 積分:53 註冊:2003-09-07 發送簡訊給我 |
|
change.jian
版主 發表:29 回覆:620 積分:439 註冊:2003-06-02 發送簡訊給我 |
引言: change.jian:1.照你這樣說來,Oracle是可以把欄位直接設成中文名稱囉,但我記得是不行才是.你的Oracle是那個版本,新功能嗎? 2.你的程式碼中的FieldQry是什麼function?你自己寫的嗎?//获得表名称: with ADOConnectionDM.DBDM.ADOConnection1 do begin Open; GetTablenames(TableListbox.Items, false); //单击表明,获得其字段名称 strTable := TableListbox.Items.Strings[TableListbox.itemindex]; with DBInfoDM.FieldDataSet do begin close; CommandText := ''; //获得指定表的Sql statements CommandText := FieldQry(strTable); open; GetFieldNames(FieldListBox.Items); close; end; //获得需要查询的字段 strField := FieldListbox.Items.Strings[FieldListbox.ItemIndex];我showmessage(strField)显示出来为中文阿;而且在Fieldlistbox中字段也只显示中文啊? |
zzmbeyond01
中階會員 發表:98 回覆:167 積分:53 註冊:2003-09-07 發送簡訊給我 |
不会吧,我用的 class="code">
function TSearchInfoFrm.FieldQry(Tablename: string): string;
var
qrystr: string;
begin
if Tablename = 'GNFQ ' then
begin
qrystr := ' select ' yffdmj as 分栋的建筑面积, lhmj as 功能分区内绿化面积 from gnfqlayer t ';
end
//其他非空间 表
else
qrystr := 'SELECT * FROM ' Tablename;
strQry := qrystr;
result := qrystr;
end; 请问,我如和获得字段的名称呢?表的(as 成汉字的)字段名称显示在listbox中,我能用itemindex属性对应回表的英文字段名称吗?
|
zzmbeyond01
中階會員 發表:98 回覆:167 積分:53 註冊:2003-09-07 發送簡訊給我 |
大大:
我
procedure TForm1.Button1Click(Sender: TObject); const FieldMap = '分區名稱=gnfqname,功能分區內分棟的建築面積=fdmj'; //欄位與中文名稱對照表 var ssFieldMap,ssSQL:TStringList; sCon,sValue,sFn:String; iIndex:Integer; begin ssFieldMap:=TStringList.Create; ssFieldMap.Add(FieldMap); try ssSQL:=TStringList.Create; try ssSQL.Add('select t.gnfqname as 分區名稱, '); ssSQL.Add(' t.fdmj as 功能分區內分棟的建築面積, '); ssSQL.Add(' t.lhmj as 綠化面積 '); ssSQL.Add(' from gnfqlayer t '); sCon:=ComboBox1.Text; //ComboBox1裡是user輸入的欄位名稱 sValue:=Edit1.Text; //Edit1裡是user要查詢的值 iIndex:=ssFieldMap.IndexOfName(sCon); if iIndex>-1 then ssSQL.Add(' WHERE t.' ssFieldMap.Values[sCon] ' = ''' sValue ''''); //組合出sql指令,這是你要的嗎? adodataset1.Close; adodataset1.CommandText:=''; adodataset1.CommandText:=ssSql.Text ; //******************************************** //显示sql语句: //select t.gnfqname as 分區名稱, .. from gnfq //where t.gnfqname,功能分區內分棟的建築面積=fdmj='生活娱乐区' showmessage(ssSql.Text); adodataset1.Open; finally ssSQL.Free; end; finally ssFieldMap.Free; end; end;< >< > |
luowy651
高階會員 發表:257 回覆:313 積分:114 註冊:2003-04-09 發送簡訊給我 |
|
change.jian
版主 發表:29 回覆:620 積分:439 註冊:2003-06-02 發送簡訊給我 |
.Pas 檔:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids, DBGrids, DB, DBTables, Buttons; type TForm1 = class(TForm) Query1: TQuery; DataSource1: TDataSource; DBGrid1: TDBGrid; Label1: TLabel; ComboBox1: TComboBox; Label2: TLabel; Edit1: TEdit; BitBtn1: TBitBtn; procedure FormCreate(Sender: TObject); procedure BitBtn1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation const FieldMap = '員工編號=EmpNo,名字=LastName,姓氏=FirstName,區碼=PhoneExt,雇用日期=HireDate,薪資=Salary'; {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var ssFieldMap:TStringList; i:Integer; begin ssFieldMap:=TStringList.Create; try ssFieldMap.CommaText:=FieldMap; for i:=0 to ssFieldMap.Count-1 do ComboBox1.Items.Add(ssFieldMap.Names[i]); Query1.Close; Query1.SQL.Add('SELECT EmpNo , LastName, FirstName, PhoneExt, HireDate, Salary FROM "employee.db" A'); Query1.Open; finally ssFieldMap.Free; end; end; procedure TForm1.BitBtn1Click(Sender: TObject); var ssFieldMap:TStringList; begin if ComboBox1.ItemIndex>-1 then begin ssFieldMap:=TStringList.Create; try ssFieldMap.CommaText:=FieldMap; Query1.Close; Query1.SQL.Clear; Query1.SQL.Add('SELECT EmpNo, LastName, FirstName, PhoneExt, HireDate, Salary FROM "employee.db" '); Query1.SQL.Add(' WHERE ' ssFieldMap.Values[ssFieldMap.Names[ComboBox1.ItemIndex]] ' = ''' Edit1.Text ''''); Query1.Open; finally ssFieldMap.Free; end; end; end; end..dfm 檔: object Form1: TForm1 Left = 192 Top = 107 Width = 696 Height = 480 Caption = 'Form1' Color = clBtnFace Font.Charset = CHINESEBIG5_CHARSET Font.Color = clWindowText Font.Height = -12 Font.Name = '新細明體' Font.Style = [] OldCreateOrder = False OnCreate = FormCreate PixelsPerInch = 96 TextHeight = 12 object Label1: TLabel Left = 488 Top = 8 Width = 60 Height = 12 Caption = '查詢的欄位' end object Label2: TLabel Left = 488 Top = 64 Width = 48 Height = 12 Caption = '查詢的值' end object DBGrid1: TDBGrid Left = 8 Top = 8 Width = 473 Height = 441 DataSource = DataSource1 TabOrder = 0 TitleFont.Charset = CHINESEBIG5_CHARSET TitleFont.Color = clWindowText TitleFont.Height = -12 TitleFont.Name = '新細明體' TitleFont.Style = [] end object ComboBox1: TComboBox Left = 488 Top = 24 Width = 145 Height = 20 Style = csDropDownList ItemHeight = 12 TabOrder = 1 end object Edit1: TEdit Left = 488 Top = 80 Width = 121 Height = 20 TabOrder = 2 Text = 'Edit1' end object BitBtn1: TBitBtn Left = 488 Top = 120 Width = 75 Height = 25 Caption = '查詢' TabOrder = 3 OnClick = BitBtn1Click end object Query1: TQuery DatabaseName = 'DBDEMOS' Left = 24 Top = 24 end object DataSource1: TDataSource DataSet = Query1 Left = 56 Top = 24 end end說明: 1.我直接以BDE的DBDemo的Employee.db做範例 2.FormCreate時,直接把欄位的中文名稱整理出來,加到ComboBox1.Item裡.你可以視情況調整,因為這裡無法用"select XXX as ZZZ..."的語法 3.在FieldMap的常數裡,可以視情況需要把可能用到的欄位與名稱全部寫出來.在ComboBox1裡的欄位選項就可以ADOConnection.GetFieldNames取得欄位名稱,再以ssFieldMap去轉換成中文名稱,顯示在ComboBox1.Item裡,程式會更有彈性 |
zzmbeyond01
中階會員 發表:98 回覆:167 積分:53 註冊:2003-09-07 發送簡訊給我 |
|
change.jian
版主 發表:29 回覆:620 積分:439 註冊:2003-06-02 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |