SqlQuery.FieldByName().AsString的问题

lining251 2009-10-20 09:34:21
FieldByName()函数的参数如果是这样'1000号服务员',程序运行的时候就报错。
因为我的表中有一列的列名是'1000号服务员',我想去取这列的值的时候就报错,但是其他列就没问题,因为其他列的列名都是汉字或者拼音开头,只有这一列是以数字开头,请问这个问题怎么解决啊。
...全文
508 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
lining251 2009-10-20
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 snguobin 的回复:]
那就改成:'[1000号服务员]' ,很明显这是个不规则的变量命名,有时候系统可以认,但是不规范
你用sql 语句直接执行查询都查不出来吧?

唉!
[/Quote]

在select的时候,将列名加上“[]”,在fieldbyname的时候不能加“[]”,这样问题就解决了。我刚调试出来了,不过还是谢谢你,就你说的靠谱。
lining251 2009-10-20
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 snguobin 的回复:]
现在的程序员,让人无语,这是基础啊!
一般变量名都是 以字符或_ 开通 的字符等的组合。
[/Quote]

大哥,这个列名是人家规定的,不是我取的。不清楚情况就不要乱说。
风之谷 2009-10-20
  • 打赏
  • 举报
回复
是不是字段有了别名 你跟踪下把SQL调出来,然后到查询分析器里看,查出来的字段如何表示的
snguobin 2009-10-20
  • 打赏
  • 举报
回复
现在的程序员,让人无语,这是基础啊!
一般变量名都是 以字符或_ 开通 的字符等的组合。
snguobin 2009-10-20
  • 打赏
  • 举报
回复
那就改成:'[1000号服务员]' ,很明显这是个不规则的变量命名,有时候系统可以认,但是不规范
你用sql 语句直接执行查询都查不出来吧?

唉!
lining251 2009-10-20
  • 打赏
  • 举报
回复
我查了一下我的表,表中明明第一列就是“1000号服务员”啊,为什么会说找不到这个字段呢。
没人能解答吗?
lining251 2009-10-20
  • 打赏
  • 举报
回复
ColumnValue:=SqlQuery.FieldByName(ColumnNameArray[SheetNumber,ColumnNumber]).AsString;
程序走到这报错的,说找不到这个“1000号服务员”字段。
lining251 2009-10-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 snguobin 的回复:]
老大,你不会调试吗? F5是设置断点,F8是逐行执行,F7是进入函数!
这么简单的问题。

自己动手解决! 5分钟内必须搞定!^_^!

(先确认,数据库字段的值是否有问题,有不能转换为string的值。)
[/Quote]
问题已经定位到这了,别的中文的列名都没有问题,就这个以数字开头的列名出错。
snguobin 2009-10-20
  • 打赏
  • 举报
回复
老大,你不会调试吗? F5是设置断点,F8是逐行执行,F7是进入函数!
这么简单的问题。

自己动手解决! 5分钟内必须搞定!^_^!

(先确认,数据库字段的值是否有问题,有不能转换为string的值。)
lining251 2009-10-20
  • 打赏
  • 举报
回复
Var
InsertSqlStr:String;
TypeName:String;
ColumnValue:String;
i:Integer;
SqlQuery:TADOQuery;
Begin
SqlQuery:=TADOQuery.Create(nil);
SqlQuery.ConnectionString:='Provider=SQLOLEDB.1;Password='+Form_Quter.Edit_Password.Text
+';Persist Security Info=True;User ID='+Form_Quter.Edit_UserName.Text
+';Initial Catalog='+Form_Quter.Edit_DataBaseName.Text
+';Data Source='+Form_Quter.Edit_ServerName.Text;
GetTypeName(SqlQuery,TempTableName,SheetNumber);
i:=0;
while (TypeNameArray[i]<>'') do
Begin
SetColumnName();
TypeName:=TypeNameArray[i];
SqlQuery.Close;
SqlQuery.SQL.Clear;
SqlQuery.SQL.Add('select '+ColumnNameArray[SheetNumber,ColumnNumber]+' from '+TempTableName+' where '+SheetTypeColumnNameArray[SheetNumber]+'='+''''+TypeName+'''');
SqlQuery.Open;
while not SqlQuery.Eof do
Begin
ColumnValue:=SqlQuery.FieldByName(ColumnNameArray[SheetNumber,ColumnNumber]).AsString;
if ColumnValue='' then ColumnValue:='0';
SqlQuery.Next;
End;
i:=i+1;
End;
SqlQuery.Free;

这是我的代码。
火龙岛主 2009-10-20
  • 打赏
  • 举报
回复
你怎么写的?代码贴上来!
火龙岛主 2009-10-20
  • 打赏
  • 举报
回复
我的没问题啊?
unit Unit1;

interface

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

type
TForm1 = class(TForm)
ADOConnection1: TADOConnection;
ADOTable1: TADOTable;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
showmessage(ADOTable1.FieldByName('100服务员').AsString);
end;

end.

数据库:SQLServer2000
版本:Delphi7
连接方式:ADO
bdmh 2009-10-20
  • 打赏
  • 举报
回复
测试时可以的,没问题,是不是由于数据类型的问题
我用的是ADOQuery
unit uMain; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Mask, RzEdit, RzButton, ExtCtrls, IniFiles, RzTabs, ComCtrls, RzListVw, RzShellCtrls, ImgList, RzShellDialogs, RzCmboBx, QRCtrls, QuickRpt, jpeg, ShlObj, RzPanel, RzSplit, RzTreeVw, DB, ADODB, Provider, DBClient, GridsEh, DBGridEh, RzStatus; type PShellItem = ^TShellItem; TShellItem = record FullID, ID: PItemIDList; Empty: Boolean; DisplayName, TypeName: string; ImageIndex, Size, Attributes: Integer; ModDate: string; end; TfrmMain = class(TForm) RzPageControl1: TRzPageControl; TabSheet1: TRzTabSheet; TabSheet2: TRzTabSheet; lbl1: TLabel; edt_Path1: TRzEdit; btn_o2: TButton; Button1: TButton; SplPreview: TRzSplitter; img1: TImage; RzToolbar1: TRzToolbar; RzSpacer1: TRzSpacer; ClientDS_PicCap: TClientDataSet; DataSP_PicCap: TDataSetProvider; Qry_PicCap: TADOQuery; Ds_PicCap: TDataSource; DBGridEh1: TDBGridEh; ClientDataSetH: TClientDataSet; DataSetProviderH: TDataSetProvider; QueryH: TADOQuery; DataSourceH: TDataSource; RzBtn_0: TRzBitBtn; RzBtn_1: TRzBitBtn; ImageList1: TImageList; Memo1: TMemo; ClientDS_PicCapacc_id_only: TStringField; ClientDS_PicCapname: TStringField; ClientDS_PicCapplate_num: TStringField; ClientDS_PicCapplate_type: TStringField; ClientDS_PicCapInsDate: TDateTimeField; ClientDS_PicCapAcc_ID_Only_1: TStringField; ClientDS_PicCapfDateTime: TDateTimeField; ClientDS_PicCapPicturePath1: TStringField; ClientDS_PicCapPicturePath2: TStringField; ClientDS_PicCapPicturePath3: TStringField; ClientDS_PicCapPicturePath4: TStringField; ClientDS_PicCapPicturePath5: TStringField; ClientDS_PicCapPicturePath6: TStringField; ClientDS_PicCapPicturePath7: TStringField; ClientDS_PicCapPrintCount: TIntegerField; ClientDataSetHAutoID: TAu
Delphi ListView基本用法大全(转)默认分类 2009-09-29 09:27:56 阅读138 评论0 字号:大中小 订阅 Delphi高级编程 Delphi文章 WEB开发 Delphi控件 Delphi ListView基本用法大全 作者:seeker 日期:2009-04-19 //增加项或列(字段) ListView1.Clear; ListView1.Columns.Clear; ListView1.Columns.Add; ListView1.Columns.Add; ListView1.Columns.Add; ListView1.Columns.Items[0].Caption:='id'; ListView1.Columns.Items[1].Caption:='type'; ListView1.Columns.Items[2].Caption:='title'; ListView1.Columns.Items[2].Width:=300; Listview1.ViewStyle:=vsreport; Listview1.GridLines:=true; //注:此处代码也可以直接在可视化编辑器中完成, 也可写成以下这样 begin with listview1 do begin Columns.Add; Columns.Add; Columns.Add; ViewStyle:=vsreport; GridLines:=true; columns.items[0].caption:='进程名'; columns.items[1].caption:='进程ID'; columns.items[2].caption:='进程文件路径'; Columns.Items[0].Width:=100; Columns.Items[1].Width:=100; Columns.Items[2].Width:=150; end end; //增加记录 with listview1.items.add do begin caption:='1212'; subitems.add('hh1'); subitems.add('hh2'); end; //删除 listview1.items.delete(0); //从数据库表里读取数据写入Listview var Titem:Tlistitem; //此处一定要预定义临时记录存储变量. begin ListView1.Items.Clear; with adoquery1 do begin close; sql.Clear; sql.Add('select spmc,jg,sl from kcxs'); Open; ListView1.Items.Clear; while not eof do begin Titem:=ListView1.Items.add; Titem.Caption:=FieldByName('spmc').Value; Titem.SubItems.Add(FieldByName('sl').Value); Titem.SubItems.Add(FieldByName('jg').Value); next; end; //删除 ListView1.DeleteSelected; //如何取得ListView中选中行的某一列的值 procedure TForm1.Button2Click(Sender: TObject); begin ShowMessage(ListView1.Selected.SubItems.Strings[1]); //返回选中行第三列中的值 end; showMessage(listView1.Selected.Caption); //返回选中行第一列的值. 第1列的值: -->>> ListView1.Selected.Caption 第i列的值(i>1):-->>> ListView1.Selected.SubItems.Strings[i] ListView1.Items.Item[1].SubItems.GetText); //取得listview某行某列的值 Edit2.Text := listview1.Items[i].SubItems.strings[0]; //读第i行第2列 返回选中行所有子列值.是以回车符分开的,你还要从中剥离出来你要的子列的值。 showMessage(ListView1.Selected.SubItems.GetText); ListView 简单排序的实现 ListView 排序 怎样实现单击一下按升序,再单击一下按降序。 function CustomSortProc(Item1, Item2: TListItem; ColumnIndex: integer): integer; stdcall; begin if ColumnIndex = 0 then Result := CompareText(Item1.Caption,Item2.Caption) else Result := CompareText(Item1.SubItems[ColumnIndex-1],Item2.SubItems[ColumnIndex-1]) end; procedure TFrmSrvrMain.ListView1ColumnClick(Sender: TObject; Column: TListColumn); begin ListView1.CustomSort(@CustomSortProc,Column.Index); end; =============================================================== //增加 i := ListView1.Items.Count; with ListView1 do begin ListItem:=Items.Add; ListItem.Caption:= IntToStr(i); ListItem.SubItems.Add('第 '+IntToStr(i)+' 行'); ListItem.SubItems.Add('第三列内容'); end; //按标题删除 for i:=ListView1.Items.Count-1 downto 0 Do if ListView1.Items[i].Caption = Edit1.Text then begin ListView1.Items.Item[i].Delete(); //删除当前选中行 end; //选中一行 if ListView1.Selected <> nil then Edit1.Text := ListView1.Selected.Caption; // listview1.Items[Listview1.Items.Count -1].Selected := True; // listview1.Items[Listview1.Items.Count -1].MakeVisible(True); procedure TForm1.Button2Click(Sender: TObject); // 选择第一条 begin listview1.SetFocus; listview1.Items[0].Selected := True; end; procedure TForm1.Button1Click(Sender: TObject); // 选择最后一条 begin listview1.SetFocus; listview1.Items[Listview1.Items.Count -1].Selected := True; end; //这是个通用的过程 procedure ListViewItemMoveUpDown(lv : TListView; Item : TListItem; MoveUp, SetFocus : Boolean); var DestItem : TListItem; begin if (Item = nil) or ((Item.Index - 1 < 0) and MoveUp) or ((Item.Index + 1 >= lv.Items.Count) and (not MoveUp)) then Exit; lv.Items.BeginUpdate; try if MoveUp then DestItem := lv.Items.Insert(Item.Index - 1) else DestItem := lv.Items.Insert(Item.Index + 2); DestItem.Assign(Item); lv.Selected := DestItem; Item.Free; finally lv.Items.EndUpdate; end; if SetFocus then lv.SetFocus; DestItem.MakeVisible(False); end; //此为调用过程,可以任意指定要移动的Item,下面是当前(Selected)Item ListViewItemMoveUpDown(ListView1, ListView1.Selected, True, True);//上移 ListViewItemMoveUpDown(ListView1, ListView1.Selected, False, True);//下移 TListView组件使用方法 引用CommCtrl单元 procedure TForm1.Button1Click(Sender: TObject); begin ListView_DeleteColumn(MyListView.Handle, i);//i是要删除的列的序号,从0开始 end; 用LISTVIEW显示表中的信息: procedure viewchange(listv:tlistview;table:tcustomadodataset;var i:integer); begin tlistview(listv).Items.BeginUpdate; {listv:listview名} try tlistview(listv).Items.Clear; with table do {table or query名} begin active:=true; first; while not eof do begin listitem:=tlistview(listv).Items.add; listitem.Caption:=trim(table.fields[i].asstring); // listitem.ImageIndex:=8; next; end; end; finally tlistview(listv).Items.EndUpdate; end; end; ListView使用中的一些要点。以下以一个两列的ListView为例。 →增加一行: with ListView1 do begin ListItem:=Items.Add; ListItem.Caption:='第一列内容'; ListItem.SubItems.Add('第二列内容'); end; →清空ListView1: ListView1.Items.Clear; →得到当前被选中行的行的行号以及删除当前行: For i:=0 to ListView1.Items.Count-1 Do If ListView1.Items[i].Selected then //i=ListView1.Selected.index begin ListView1.Items.Delete(i); //删除当前选中行 end; 当然,ListView有OnSelectItem事件,可以判断选择了哪行,用个全局变量把它赋值出来。 →读某行某列的操作: Edit1.Text := listview1.Items[i].Caption; //读第i行第1列 Edit2.Text := listview1.Items[i].SubItems.strings[0]; //读第i行第2列 Edit3.Text := listview1.Items[i].SubItems.strings[1]; //读第i行第3列 以次类推,可以用循环读出整列。 →将焦点上移一行: For i:=0 to ListView1.Items.Count-1 Do If (ListView1.Items[i].Selected) and (i>0) then begin ListView1.SetFocus; ListView1.Items.Item[i-1].Selected := True; end; 不过在Delphi6中,ListView多了一个ItemIndex属性,所以只要 ListView1.SetFocus; ListView1.ItemIndex:=3; 就能设定焦点了。 Delphi的listview能实现交替颜色么? procedure TForm1.ListView1CustomDrawItem( Sender: TCustomListView; Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean); var i: integer; begin i:= (Sender as TListView).Items.IndexOf(Item); if odd(i) then sender.Canvas.Brush.Color:= $02E0F0D7 else sender.Canvas.Brush.Color:= $02F0EED7; Sender.Canvas.FillRect(Item.DisplayRect(drIcon)); end; 要想随时更改ListView 中某一行的字体颜色,要在ListView的 OnCustomDrawItem 的事件中书写相关的代码。例如 我想更改选中的某行字体的颜色,则需要在事件中写入下的代码: if item.Index = strtoint(edit1.Text) then //该条件是用于判断是否符合更改字体颜色的行的条件。 Sender.Canvas.Font.Color := clred;

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧