在本次讲座中,我们将首先介绍数据库设计的基本方法,并附上了一个设计MS-SQL Server数据库的例子。然后以Delphi5为开发工具,标准的paradox表为后台数据库,来向大家介绍如何进行最简单的数据库编程。
在本例中,我们将实现对一个数据表单的添加、修改、删除以及对表中数据进行查询的功能。本例所使用的计算机软硬件环境为:Windows NT 4.0 Server,MS-SQL Server7.0,Borland Delphi 5,PIII550,256M内存。当然啦,一般的朋友在Win98的环境下或者Win2000的环境下都可以按照本例的步骤来编程序的。笔者的机器主要用作服务器,所以就在服务器上编啦。废话少说,现在开始:
一、数据库设计的基本方法
数据库设计是建立数据库及其应用系统的核心和基础,它要求对于指定的应用环境,构造出较优的数据库模式,建立起数据库应用系统,并使系统能有效地存储数据,满足用户的各种应用需求。一般按照规范化的设计方法,常将数据库设计分为若干阶段……
二、MS-SQL Server数据库设计示例
下面,笔者还为各位网友准备了一套数据库大餐,这就是在MS-SQL Server下的Client/Server结构编程示例……
三、数据库编程示例
在本次讲座中,我们以Delphi5为开发工具,标准的paradox表为后台数据库,来向大家介绍如何进行最简单的数据库编程。在本例中,我们将实现对一个数据表单的添加、修改、删除以及对表中数据进行查询的功能……
四、大型数据库设计原则
一个好的数据库产品不等于就有一个好的应用系统,如果不能设计一个合理的数据库模型,不仅会增加客户端和服务器段程序的编程和维护的难度,而且将会影响系统实际运行的性能。一般来讲,在一个MIS系统分析、设计、测试和试运行阶段,因为数据量较小,设计人员和测试人员往往只注意到功能的实现,而很难注意到性能的薄弱之处,等到系统投入实际运行一段时间后,才发现系统的性能在降低……
SQL Server 7.0 入门(一)
交互式SQL(Transact SQL,TSQL)
它是SQL Server的查询语言。提供以下命令:
· 创建和数据库对象。
· 访问和修改数据。
· 数据聚合(aggregation,又称聚集)。
· 实施安全措施。
数据库对象
数据库对象是数据库中的物理对象。这些对象拥有唯一的名字,并保存数据和数据关系信息。SQL Server定义了如下几种对象:
1、 表(table)
表是用来存储数据的两维数组,它有行和列。列也称为表属性或字段,表中的每一列拥有唯一的名字,每一列包含具体的数据类型,这个数据类型由列中的数据类型定义。
2、 视图(view)
视图是虚拟的表,它只包含表的一部分。与表不同的是,保存在视图中的数据并不是物理存储的数据,它是由表派生的,派生表被称为视图的基本表。视图的定义存储在数据库中。
3、 约束条件(constraint)
约束条件定义数据的完整性和有效性。约束条件为列中的值建立规则。换而言之,如果在某一列上定义了结束条件,则插入这一列的每一个值需要通过约束条件检查。约束条件是在触发器和规则上保证数据完整性和有效性的较佳选择。SQL Server Query Optimizer利用约束条件产生出低成本的查询计划。约束条件有如下类型:
· NOT NULL 这个约束条件要求列中不能有NULL值。
· CHECK 为列指定能拥有的值的集合后,检查约束条件。列中任何在定义之外的数据都为无效数据。有效值集合称为列的域。
· PRIMARY KEY 主关键字是列或列组合,它用来唯一标识一行。
· FOREIGN KEY 用来定义两个表之间的父子关系。如果一个关键字既是一个表的主关键字的一部分,同时又是另一个表的主关键字,则称它为外来关键字。外来关键字用来定义数据的引用完整性。
· UNIQUE 唯一约束条件是指无任何两行在列中有相同的NON-NULL值。唯一性由主关键字保证,但他们不允许NULL值,并且每一个表只能有一个关键字。
4、 默认值(default)
默认值是为列定义的值,如果在插入一行时没有提供某一列的值,则此列使用默认值,默认值可以是以下的一种:
· 常量
· 数学表达式
· 内部函数(Built-in function)
5、 规则(rule)
规则执行和CHECK约束条件同样的功能。但规则和约束条件不同的是:规则作为独立的对象存在,它可以用于多个表,而约束条件作为表的一部分存储。然而,规则是作为向后兼容特点而提供的,建议用户使用约束条件。
精通数据库系列之入门-技巧篇3
作者:思索 整理:南海
下面,笔者还为各位网友准备了一套数据库大餐,这就是在
MS-SQL Server下的Client/Server结构编程示例:
MS-SQL SERVER是微软公司生产的中型关系数据库管理系统,它有如下的一些特点:
客户/服务器体系结构
图形化的用户界面,使系统的管理更加直观和简单。
丰富的编程接口,为用户进行应用程序设计提供了更大的选择余地。
与Windows NT操作系统的有机集成,多线程体系结构设计,提高了系统对用户并发访问的速度。
对Web技术的支持,使用户能够很容易的将数据库中的数据发布到网上。
价格上的优势。与其它一些大型数据库系统如Oracle、Sybase等相比,SQL Server的价格非常便宜。
由于SQL Server数据库管理系统具有突出的有点,所以其用户越来越多。本文中陈述的是一些使用SQL Server的方法和体会(以SQL Server6.5为例)。
一、系统的安装
SQL Server要求安装在Windows NT操作系统平台下,它可以和NT一起运行在Intel x86、Alpha AXP或者MIPS等不同体系结构的微处理器环境。系统的内存和硬盘空间最小要求是16MB和96MB。在安装时,启动光盘上i386目录下的setup.exe程序,根据安装程序的提示可以很容易的完成系统安装。
安装过程中系统主要生成了SQL Enterprise Manager、SQL Web Assistant、ISQL_W、SQL Books Online等系统工具,其中SQL Enterprise Manager是最重要的一个工具,它可以实现对SQL Server数据库系统的全面操作和维护。
系统安装完毕后,有以下方法可以启动SQL Server服务:
使用net start mssqlserver命令启动SQL Server服务。
系统自动启动。
使用系统管理工具SQL Enterprise Manager或SQL Service Manager启动服务。
使用Windows NT控制面板里的服务选项启动SQL Server服务。
二、数据库的建立
从SQL Enterprise Manager的数据库管理窗口选择“新建”按钮,弹出新建数据库对话框(如下页图所示)。在这个对话框中输入新建数据库的名称,选择存储数据库及其日志所使用的设备,输入它们的空间大小(以MB为单位),再根据需要选择Create for Load复选框(该复选框说明是否从一个备份库中向新建的数据库加载数据),然后选择“OK”按钮即可创建一个新的数据库。
另外,使用SQL语句也可以创建数据库:
CREATE DATABASE MyDataBase
MySQL进阶_SELECT篇(一)
MySQL中SELECT语句的基本语法是:
SELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [HIGH_PRIORITY] [DISTINCT|DISTINCTROW|ALL] select_list [INTO {OUTFILE|DUMPFILE} 'file_name' export_options] [FROM table_references [WHERE where_definition] [GROUP BY col_name,...] [HAVING where_definition] [ORDER BY {unsighed_integer|col_name|formura} [ASC|DESC],...] [LIMIT [offset,] rows] [PROCEDURE procedure_name]]
从这个基本语法可以看出,最简单的SELECT语句是SELECT select_list,实际上利用这个最简单的SELECT语句,你也可以完成许多你期待的功能,首先你能利用它进行MySQL所支持的任何运算,例如:SELECT 1 1,它将返回2;其次,你也能利用它给变量赋值,而在PHP中,运用SELECT语句的这种功能,你就可以自由地运用MySQL的函数为PHP程序进行各种运算,并赋值给变量。在很多的时候,你会发现MySQL拥有许多比PHP更为功能强大的函数。
STRAIGHT_JOIN、SQL_SMALL_RESULT、SQL_BIG_RESULT、HIGH_PRIORITY是MySQL对ANSI SQL92的扩展。如果优化器以非最佳次序联结表,使用STRAIGHT_JOIN可以加快查询。
SQL_SMALL_RESULT和SQL_BIG_RESULT是一组相对的关键词。它们必须与GROUP BY、DISTINCT或DISTINCTROW一起使用。SQL_SMALL_RESULT告知优化器结果会很小,要求MySQL使用临时表存储最终的表而不是使用排序;反之,SQL_BIG_RESULT告知优化器结果会很小,要求MySQL使用排序而不是做临时表。
HIGH_PRIORITY将赋予SELECT比一个更新表的语句更高的优先级,使之可以进行一次优先的快速的查询。
以上四个关键词的使用方法的确比较晦涩。幸运的是,在绝大多数情况下,在MySQL中我们完全可以选择不使用这四个关键词。
DISTINCT、DISTINCTROW对查询返回的结果集提供了一个最基本但是很有用的过滤。那就是结果集中只含非重复行。在这里要注意的是,对关键词DISTINCT、DISTINCTROW来说,空值都是相等的,无论有多少NULL值,只选择一个。而ALL的用法就有画蛇添足之嫌了。它对结果集的产生没有任何影响。
INTO {OUTFILE|DUMPFILE} 'file_name' export_options,将结果集写入一个文件。文件在服务器主机上被创建,并且不能是已经存在的。语句中的export_options部分的语法与用在LOAD DATAINFILE语句中的FIELDS和LINES子句中的相同,我们将在MySQL进阶_LOAD DATA篇中详细讨论它。而OUTFILE与DUMPFILE的关键字的区别是:后前只写一行到文件,并没有任何列或行结束。
修改SQL SERVER内置存储过程
SQLSERVER估计是为了安装或者其它方面,它内置了一批危险的存储过程。能读到注册表信息,能写入注册表信息,能读磁盘共享信息等等……各位看到这儿,心里可能会在想,我的网站中有其它的代码,又不像查询分析器那样能直接将结果输出。给你这个权限,也不能怎么样,还是看不到信息。如果各位这样想就大错特错了。提示一下,如果攻击者有CREATE TABLE的权限,那么创建一个临时表,然后将信息INSERT到表中,然SELECT出来,接着跟数字进行比较,让SQL SERVER报错,那么结果就全出来了……所以我们要报着宁错杀,不放过的态度进行修补。
先来列出危险的内置存储过程:
xp_cmdshell
xp_regaddmultistring
xp_regdeletekey
xp_regdeletevalue
xp_regenumkeys
xp_regenumvalues
xp_regread
xp_regremovemultistring
xp_regwrite
ActiveX自动脚本:
sp_OACreate
sp_OADestroy
sp_OAMethod
sp_OAGetProperty
sp_OASetProperty
sp_OAGetErrorInfo
sp_OAStop
以上各项全在我们封杀之列,例如xp_cmdshell屏蔽的方法为:
sp_dropextendedproc 'xp_cmdshell'
如果需要的话,再用
sp_addextendedproc 'xp_cmdshell', 'xpsql70.dll'
进行恢复。如果你不知道xp_cmdshell使用的是哪个.dll文件的话,可以使用
sp_helpextendedproc xp_cmdshel
来查看xp_cmdshell使用的是哪个动态联接库。另外,将xp_cmdshell屏蔽后,我们还需要做的步骤是将xpsql70.dll文件进行改名,以防止获得SA的攻击者将它进行恢复。
如何把Access的数据导入到Mysql中
在建设网站的过程中,经常要处理一些数据的导入及导出。在Mysql数据库中,一般有两种方法来处理数据的导出:
1. 使用select * from table_name into outfile “file_name”;
2. 使用mysqldump实用程序
下面我们来举例说明:
假设我们的数据库中有一个库为samp_db,一个表为samp_table。现在要把samp_table的数据导出。则我们可以利用以下方法来实现:
在Mysql提示符下打入select * from samp_table into outfile “file_name”;
在系统命令提示符下打入mysqldump
异构数据库之间的导入导出
异构数据库之间的导入导出
//MSSQL2EXCEL
ADOConnection1.ConnectionString:=
'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=G:mysmallexeexcel2sqlyp.xls;'
'Extended Properties=excel 8.0';
ADOConnection1.Execute('select * into [Abc] from drug_yk IN [ODBC] [ODBC;Driver=SQL
Server;UID=sa;PWD=kcsoft58;Server=127.0.0.1;DataBase=kcsoft_his]');
//把一个MSSQL的数据库表及数据导出到excel中,abc为excel中不存在的表名,drug_yk为MSSQL里的表, sa为
用户, kcsoft58为密码 , 127.0.0.1为服务大地址 ,kcsoft_his是数据库名称
ADOConnection1.Execute('insert into [abc] select * from drug_yk in [ODBC] [ODBC;Driver=SQL
Server;UID=sa;PWD=kcsoft58;Server=127.0.0.1;DataBase=kcsoft_his]');
//把一个MSSQL的数据库表的记录增加到到excel中,执行以后相当于两倍量的数据,一次是导入,一次是
insert
//EXCEL2MSSQL
ADOConnection1.ConnectionString:='Provider=SQLOLEDB.1;Password=KCSOFT58;Persist Security
Info=True;User ID=SA;Initial Catalog=KCSOFT_HIS;Data Source=CHEN';
ADOConnection1.Execute('SELECT * into [abc] FROM OpenDataSource( '
QuotedStr('Microsoft.Jet.OLEDB.4.0') ','
QuotedStr('Data Source="G:mysmallexeexcel2sqlyp.xls";Extended Properties=excel 8.0')
')...[Abc]');
//MSSQL2VFP
ADOConnection2.ConnectionString:=
'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=G:mysmallexeexcel2sql;'
'Extended Properties=dBase 5.0';
ADOConnection2.Execute('select * into Abc.dbf from drug_yk IN [ODBC] [ODBC;Driver=SQL
Server;UID=sa;PWD=kcsoft58;Server=127.0.0.1;DataBase=kcsoft_his]');
//把一个MSSQL的数据库表及数据导出到VFP中,Abc.dbf 为VFP中不存在的表名,drug_yk为MSSQL里的表, sa为
用户, kcsoft58为密码 , 127.0.0.1为服务大地址 ,kcsoft_his是数据库名称
//VFP2MSSQL
ADOConnection2.ConnectionString:='Provider=SQLOLEDB.1;Password=KCSOFT58;Persist Security
Info=True;User ID=SA;Initial Catalog=KCSOFT_HIS;Data Source=CHEN';
ADOConnection2.Execute('SELECT * into [abc] FROM OpenDataSource( '
Adodb 官方介绍
前言
我爱听这首歌,尤其是由Louis Armstrong 及 Ella 的二重唱版本。它显示出两个恋爱中人的彼此竞争有多辛苦,也是关于互相妥协并寻求共通之处的历程。
PHP可以用最少的精力以及最多的乐趣来建立动态的网站,要建立动态网站我们需要使用数据库来撷取登入账号信息、发布动态新闻、储存讨论区的文章。就以使用最通用的 MySQL 数据来说,你们公司已经完成了如此神奇的工作,让你们的网站比你们所能想象的还要出名。接着你们也发现MySQL无法应付实际的工作量了,是该更换数据库系统的时候了。
不幸地,在PHP中所有数据库的存取都有些细微的不同。与MySQL连结你要使用 mysql_connect(),当你决定升级到 Oracle 或 Microsoft SQL Server 时,你必须分别改用 ocilogon() 或 mssql_connect()。更糟糕的是不同连结所使用的参数也都不一样,有的数据库说 po-tato(马铃薯的发音),别的数据库又说 pota-to(马铃薯的另一个发音),喔…..天啊。
我们不要放弃
当你需要确保你程序的可移植性的时候,一个叫做 ADODB 的数据库封包链接库已经出现了。它提供了共通的应用程序接口来跟所有支持的数据库沟通,因此你无须放弃!
ADODB是Active Data Object DataBase的缩写(很抱歉!玩计算机的有时候不是很有原创性)。ADODB目前支持MySQL、PostgreSQL、Oracle、Interbase、Microsoft SQL Server、Access、FoxPro、Sybase、ODBC及ADO,你可以从 http://php.weblogs.com/adodb下载 ADODB。
MySQL的例子
PHP中最通用的数据库是MySQL,所以我想你会喜欢下面的程序代码,它连结到 localhost 的 MySQL 服务器,数据库名称是 mydab,并且执行一个 SQL 的 select 指令查询,查询结果会一列列地印出来。
PHP4 与 MySQL 数据库操作函数详解(1)
说PHP就不能不提MySQL,而要讲MySQL,那么PHP也是必然要被提起。PHP的迅速崛起,离不开MySQL,而MySQL的广泛应用,也与PHP休戚相关。
下面详细分析PHP4中与MySQL相关操作的函数(共32个,开头都为mysql_):
<1>. 连接数据库服务器(database server)的函数(2个):
(1).mysql_connect()
格式:int mysql_connect(string [hostname] [ort],string [username],string [password]);
参数中的port参数表示数据库服务器的端口号,一般用它的默认端口号就可以了。
如果不填任何参数,则默认的hostname为localhost,username为root,password为空。
函数执行成功,返回一个int 类型的连接号(link_identifier),执行失败,返回false值。
例子:
$connect = mysql_connect("localhost","user","password");
if($connect) echo "Connect Successed!"; //连接成功,显示Connect Successed!
else echo "Connect Failed!"; //连接失败,显示Connect Failed!
?>
在上例中,如mysql_connect()执行失败,将显示系统的错误提示,而后继续往下执行。那,该如何屏蔽这些系统的错误提示并在失败后结束程序?
在MySQL中,允许在数据库函数之前加上@符号,屏蔽系统的错误提示,同时用die()函数给出更易理解的错误提示,然后die()函数将自动退出程序。
上例可以改为:
$connect = @mysql_connect("localhost","user","password") or die ("Unable to connect database server!");
?>
如mysql_connect()执行失败,将显示 Unable to connect database server!后,退出程序。
(2).mysql_pconnect()
格式:int mysql_pconnect(string [hostname] [ort],string [username],string [password]);
此函数与(1)的mysql_connect()基本相同,区别在于:
--------- 当数据库操作结束之后 ,由(1)的mysql_connect()建立的连接将自动关闭,而(2)的mysql_pconnect()建立的连接将继续存在,是一种稳固持久的连接。
--------- 在(2)的mysql_pconnect(),每次连接前,都会检查是否有使用同样的hostname,use,password的连接,如果有,则直接使用这个连接号。
--------- (1)的mysql_connect()建立的连接可以用mysql_close()关闭,而(2)的mysql_pconnect()不能用mysql_close()来关闭。
PHP4 与 MySQL 数据库操作函数详解(2)
<5>.数据库记录操作函数(5个):
1、mysql_fetch_array()
格式:array mysql_fetch_array(int query);
执行成功,返回1个数组,该数组保存有下一条记录的值,如执行失败,则返回False值。
返回的数组既可以用下标来表示,也可以用字段名来表示。
例子:
$query = mysql_query($sql , $connect);
while($arrary = mysql_fetch_array($query))
{
echo $array[column1]." | ".$array[column2];
//echo $array[0]." | ".$array[1];
}
?>
Note : 数组的下标是从0开始的!
2、mysql_fetch_row()
格式:array = mysql_fetch_row(int query);
与1的mysql_fetch_array()函数功能基本相同。区别在于mysql_fetch_row()只能以数组下标来表示。
成功返回1个数组,失败返回False值。
例子:
$query = mysql_query($sql , $connect);
while($row = mysql_fetch_row($query))
{
echo $row[0] . " | " . $row[1] . "
";
}
?>
Note : mysql_fetch_row()函数只能用数组下标来表示,并从0开始。
另:mysql_fetch_row()比mysql_fetch_array()执行速度快,并且都是对下一行数据进行读取。
3、mysql_result()
格式:int mysql_result(int query , int row , string filedname);
在mysql_result()中,参数row必须从0开始,参数filedname必须是真实的字段名,不能用下标来表示。
执行成功,返回由数据库中取出的字段的数值,失败则返回False值。
例子:
$query = mysql_query($sql , $connect);
echo mysql_result($query , 0 , "column1")."
";
echo mysql_result($query , 1, "column1")."
";
echo mysql_result($query , 2, "column1")."
";
?>
Note : 此函数功能少,但使用方便。
4、mysql_fetch_object()
格式: object mysql_fetch_object(int query)
能对指定的字段进行循环读取,执行成功,将以对象object的形式返回数值,失败则返回False值。
例子:
$query = mysql_query($sql , $connect);
while($object = mysql_fetch_object($query))
解决SqlTransaction用尽的问题(SQL处理超时)
有时候程序处理的数据量比较小时,四平八稳,一切安然无恙,但数据量一大,原先潜伏的问题就暴露无遗了。
我做的一个项目,是负责一个厂的考勤的。厂里有员工1000多号人。按每人每天打4次卡,一个月30天,则产生的考勤记录数目为1000 * 4 * 30 = 120,000条。在处理这些记录时,我采用的是生成SQL语句,然后
SQL Server中利用存储过程来高性能地进行分页
分页查询的方法已经很多很多,在这里我也加入成为其中一员。
SQL Server中有一个Set Rowcount的的设置,它的意思是使命令的处理在响应指定的行数之后停止处理命令,利用这个特点,我们可以借用它来在一个千万行级数据表中实现高性能分页查询。先来说说实现方式: