即:先用ADOConnection连接数据库,再用ADOQuery执行SQL语句,最后将返回的数据集填充到StringGrid
这样就获得了一张所需的数据表格。

一、环境

Windows10
RAD Studio 10 Seattle
SQL Server 2014 Management Studio

二、连接数据库

1、手动配置ADOConnection和ADOQuery连接数据库

①创建一个工程

File——New——VCLForms Application
创建一个工程,才能运行相应的form

②Form 中添加ADOConnection和ADOQuery控件

Tool Palette中搜索ADOConnection和ADOQuery

③双击ADOConnection配置数据库

  • use connection string——build——提供程序——Microsoft OLE DB Provider for SQL Server

④ADOConnection配置数据库连接

  • 本地连接的设置

  • 服务器连接的设置
    如果连接的数据库不是本地库,则在服务器名称处填写【服务器名称/服务器IP】

⑤ADOConnection数据库连接的字符串

我的主要是以链接本地数据库为例

Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;User ID=sa;Initial Catalog=SQLTEST;Data Source=localhost

⑥将ADOQuery与ADOConnection关联起来

2、Form中写代码连接数据库

①创建工程和控件选择的方法和上面一样

不要手动配置连接

②在Form中添加一个Button

按钮用来测试连接语句是否已经成功链接本地数据库

③双击进入Button控件编写事件


procedure TForm1.Button1Click(Sender: TObject);
begin//ADOConnection1.ConnectionString := 'Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;User ID=sa;Initial Catalog=SQLTEST;Data Source=localhost';//这段链接字符串就是上面手动配置时生成的ADOConnection1.ConnectionString := 'Provider=SQLOLEDB.1;Password=123456;Persist Security Info=True;User ID=sa;Initial Catalog=SQLTEST;Data Source=localhost';//这段是用非win账户链接数据库tryADOConnection1.Open;ShowMessage('数据库连接成功');exceptShowMessage('数据库未连接成功');end;end;

④运行Form

快捷键:Shift+Ctrl+F9

⑤检测结果

点击Button1

三、StringGrid的数据填充

上面数据库连接成功后,就可以从数据库中取数出来填充到StringGrid控件中

1、Form中添加TStringGrid

可以看到,Grid里现在已有5行5列,这是因为在属性这边的ColCount=5,RowCount=5(ColCount列数,RowCount行数)

2、Button1中添加向StringGrid填充数据代码


procedure TForm1.Button1Click(Sender: TObject);
varI: Integer;
begin//ADOConnection1.ConnectionString := 'Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;User ID=sa;Initial Catalog=SQLTEST;Data Source=localhost';//这段链接字符串就是上面手动配置时生成的ADOConnection1.ConnectionString := 'Provider=SQLOLEDB.1;Password=123456;Persist Security Info=True;User ID=sa;Initial Catalog=SQLTEST;Data Source=localhost';//这段是用非win账户链接数据库tryADOConnection1.Open;//ShowMessage('数据库连接成功');ADOQuery1.SQL.Clear;ADOQuery1.SQL.Add('select user_names,user_sex,user_phone,user_email  from user_info');ADOQuery1.Open;StringGrid1.ColCount:=   ADOQuery1.FieldCount;   //StringGrid的列数为ADOQuery打开表后获取的列数StringGrid1.RowCount:=   ADOQuery1.RecordCount; //StringGrid的行数为ADOQuery打开表后获取的行数//          for I := 0 to ADOQuery1.RecordCount-1 do  //从0-ADOQuery打开表后获取的列数-1(从0开始,多了一次,多以要-1)
//          begin
//              StringGrid1.Cells[0,I] := ADOQuery1.FieldByName('user_names').AsString;
//              StringGrid1.Cells[1,I] := ADOQuery1.FieldByName('user_sex').AsString;
//              StringGrid1.Cells[2,I] := ADOQuery1.FieldByName('user_phone').AsString;
//              StringGrid1.Cells[3,I] := ADOQuery1.FieldByName('user_email').AsString;
//
//              ADOQuery1.Next;
//          end;I:=0;ADOQuery1.First;  //由首行开始while not ADOQuery1.Eof do //Eof:当表数据没到尾部时执行循环beginStringGrid1.Cells[0,I] := ADOQuery1.FieldByName('user_names').AsString;StringGrid1.Cells[1,I] := ADOQuery1.FieldByName('user_sex').AsString;StringGrid1.Cells[2,I] := ADOQuery1.FieldByName('user_phone').AsString;StringGrid1.Cells[3,I] := ADOQuery1.FieldByName('user_email').AsString;I:=I+1;ADOQuery1.Next;end;exceptShowMessage('数据库未连接成功');end;ADOConnection1.Close;end;

上面的代码用了两种循环赋值方式,其实都大同小异,都是根据ADOQuery打开表后获取的数据去做判断。

  • Bof和Eof的属性
    ADOQuery1.Bof:指示当前记录位置位于 Recordset 对象的第一个记录之前。
    ADOQuery1.Eof:指示当前记录位置位于 Recordset 对象的最后一个记录之后。

  • 运行结果
    可以看到,表中列数不是5了,Grid中的列数和行数都和select语句查询出来的数据表一致。
    ( 但是有一个小问题,没有表头和表列的自增值计数,并且列宽也是固定的。)

3、方法一:先自定义表头和列数

双击StringGrid1,进入窗体的事件中


procedure TForm1.FormCreate(Sender: TObject);
beginwith StringGrid1 dobeginColCount :=4;//4列RowCount :=2;//2行StringGrid1.Cells[0,0] :='姓名';//第0列第0行的表头名称StringGrid1.Cells[1,0] :='性别';StringGrid1.Cells[2,0] :='电话';StringGrid1.Cells[3,0] :='邮件邮件邮件邮件邮件';ColWidths[0] := 100;//第0列的列宽ColWidths[1] := 50;ColWidths[2] := 150;ColWidths[3] := 200;end;end;
  • 运行
    可以看到Form中的StringGrid1有了自定义表头。
    但是,这样会有什么问题呢?1、当你列数很多的时候,比如有20列,你就得写20条代码去命名每一列,然后再写20行代码再去设置列宽。如果是桌面应用这样的软件的话,每次做一点小修改都得重新升级,是不是很麻烦?

还有,再次点击按钮后,会把表头覆盖掉,所以StringGrid1的赋值循环要跳过第0行,从第一行开始哦~

4、方法二:根据返回的数据表获取表头和行列数

上面说了,用自定义的表头,如果修改次数多的话就会很烦躁,还有一列列地循环获取数据要写的相同代码行也很多。
那么,就根据select后返回的数据表自动获取表头各列的名称,然后再循环每一个单元格进行数据填充。


procedure TForm1.Button1Click(Sender: TObject);
varI,J,W : Integer;
beginADOConnection1.ConnectionString := 'Provider=SQLOLEDB.1;Password=123456;Persist Security Info=True;User ID=sa;Initial Catalog=SQLTEST;Data Source=localhost';//这段是用非win账户链接数据库try//SQL语句的执行ADOConnection1.Open;          ADOQuery1.SQL.Clear;ADOQuery1.SQL.Add('select user_names,user_sex,user_phone,user_email  from user_info');ADOQuery1.Open;//获取行列数StringGrid1.ColCount:=   ADOQuery1.FieldCount;   //StringGrid的列数为ADOQuery打开表后获取的列数StringGrid1.RowCount:=   ADOQuery1.RecordCount+1; //StringGrid的行数为ADOQuery打开表后获取的行数,因为多了一行表头,多以要+1//获取表头for W := 0 to ADOQuery1.FieldCount-1 do    //返回的表列数做循环StringGrid1.cells[w,0] :=   ADOQuery1.Fields[w].FieldName;//返回的表相应列的表头名//数据循环填充for i := 1 to ADOQuery1.RecordCount dobeginfor j := 0 to ADOQuery1.FieldCount-1 dobeginStringGrid1.Cells[j,i] := ADOQuery1.Fields.Fields[j].AsString;end;ADOQuery1.Next;end;exceptShowMessage('数据库未连接成功');end;ADOConnection1.Close;end;
  • 运行
    返回的数据表连同表头一起填充到了StringGrid1中,用了行列数的两层循环就行了,SO~简洁。
    但是,表头还是select出来的英文字段,这个在执行SQL语句时,将字段另设为中文就行了。

    额…StringGrid的列自适应宽度比较麻烦,要是像TAdvStringGrid控件一样,用AutoSizeColumns(true)这一句就可以设置自适应宽度就好了,TAdvStringGrid控件也可以用AutoNumberCol(0)就设置首列的数自增长。

四、结束语

在同事“我是不会去搞这垃圾delphi”的每日愤懑之下,我:“没关系,我都可。”
虽然说,delphi现在已经有点“没落”了,但是,什么言语的共通性其实都差不多的。往粗略了说,无非都是连接数据库、对数据库执行增删改查。不管黑猫还是白猫,能抓到老鼠的就是好猫(溜~)
温故总能知新,加油!

【Delphi】ADOConnection连接数据库、ADOQuery执行SQL语句、StringGrid填充数据集相关推荐

  1. django mysql sql语句_Django笔记:连接数据库并执行SQL语句

    Django中安装好数据库和对应的数据库驱动之后,就可以直接执行SQL语句进行数据库和表的创建,以及数据的增删改查等操作,在Python3中,可以使用的数据库和驱动有多种,我这里使用的是MySQL数据 ...

  2. java代码执行mysql语句_三种执行SQL语句的的JAVA代码

    问题描述: 连接数据库,执行SQL语句是必不可少的,下面给出了三种执行不通SQL语句的方法. 1.简单的Statement执行SQL语句.有SQL注入,一般不使用. public static voi ...

  3. Entity Framework 在MySQL中执行SQL语句,关于参数问题

    在Entity Framework中添加MySQL模型,在写代码的过程中需要直接执行SQL语句. 在SQL语句中用到了@curRank := 0 这样在SQL语句中定义参数,同时还会有传入参数:ai. ...

  4. pdo_fetch执行mysql_PDO中执行SQL语句的三种方法

    在PDO中,我们可以使用三种方式来执行SQL语句,分别是 exec()方法,query方法,以及预处理语句prepare()和execute()方法~大理石构件来图加工 在上一篇文章<使用PDO ...

  5. Python 技术篇-连接oracle数据库并执行sql语句实例演示,python连接oracle数据库oci详细配置方法

    Python 连接 Oracle 数据库 第一章:连接 oracle 数据与环境配置 ① 连接 oracle 数据库效果演示 ② oci 下载 ③ oci 配置 ④ 环境变量配置 ⑤ 检测是否有 or ...

  6. Oracle调用接口(OCI)源码剖析(2):执行SQL语句并获取结果

    概述 接着上一篇文章<Oracle调用接口(OCI)源码剖析(1):创建数据库连接>,我们继续对OCI中执行SQL语句并获取结果的源码进行剖析.该操作主要是由两个函数完成的:CDbExec ...

  7. java数据库编程——执行SQL 语句

    [0]README 1) 本文文字描述+source code 均转自 core java volume 2 , 旨在理解 java数据库编程--执行SQL 语句 的基础知识 : 2)for sour ...

  8. Java让数据库执行一条sql_java数据库编程——执行SQL 语句

    [0]README [1]java数据库编程--执行SQL 语句相关 1)执行 SQL 命令前, 首先需要创建一个 Statement 对象: 要创建 statement 对象,不需要调用 Drive ...

  9. java定时执行sql语句_spring中使用quartz动态添加定时任务执行sql

    系统用来每天插入视图数据... 一.数据库表设计 1.接口配置表(t_m_db_interface_config) 2.接口日志表(t_m_db_interface_log) 3.前端配置页面 查询页 ...

最新文章

  1. 禁用任何未使用的端口com_[pc玩家]如何在Windows 10中禁用USB端口
  2. Hadoop家族学习路线图
  3. java表达式由什么组成_必知必会之Lambda表达式
  4. 输入一个正整数求所有素数因子_一个数如果恰好等于它的因子之和,这个数就称为完数。编写应用程序求1000以内所有的完数...
  5. 计算机图形标定学,计算机图形学(璩柏青)第10章空间形体的三维重建与图像处理.ppt...
  6. java byte数组string_byte数组和String之间的转化
  7. [ECMAScript] 说说你对class的理解
  8. 【JSP】jsp报错:Syntax error, insert } to complete MethodBody
  9. cancase vector_基于Vector总线设备的CAN总线测试方法概述
  10. VC++实现混合静态分裂视窗的方法
  11. 《如何搭建小微企业风控模型》第一节 小微企业数据贷发展情况概述
  12. 书籍分析实例:哈利波特的分词及人物关系
  13. java 线程间通信方式_「转」JAVA多线程之线程间的通信方式
  14. norm函数-matlab
  15. 使用bus hound发送包的方法
  16. “美国人工智能计划The American AI In”启动
  17. 步进电机基础及工作原理
  18. 中国大学慕课mooc答题/自动播放脚本(domooc)使用教程
  19. 使用CSS画一个扇形
  20. Vue单向绑定与双向绑定解析

热门文章

  1. 许愿墙HTML+CSS
  2. 最近成了叨客 - 注册了饭否,叽歪网
  3. linux命令之查看ip地址
  4. 云服务器怎么弄mac系统,mac如何开启云服务器配置
  5. tinymce6.0+ 插件按钮翻译
  6. echarts绘制地图-china.json
  7. r5 5500u和r7 5700u哪个好 r55500u和r75700u区别有多大
  8. 一元二次函数c语言,计算一元二次函数的根,大家看看那里有错了。。。。
  9. 4k水面折射maya循环纹理支持arnold
  10. 计算机网络信息中心研究生,计算机网络信息中心研究生招生常见问题答疑