今天天好,心情也好,一切顺风顺水。
上午老师培训,下午自己操练。培训的内容不多,但有时感觉只要有人点拨一下,就会收益很多。
下午试着使用ADOConnection控件完成了与SQL server数据库的链接,并在不断发现问题和解决问题中,基本实现了对数据表的增删改查操作。
主要用到的控件有:ADOConnection、ADOTable、DataSource、DBGrid,一个label,四个Button和一个EDIT控件。
先附上控件在Form中的布局图:
1、ADDConnection控件连接SQL server数据库,可通过修改下列控件的属性进行连接。
步骤如下:
(1)修改ConnectionString,截图如下:
(2)设置ADOTable1的Connection属性:ADDConnection1, 修改Active属性为True, TabelName属性值选择数据库的表(下拉选项)。
(3)设置DataSource1的DataSet属性:ADOTable1.
(4)设置label、Edit、button的属性,这些比较简单,自己设置。
2、增删改查操作
代码略杂、注释掉的代码是修改前使用的。
添加了部分注释、目前个人能力范围内,可改进的地方,就是加一些try...except...else语句(后续完善)。
附上源码:
unit HandleData; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids, DBGrids, DB, ADODB, Mask, DBCtrls; type TForm1 = class(TForm) ADOTable1: TADOTable; DataSource1: TDataSource; Button1: TButton; DBGrid1: TDBGrid; ADOConnection1: TADOConnection; Button2: TButton; Button3: TButton; Button4: TButton; Label1: TLabel; Edit1: TEdit; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button4Click(Sender: TObject); // procedure ADOTable1BeforeDelete(DataSet: TDataSet); procedure Button3Click(Sender: TObject); procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var str:string; begin //ADOTable1.Next; //ADOTable1.Insert; //ADOTable1.FieldByName('TestNo').AsString:='A20007025'; //ADOTable1.FieldByName('TestName').AsString:='Dan'; //ADOTable1.FieldByName('TestScore').AsInteger:=100; //ADOTable1.Edit; //当前行修改 //ADOTable1.AppendRecord(['A20007031','wow',89]); ADOTable1.Insert; //在数据末尾添加一行 str:=edit1.Text; ADOTable1.FieldByName('TestNo').AsString:=str; ADOTable1.Post; end; procedure TForm1.Button2Click(Sender: TObject); var str:string; sc:string; begin ADOTable1.Edit; //ADOTable1.FieldValues['TestName']:='Ding'; //ADOTable1.fieldbyname('TestNo').asstring:='B20007036'; //inputQuery('输入查询条件','编号为',str); str:=Edit1.Text; ADOTable1.Locate('TestNo',str,[loCaseInsensitive]); inputQuery('修改成绩','成绩为',sc); ADOTable1.Edit; ADOTable1.fieldbyname('TestScore').AsInteger:=strToInt(sc); ADOTable1.Post; end; procedure TForm1.Button4Click(Sender: TObject); var str:string; begin ADOTable1.DisableControls; //防止因数据源的改动而造成界面的闪动 if messageDlg('确实要删除这条记录吗?',mtinformation,[mbok,mbcancel],0)=mrOk then str:=Edit1.Text; ADOTable1.Locate('TestNo',str,[loCaseInsensitive]); ADOTable1.Delete; ADOTable1.EnableControls; end; { procedure TForm1.ADOTable1BeforeDelete(DataSet: TDataSet); begin if messagedlg('确实要删除吗?',mtinformation,[mbyes,mbno],0)=mrno then abort(); end; } procedure TForm1.Button3Click(Sender: TObject); var str:string; begin { 第一种查询方式,待解决问题:只显示查询到的结果 inputQuery('输入查询条件','编号为',str); ADOTable1.Locate('TestNo',str,[loCaseInsensitive]) //精确查询 } str:=edit1.Text; ADOTable1.Locate('TestNo',str,[loPartialKey]) //模糊查询 end; procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);//光标所指记录高亮,运行就可以看到效果 begin with (Sender As Tdbgrid) do begin if (State = [gdSelected,gdFocused]) or (State = [gdSelected]) then //当前选中行 begin Canvas.Brush.Color := ClFuchsia; // ClBlue.//行底色 Canvas.Font.Color := CLWhite;//行字色 DefaultDrawColumnCell(Rect,Datacol,Column,[gdFixed]);//刷新 end; end; end; end.
运行界面如下:
--------------------------------------------------------------------------------------------------------------
编码过程中遇到的一些疑惑:
1、Tabel、TTable的区别:TTable是类、Table相当于类名,我是这么理解的。看这个语句Form1: TForm1,你应该就明白了。
2、运行过程出现的一个报错,如下图所示:
问题分析:dbgrid是可以修改的,但需要至少两个条件:第一,dbgrid本身属性设置允许用户修改,第二它所绑定的数据集组件是可以修改的。你所说的出 错:dataset not in edit or insert mode,应该是属于第二种情况,需要将dbgrid所绑定的数据集组件设置为edit模式。
解决方案:在相应的代码前面加上ADOTable1.Edit;
--------------------------------------------------------------------------------
给自己一份督促,也给看到这篇博客的朋友一个建议,遇到问题去记录,汇总,下次再碰到就可以拿出来看,节省很多时间。
水滴石穿,非一日之功。明天,奋斗不息。