📄 sqlserver实例-3.htm
字号:
<body bgcolor="#000000"><P class=boe_head2><font color="#009900">为什么要引入SPT的概念</font></P>
<P class=boe_text><font color="#FFFFFF">我们已经讲解了“远程视图”,您也许已经发现了远程视图的不足,是的远程视图的缺陷正是SPT的优势所在:</font></P>
<TABLE width="65%" border=0>
<TBODY>
<TR>
<TD width="100%"> <DIV
style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0in; BACKGROUND-POSITION: 0% 50%; BORDER-TOP: windowtext 2.25pt solid; PADDING-LEFT: 0in; BACKGROUND-ATTACHMENT: scroll; PADDING-BOTTOM: 1pt; BORDER-LEFT: medium none; WIDTH: 727px; PADDING-TOP: 1pt; BORDER-BOTTOM: windowtext 2.25pt solid; BACKGROUND-REPEAT: repeat; HEIGHT: 112px; BACKGROUND-COLOR: steelblue">
<OL>
<LI>
<P class=boe_list><font color="#FFFFFF">执行除Select以外的其他的SQL语句,如Insert
及Update等 </font></P>
<LI>
<P class=boe_list><font color="#FFFFFF">执行后端数据库的存储过程 </font></P>
<LI>
<P class=boe_list><font color="#FFFFFF">执行后端数据库的特殊的函数、命令 </font></P>
<LI>
<P class=boe_list><font color="#FFFFFF">一次得到多个数据集合 </font></P>
</LI>
</OL>
</DIV></TD>
</TR>
</TBODY>
</TABLE>
<P class=boe_text><font color="#FFFFFF">这些都是我们在系统开发时要遇到的实现问题,Visual FoxPro注意要了,于是提出了SPT的概念。SPT是SQL
Pass Through的简写,它与远程视图在一起共同组成Visual FoxPro远程数据访问体系,利用它们你就可以开发完整的Client\Server构架的系统了!与“远程视图”相比,SPT技术也有以下缺陷:</font></P>
<TABLE width="67%" border=0>
<TBODY>
<TR>
<TD width="100%"> <DIV
style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0in; BACKGROUND-POSITION: 0% 50%; BORDER-TOP: windowtext 2.25pt solid; PADDING-LEFT: 0in; BACKGROUND-ATTACHMENT: scroll; PADDING-BOTTOM: 1pt; BORDER-LEFT: medium none; WIDTH: 727px; PADDING-TOP: 1pt; BORDER-BOTTOM: windowtext 2.25pt solid; BACKGROUND-REPEAT: repeat; HEIGHT: 112px; BACKGROUND-COLOR: steelblue">
<OL>
<LI>
<P class=boe_list><font color="#FFFFFF">没有图形用户界面 </font></P>
<LI>
<P class=boe_list><font color="#FFFFFF">必须人工维护连接 </font></P>
<LI>
<P class=boe_list><font color="#FFFFFF">数据集合是“可读写光标”,要使它成为“可更新光标”必须进行设定
</font></P>
</LI>
</OL>
<P></P>
</DIV></TD>
</TR>
</TBODY>
</TABLE>
<P class=boe_text><font color="#FFFFFF">从我的经验来看待“远程视图”与SPT,我以为两者是Visual FoxPro远程数据访问体系的双臂,相辅相成。不用SPT,系统就会变得弱智、愚笨;不用远程视图,系统开发会变得缓慢、繁琐。我以为,“远程视图”是组件化的SPT,是微软公司对SPT部分功能的图像化封装,所以它显得更有生产效率,同时由于系统作得多了,功能也就弱了,“远程视图”能做得就是那些事情——从数据源读取一个结果集,在客户端对它维护,并自动将变动结果更新到数据源。然而作为系统开发,我们会在实践中遇到林林总总、奇奇怪怪的需求,只有“远程视图”独立担当显然是不行的,所以SPT的出现有它的必然性。在其他的远程数据处理组件中也有类似的概念,例如ADO中的RecordSet相当于Visual
FoxPro的远程视图,Command相当于Visual FoxPro的SPT。</font></P>
<P class=boe_head2><font color="#FFFFFF">13个SPT函数</font></P>
<P class=boe_text><font color="#FFFFFF">Visual FoxPro 中内置了13个以SQL开头的函数,我们把它们称为SPT函数。就是这13个函数完成了Visual
FoxPro的所有的SQL Pass Though功能。从功能上看,我们可以把它们分成五个部分:</font></P>
<P class=boe_head3><font color="#FFFFFF">连接函数</font></P>
<P class=boe_text><font color="#FFFFFF">连接建立函数:SqlConnect(),SqlStringConnect()</font></P>
<P class=boe_text><font color="#FFFFFF">连接的断开函数:SqlDisconnect()</font></P>
<P class=boe_head3><font color="#FFFFFF">核心的执行函数</font></P>
<P class=boe_text><font color="#FFFFFF">SQL语句传输及执行函数:SqlExec(),SqlPrapare()</font></P>
<P class=boe_text><font color="#FFFFFF">批次模式下更多数据集的取得函数:SqlMoreResults()</font></P>
<P class=boe_text><font color="#FFFFFF">异步模式下撤销正在执行的SPT的函数:SqlCancel()</font></P>
<P class=boe_head3><font color="#FFFFFF">事务处理函数</font></P>
<P class=boe_text><font color="#FFFFFF">SqlCommit(),SqlRollBack()</font></P>
<P class=boe_head3><font color="#FFFFFF">连接通道属性函数</font></P>
<P class=boe_text><font color="#FFFFFF">SqlGetProp(),SqlSetProp()</font></P>
<P class=boe_head3><font color="#FFFFFF">数据源的信息截取函数</font></P>
<P class=boe_text><font color="#FFFFFF">SqlTables(),SqlColumns()</font></P>
<P class=boe_text><font color="#FFFFFF"> </font></P>
<P class=boe_head2><font color="#FFFFFF">连接到SQL Server</font></P>
<P class=boe_head3><font color="#FFFFFF">连接</font></P>
<P class=boe_head4><font color="#FFFFFF">SqlConnect()的两种用法</font></P>
<P class=boe_text><font color="#FFFFFF">一般来说SqlConnect有两种用法:直接调用操作系统里的用户型或系统型DNS;使用当前数据库DBC的连接对象。</font></P>
<P class=boe_text><font color="#FFFFFF">如果已经在操作系统中制作了一个名为LocalServer的系统型DNS,在命令窗口中我们就可以直接键入:</font></P>
<P class=boe_code><font color="#FFFFFF">SQLCONNECT("localserver","sa","")</font></P>
<P class=boe_text><font color="#FFFFFF">如果当前数据库中存在连接对象,我们就可以这样调用它:</font></P>
<P class=boe_code><font color="#FFFFFF">SQLCONNECT("NorthWind")</font></P>
<P class=boe_head4><font color="#FFFFFF">SqlStringConnect()函数的用法</font></P>
<P
class=boe_text><font color="#FFFFFF">在用了SqlConnect以后,大家也许会发现不太自由,能不能及时动态建立连接呢?可以的,用SqlStringConnect()就可以了:</font></P>
<P class=boe_code><font color="#FFFFFF">SQLSTRINGCONNECT("driver=SQL Server;Server=See-you;Uid=sa;pwd=;database=northwind")</font></P>
<P class=boe_text><font color="#FFFFFF">我们解释一下参数字符串的意义,driver指明了使用哪一个ODBC驱动程序,这里是SQL
Server;Server是指SQL Server的服务器名称,我的服务器叫:See-You;UID是在SQL Server的用户名称,这里使用SA;PWD是用户口令,这里为空值;最后我们指定了要连接的数据库的名字,这次我们仍然使用NorthWind数据库。所有这些条件组成了一个字符串,各条件用分号分割,我的实验表明对大小写的要求不高,当然不包括用户口令和用户名。</font></P>
<P class=boe_head4><font color="#FFFFFF">关于连接的两大问题</font></P>
<P class=boe_text><font color="#FFFFFF">连接建立起来很简单,但尚有问题要解决:怎么判断连接是否成功?怎么屏蔽SQL
Server的登陆对话框?</font></P>
<P
class=boe_text><font color="#FFFFFF">第一个问题很好解决,只要SqlConnect()或是SqlStringConnect()返回正整数(>0的数)就表示连接成功,得到的正整数很重要——就是连接句柄!</font></P>
<P class=boe_code><font color="#FFFFFF">STORE SQLCONNECT('LocalServer', 'sa','错误密码')
TO gnConnHandle<BR>
IF gnConnHandle <= 0<BR>
= MESSAGEBOX('连接错误', 16, '连接到SQL Server')<BR>
ELSE<BR>
= MESSAGEBOX('连接成功', 48, '连接到SQL Server')<BR>
ENDIF</font></P>
<P class=boe_text><font color="#FFFFFF">在有些时候,连接发生错误会弹出SQL Server的登陆对话框:</font></P>
<P class=boe_text><font color="#FFFFFF"><IMG height=326 src="SQLSERVER实例-3.files/01.jpg" width=359
border=0></font></P>
<P
class=boe_text><font color="#FFFFFF">这是为了让用户更正连接信息的,但是在实际开发中没有哪个程序员希望此对话框暴露在用户面前。如果我们使用的连接是DBC的连接对象,问题就比较好解决,因为在建立连接时我们可以设定连接对话框的出现规律:</font></P>
<P class=boe_text><font color="#FFFFFF"><IMG height=393 src="SQLSERVER实例-3.files/02.jpg" width=591
border=0></font></P>
<P class=boe_text><font color="#FFFFFF">同样的我们可以通过命令来控制“显示 ODBC 登录提示”:</font></P>
<P class=boe_code><font color="#FFFFFF">DBSETPROP("connect1","CONNECTION" ,"DISPLOGIN"
,1) &&发生连接错误时弹出<BR>
DBSETPROP("connect1","CONNECTION" ,"DISPLOGIN" ,2) &&任何时候总是误时弹出<BR>
DBSETPROP("connect1","CONNECTION" ,"DISPLOGIN" ,3) &&发任何时候都不弹出</font></P>
<P class=boe_text><font color="#FFFFFF">但是当我们使用连接字符串、直接使用操作系统的DNS时,它们都不是Visual
FoxPro的DBC中的连接对象,就不能用以上的方法控制,我们可以设定Visual FoxPro的环境:</font></P>
<P class=boe_code><font color="#FFFFFF">SQLSETPROP(0,"DispLogin" ,3)</font></P>
<P class=boe_text><font color="#FFFFFF">注意我对第一个参数赋值为0,表明设定的是对Visual FoxPro的系统环境进行设定。值得注意的是,系统环境设定只是与这种即时产生连接有效,对存放在DBC中的连接对象并不起作用,根据连接对象建立的连接的有关属性还是要通过DBSETPROP()来设定。</font></P>
<P class=boe_head3><font color="#FFFFFF">断开连接</font></P>
<P class=boe_text><font color="#FFFFFF">建立的连接就应该再不用时及时断开,断开连接请使用SqlDisConnect()函数。</font></P>
<P class=boe_code><font color="#FFFFFF">Local hConn<BR>
hconn=SQLCONNECT("NorthWind")<BR>
?SQLDISCONNECT(hconn)<BR>
//返回1表示连接断开成功</font></P>
<P
class=boe_text><font color="#FFFFFF">这里有三个问题提请大家注意。第一,如果hconn是一个有效的连接句柄,对它执行SqlDisConn()函数会有这样的结果,成功返回1,其他表示断开操作失败;第二:如果hconn不是一个有效的连接句柄,Visual
FoxPro将触发一个错误,错误代号为1466,怎样判断某个连接句柄是不是有效的方法,我们在后文介绍;第三,如果想一下子断开所有的连接,您可以使用这样的方法:</font></P>
<P class=boe_code><font color="#FFFFFF">SQLDISCONNECT(0)</font></P>
<P class=boe_text><font color="#FFFFFF"> </font></P>
<P class=boe_head2><font color="#FFFFFF">从后端得到数据集</font></P>
<P class=boe_head3><font color="#FFFFFF">得到一个数据集</font></P>
<P class=boe_head4><font color="#FFFFFF">SQLEXEC(nConnectionHandle, [cSQLCommand,
[cCursorName]])</font></P>
<P
class=boe_text><font color="#FFFFFF">先来解释一下SQLEXEC()函数:参数nConnectionHandle表示连接句柄;参数cSQLCommand表示要传送的语句,注意此语句一定是数据源认得的语句,而不是Visual
FoxPro的语句;参数cCursorName表示得到的结果集的名字,如果省略,返回的结果集将以Sqlresult命名。</font></P>
<P class=boe_text><font color="#FFFFFF">如果返回1表示,执行成功;如果返回0表示正在执行;如果返回负数表示执行失败。</font></P>
<P class=boe_text><font color="#FFFFFF">如果我们希望得到NorthWind数据库中的Employees表的数据,就可以执行以下命令:</font></P>
<P class=boe_code><font color="#FFFFFF">SQLEXEC(hconn,"SELECT * FROM EMPLOYEES","MyCursor")<BR>
Browse</font></P>
<P class=boe_head4><font color="#FFFFFF">判断连接有效性</font></P>
<P class=boe_text><font color="#FFFFFF">这是一个非常实际的问题,我们建立了一条连接以后,怎样知道Visual FoxPro与SQL
Server的通信是正常的,机连接是确实有效的,只有一种方法——应用这条连接,可以这样:</font></P>
<P class=boe_code><font color="#FFFFFF">?SQLEXEC(hconn,"")<BR>
&&一个空的命令发送,返回1的话证明连接可用!</font></P>
<P class=boe_head4><font color="#FFFFFF">大型语句的传递技巧</font></P>
<P class=boe_text><font color="#FFFFFF">如果想得到一个更为复杂的结果集合,我们可以传送依据大型的SQL-Select描述。这里有一些经验送给大家:</font></P>
<TABLE width="100%" border=0>
<TBODY>
<TR>
<TD width="100%"> <DIV
style="BORDER-RIGHT: medium none; PADDING-RIGHT: 0in; BACKGROUND-POSITION: 0% 50%; BORDER-TOP: windowtext 2.25pt solid; PADDING-LEFT: 0in; BACKGROUND-ATTACHMENT: scroll; PADDING-BOTTOM: 1pt; BORDER-LEFT: medium none; WIDTH: 727px; PADDING-TOP: 1pt; BORDER-BOTTOM: windowtext 2.25pt solid; BACKGROUND-REPEAT: repeat; HEIGHT: 112px; BACKGROUND-COLOR: steelblue">
<OL>
<LI>
<P
class=boe_list><font color="#FFFFFF">如果传送的语句太大(大约是超过256个字符,其实没有必要去计数只要你觉得语句很大时就应该考虑我的建议,不然您就没有办法传送大型的语句),您直接把要传送的语句放入SQLEXEC()中,Visual
FoxPro就会报错,说无法认得此语句,于是大家就又多了诽谤Visual FoxPro的一条把柄!(根据我的研究,在Delphi中也有此问题)解决之道是:把长长的语句先放在一个变量中,再将此变量作为参数赋给SQLEXEC()函数。
</font></P>
<LI>
<P class=boe_list><font color="#FFFFFF">关于分隔符的使用技巧,Visual FoxPro中分隔字符串使用三种符号:双引号、单引号、方括号。在配置要传送的语句时一定要用双引号作为字符串的分隔符,其他的两个符号应另作他用。
</font></P>
</LI>
</OL>
</DIV></TD>
</TR>
</TBODY>
</TABLE>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -