線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1382
推到 Plurk!
推到 Facebook!

无效列名

答題得分者是:change.jian
zzmbeyond01
中階會員


發表:98
回覆:167
積分:53
註冊:2003-09-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-05-13 16:18:42 IP:218.70.xxx.xxx 未訂閱
各位大大好: 我在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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-05-13 16:29:26 IP:218.72.xxx.xxx 未訂閱
你的第二段查询不是已经可以了么?
zzmbeyond01
中階會員


發表:98
回覆:167
積分:53
註冊:2003-09-07

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-05-13 16:31:13 IP:218.70.xxx.xxx 未訂閱
 
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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-05-13 16:42:51 IP:61.222.xxx.xxx 未訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-05-13 17:00:59 IP:218.70.xxx.xxx 未訂閱
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-05-13 17:09:54 IP:218.70.xxx.xxx 未訂閱
如果我用下面的方法(想 依据各个字段在数据库中的栏位),想去获得英文字段
 
//获得需要查询的字段
  strField := FieldListbox.Items.Strings[FieldListbox.ItemIndex];
错误! List index out of bounds(2..) 發表人 - zzmbeyond01 於 2004/05/13 17:12:08
change.jian
版主


發表:29
回覆:620
積分:439
註冊:2003-06-02

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-05-13 17:21:50 IP:61.222.xxx.xxx 未訂閱
引言: 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中字段也只显示中文啊?
1.照你這樣說來,Oracle是可以把欄位直接設成中文名稱囉,但我記得是不行才是.你的Oracle是那個版本,新功能嗎? 2.你的程式碼中的FieldQry是什麼function?你自己寫的嗎?
zzmbeyond01
中階會員


發表:98
回覆:167
積分:53
註冊:2003-09-07

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-05-13 17:38:56 IP:218.70.xxx.xxx 未訂閱
不会吧,我用的 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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-05-13 17:45:10 IP:218.70.xxx.xxx 未訂閱
大大: 我  
 
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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-05-13 17:47:31 IP:61.164.xxx.xxx 未訂閱
要不你设一个变量,例如: if x='生活娱乐区' then select gnfqname as 分区名称, fdmj as 功能分区内分栋的建筑面积, lhmj as 绿化面积 from gnfq t WHERE gnfqname='生活娱乐区'
change.jian
版主


發表:29
回覆:620
積分:439
註冊:2003-06-02

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-05-13 22:25:08 IP:61.229.xxx.xxx 未訂閱
.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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-05-13 22:30:37 IP:218.70.xxx.xxx 未訂閱
大大: const   FieldMap = '分區名稱=gnfqname,功能分區內分棟的建築面積=fdmj'; //欄位與中文名稱對照表    
 
 ssFieldMap.Add(FieldMap);
for i:=0 to ssfieldmap.Count-1 do
showmessage(ssfieldmap.Strings[i]);
在字符串类表中当作一个字符串对待的,如何进行定位指定的字符串,而把不相关的字符串去掉?
change.jian
版主


發表:29
回覆:620
積分:439
註冊:2003-06-02

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-05-14 08:42:53 IP:61.222.xxx.xxx 未訂閱
引言: 大大: const FieldMap = '分區名稱=gnfqname,功能分區內分棟的建築面積=fdmj'; //欄位與中文名稱對照表
 
 ssFieldMap.Add(FieldMap);
for i:=0 to ssfieldmap.Count-1 do
showmessage(ssfieldmap.Strings[i]);
在字符串类表中当作一个字符串对待的,如何进行定位指定的字符串,而把不相关的字符串去掉?
看不太懂你的意思
系統時間:2024-07-03 2:36:23
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!