⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sqlserver实例-3.htm

📁 微软数据库开发梦工场多媒体教学-sql server篇.rar,是多媒体教学的
💻 HTM
📖 第 1 页 / 共 3 页
字号:
<P class=boe_code><font color="#FFFFFF">SELECT * FROM ORDERS INTO CURSOR MYCURSOR</font></P>
<P class=boe_text><font color="#FFFFFF">对于结果集合MyCursor来说我们不能对它执行任何写操作,如:Replace、Delete、Update等。</font></P>
<P class=boe_head4><font color="#FFFFFF">可读写光标是那种可以进行读写操作,但光标上的数据变更不被反映到数据源的光标:</font></P>
<P 
class=boe_text><font color="#FFFFFF">典型的可读写光标有三类,其一就是用SQLEXEC()得到的光标,我们可以对它进行各种操作(从了Zap、Pack这样的表压缩命令),但是任何数据的变动都不会反映到数据源。</font></P>
<P class=boe_text><font color="#FFFFFF">第二类可读写光标是Visual FoxPro 7 的新特性,我们在SQL-Select语句上加入关键字readwrite就可以得到这种光标。这是一个非常棒的特性,有了它在Visual 
  FoxPro中操作中间结果就更自由了:</font></P>
<P class=boe_code><font color="#FFFFFF">SELECT * FROM ORDERS INTO CURSOR MYCURSOR 
  READWRITE</font></P>
<P class=boe_text><font color="#FFFFFF">第三类可读写光标是“没有设置发送更新”的本地视图和远程视图。</font></P>
<P 
class=boe_text><font color="#FFFFFF">记得我在“远程视图”一章里反复强调:要想视图是可更新的就必须设定它的SendUpdate属性为.t.,如果没有设,试图就是可读写光标了,任何对视图数据的操作都不能反映到数据源里了。</font></P>
<P class=boe_head4><font color="#FFFFFF">可更新光标是那种可以进行读写操作,并且任何数据变动都会反映到数据源的光标:</font></P>
<P class=boe_text><font color="#FFFFFF">典型的可更新光标就是可更新视图,对它的好处我就不多加议论了,因为详细的内容在“远程视图”一章里已经讨论过了。</font></P>
<P class=boe_head3><font color="#FFFFFF">把SQLEXEC()得到的结果集设定为可更新光标的五大步骤</font></P>
<P class=boe_text><font color="#FFFFFF">在“远程视图”一章里我就反复强调,Visual FoxPro是怎么产生语句SQL描述,发送到SQL 
  Server中去的。大家可以想象配置一条SQL-Update或是SQL-Insert或是SQL-Delete需要的要素,怎样把客户端变动转化为SQL语句需要的东西,就是我们要设定的东西:</font></P>
<P class=boe_head4><font color="#FFFFFF">A.CURSORSETPROP("TABLES",数据源表名,可更新光标名)</font></P>
<P class=boe_text><font color="#FFFFFF">此步骤设定的是数据源里(SQL Server)待更新的表名,如果涉及多个表就这样写:CURSORSETPROP("TABLES","T1,T2","MyCursor")。</font></P>
<P class=boe_head4><font color="#FFFFFF">B.CURSORSETPROP("KEYFIELDLIST",关键字段,可更新光标名)</font></P>
<P class=boe_text><font color="#FFFFFF">此步骤是设定关键字段的,这个关键字段是这可更新光标的字段,而不是数据源里字段。</font></P>
<P class=boe_head4><font color="#FFFFFF">C.CURSORSETPROP("UPDATABLEFIELDLIST",可更新字段列表,可更新光标名)</font></P>
<P class=boe_text><font color="#FFFFFF">此步骤设定的是在可更新光标里哪些字段的变动要被反映到数据源,即哪些字段时可更新的。</font></P>
<P class=boe_head4><font color="#FFFFFF">D.CURSORSETPROP("UPDATENAMELIST",前后段字段对应关系列表,可更新光标名)</font></P>
<P class=boe_text><font color="#FFFFFF">此步骤设定前后端字段的对应关系。</font></P>
<P class=boe_head4><font color="#FFFFFF">E.CURSORSETPROP("SENDUPDATES",.T.,可更新光标名)</font></P>
<P class=boe_text><font color="#FFFFFF">这个步骤就不应多说了,最关键的一步,不做的话前面的努力都白搭。</font></P>
<P class=boe_text><font color="#FFFFFF">下面我用三个实例来说明问题:</font></P>
<P class=boe_head4><font color="#FFFFFF">例一:</font></P>
<P class=boe_code><font color="#FFFFFF">cnn=SQLCONNECT("northwind")<BR>
  SQLEXEC(cnn,"select categoryid as id ,categoryname,description from categories","mycursor")<BR>
  SELECT mycursor<BR>
  CURSORSETPROP("Tables","categories","mycursor")<BR>
  CURSORSETPROP("KeyFieldList","id","mycursor")<BR>
  CURSORSETPROP("UpdatableFieldList" ,"id,categoryname,description","mycursor")<BR>
  CURSORSETPROP("UpdateNameList","id categories.categoryid,categoryname categories.categoryname,"+;<BR>
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  "description categories.description","mycursor")<BR>
  CURSORSETPROP("SendUpdates" ,.t.,"mycursor")</font></P>
<TABLE width="74%" 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">数据源表是 NorthWind 数据库的Categories 
                表,可更新光表是mycursor </font></P>
            <LI> 
              <P 
        class=boe_list><font color="#FFFFFF">CURSORSETPROP("Tables","categories","mycursor"),TABLES属性设定的是:被更新的数据源表Gategories 
                </font></P>
            <LI> 
              <P 
        class=boe_list><font color="#FFFFFF">CURSORSETPROP("KeyFieldList","id","mycursor"),关键字用可更新光标的字段名:ID,而不是数据源表的字段名:categoryid 
                </font></P>
            <LI> 
              <P class=boe_list><font color="#FFFFFF">CURSORSETPROP("UpdatableFieldList" 
                ,"id,categoryname,description","mycursor"),可更新字段列表都用可更新光标的字段名表示,而不是数据源表的字段名。 
                </font></P>
            <LI> 
              <P class=boe_list><font color="#FFFFFF">CURSORSETPROP("UpdateNameList","id 
                categories.categoryid,categoryname categories.categoryname,description 
                categories.description","mycursor"),请注意这里的写法:每一组对应关系用逗号分开,前面写可更新光标的字段名,再放置一个空格,接着写数据源表的字段名(注意一定要加上数据源表名称) 
                </font></P>
            </LI>
          </OL>
        </DIV></TD>
    </TR>
  </TBODY>
</TABLE>
<P class=boe_head4><font color="#FFFFFF">例二</font></P>
<P class=boe_code><font color="#FFFFFF">cnn=SQLCONNECT("northwind")<BR>
  SQLEXEC(cnn,"select a.productid,a.productname,a.unitprice,b.categoryid,b.categoryname,c.supplierid,"+;<BR>
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  "c.companyname as suppliername,c.contactname"+; <BR>
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  " from (products a inner join categories b on a.categoryid=b.categoryid)"+;<BR>
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  " inner join suppliers c on a.supplierid=c.supplierid","mycursor")<BR>
  SELECT mycursor<BR>
  CURSORSETPROP("Tables","products,categories,suppliers","mycursor")<BR>
  CURSORSETPROP("KeyFieldList","productid,categoryid,supplierid","mycursor")<BR>
  CURSORSETPROP("UpdatableFieldList",+;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  "productid,productname,unitprice,categoryid,categoryname,supplierid,suppliername,contactname","mycursor")<BR>
  CURSORSETPROP("UpdateNameList","productid products.productid,productname ,"+;<BR>
  "products.productname,unitprice products.unitprice,"+;<BR>
  "categoryid categories.categoryid,categoryname categories.categoryname,"+;<BR>
  "supplierid suppliers.supplierid,suppliername suppliers.companyname,contactname 
  suppliers.contactname","mycursor")<BR>
  CURSORSETPROP("SendUpdates" ,.t.,"mycursor")</font></P>
<TABLE width="74%" 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">这是一个三个表(Categories,Products,Suppliers)的连接结果集合,算是复杂了,我们的目标就是使所有的字段都能更新到相应的表中。 
                </font></P>
            <LI> 
              <P class=boe_list><font color="#FFFFFF">注意“Tables”属性的写法,涉及三个表就罗列三个表! 
                </font></P>
            <LI> 
              <P 
        class=boe_list><font color="#FFFFFF">注意“KeyFieldList”属性的写法,三个表的关键字都要列上。如果你没有把supplierid了如的话,那么来自于suppliers表的字段就无法更新到suppliers表中了。 
                </font></P>
            </LI>
          </OL>
        </DIV></TD>
    </TR>
  </TBODY>
</TABLE>
<P class=boe_head4><font color="#FFFFFF">例三</font></P>
<P class=boe_code><font color="#FFFFFF">cnn=SQLCONNECT("northwind")<BR>
  SQLEXEC(cnn,"select orderid,productid,unitprice,quantity,discount from [order 
  details]","mycursor")<BR>
  SELECT mycursor<BR>
  CURSORSETPROP("Tables","[order details]","mycursor")<BR>
  CURSORSETPROP("KeyFieldList","orderid,productid","mycursor")<BR>
  CURSORSETPROP("UpdatableFieldList" ,"orderid,unitprice,quantity,discount","mycursor")<BR>
  CURSORSETPROP("UpdateNameList","orderid [order details].orderid,unitprice [order 
  details].unitprice,quantity [order details].quantity,discount [order details].discount","mycursor")<BR>
  CURSORSETPROP("SendUpdates" ,.t.,"mycursor")</font></P>
<TABLE width="74%" 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">这个结果集来自于一个表:Order Details。 
                </font></P>
            <LI> 
              <P class=boe_list><font color="#FFFFFF">注意“Tables”属性的写法,在SQL Server中这种带空格的表名请用方口号分隔,Tables属性指定的是数据源表,所以必须用:[order 
                details]填入。 </font></P>
            <LI> 
              <P class=boe_list><font color="#FFFFFF">注意“KeyFieldList”属性的写法,这个order 
                details表的主关键字是一个复合关键字,有orderid与productid联合组成,所以这里就要将他们一起填入。 </font></P>
            </LI>
          </OL>
        </DIV></TD>
    </TR>
  </TBODY>
</TABLE>
<P class=boe_head3><font color="#FFFFFF">一个很重要的属性——WhereType</font></P>
<P 
class=boe_text><font color="#FFFFFF">当我们设定结果集为可更新光标后,还有一个重要的属性没有设定,就是WhereType。即,Where字句产生的依据,有四种情况:</font></P>
<P class=boe_code><font color="#FFFFFF">CURSORSETPROP("WhereType" ,1)&nbsp; &amp;&amp;根据关键字<BR>
  CURSORSETPROP("WhereType" ,2)&nbsp; &amp;&amp;根据关键字+可更新字段<BR>
  CURSORSETPROP("WhereType" ,3)&nbsp;&nbsp; &amp;&amp;根据关键字+已更新字段<BR>
  CURSORSETPROP("WhereType" ,4)&nbsp;&nbsp; &amp;&amp;根据关键字+时间戳</font></P>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -