第二个灵魂 发表于 2015-1-16 22:26:21

ASP编程:使用ISAPI完成向数据库中增加纪录

由于ASP提供的是一对多的服务,所以用户的一些特殊需求很难得到满足。本文先容了用HTML(HypertextMakeupLanguage)编写界面、编写ISAPI(InternetServerApplicationProgrammingInterface)交互程序以完成向用MicrosoftSQLServer创建的数据库中增加纪录的办法。
  1、媒介
  MicrosoftSQLServer是一种可伸缩的、高功能的干系型数据库办理体系(RDBMS),它专为散布式客户机-服务器盘算情况而计划。它的内置数据复制功效、壮大的办理工具和开放式的体系系统布局为公布信息供应了一个出色的平台。它的内置数据复制功效为在全部构造机构内分发正确的信息供应了一个壮大且牢靠的体例,库中的数据不但能够复制给MicrosoftSQLServer数据库,也能够复制给ORACLE、IBMDB2、SYBASE和别的数据库。
  MicrosoftSQLServer为用户供应的内置数据复制功效--块拷贝程序(bcp)可在数据库办理体系之间迁徙数据,能将数据从文件拷贝到SQLServer中。这也就是说用户能够使用bcp把某一个文件中的数据内容增加到数据库中。可是bcp是一个可实行程序,必需在命令提醒符(如DOS)下运转它,这给Windows用户带来了极年夜的不便利;别的bcp命令有其固有的格局并带有很多参数,用户难于影象。我们开展了使用ISAPI完成向数据库中增加纪录的办法。这类办法用HTML编写用户输出文件名的界面,用ISAPI作交互程序。在ISAPI中经由过程ODBC(OpenDatabaseConnectivity)与SQLServer库毗连。用户只需在HTML界面中输出文件名,文件中的数据内容就被便利地增加到指定的表中。此办法克制了bcp命令的弱点。本文先容了用ISAPI完成向中药数据库中增加纪录的办法,并给出了数据库表的创建办法、数据文件的格局、ISAPI次要程序、输出数据文件名界面的HTML文件格局等。
2、数据库表的创建
  布局化查询言语SQL(StructuralQueryLanguage)是干系数据库体系的一种初级言语,它是在七十年月末由IBM公司的SanJose研讨实行室开辟的,现巳被很多干系型数据库办理体系所接纳,并被美国国度尺度局认定为一种产业尺度的干系数据库查询言语。它具有壮大的数据保护和查询功效,是一种可事情在多用户体系上的数据子言语。它的命令语句相似于英语句子,用户利用起来非常便利、易于了解。以下是用MicrosoftSQLServer创建的"CMT1"表举例:
  
  CREATETABLECMT1
  (
  ZY00varchar(20)NOTNULL,
  ZY01varchar(50)NOTNULL,
  ZY02textNULL,
  ZY03varchar(80)NOTNULL,
  ZY04textNULL,
  ZY05varchar(100)NOTNULL,
  ZY06varchar(9)NOTNULL,
  ZY07varchar(5)NOTNULL,
  ZY08varchar(2)NOTNULL
  )
3、数据文件格局
  以下是向中药数据库表CMT1中增加纪录的数据文件格局:
  ZY00(中药中文名):{三七}
  ZY01(中药中文名汉语拼音(年夜写)):{SANQI}
  ZY02(中药中文别号):{人参三七,田七,盘龙七(四川),金不换(江西)}
  ZY03(中药英文名):{Sanchi}
  ZY04(中药英文别号):{}
  ZY05(中药拉丁名):{RadixNotoginseng}
  ZY06(中药材独一码):{MMH35002A}
  ZY07(中药年夜辞典编码):{00096}
  ZY08(功能种别):{18}
  上述数据文件中,只要"{"和"}"标记之间的字符被增加到中药数据库表CMT1的响应数据域中,"{"之前的字符用于给编写数据文件的用户予于提醒,在ISAPI程序中可完成只取"{"和"}"之间的字符,疏忽"{"前的提醒字符及"{"和"}"字符等。
4、ISAPI使用程序的编写
  我们使用SQL语句可嵌进在使用程序中的特性,把SQL的有关哀求语句嵌进在ISAPI交互程序中。ISAPI交互程序用VisualC++编写,以下是完成向中药数据库的表CMT1中增加纪录的次要程序段:
  
  //创建一个CZY类的成员函数FileWrite1Entry,完成向中药数据库的表CMT1中增加纪录
voidCZY::FileWrite1Entry(CHttpServerContext*pCtxt,LPTSTRpstrFileName)
{
  constunsignedREC_NUM=1;  //REC_NUM(数据文件中纪录个数)
  constunsignedLINE=9;    //LINE(表中数据域的个数)
  constunsignedCOLUMN=6000;  //COLUMN(每一个数据域中字符的最年夜个数)
  charc,data;
  FILE*fp;
  StartContent(pCtxt);    //HTML头格局
  WriteTitle(pCtxt);      //HTML题目
  CstringstringSql;
  CstringstrQuery;
  CstringstrOutput;
  CstringpstrZY00,pstrZY01,pstrZY02,pstrZY03,pstrZY04,pstrZY05,
      pstrZY06,pstrZY07,pstrZY08;
  //以"读"的体例翻开文件名为pstrFileName的文件
  if(!(fp=fopen(pstrFileName,"r")))
  {
    *pCtxt  <<"<center><fontcolor=red>Warning:</font>Cannotopenthisfile.</center>";
    return;
  }
  //从文件中读取数据
  for(intk=0;k<REC_NUM;k++)
  {
    for(intI=0;I<LINE;I++)
    {
      //疏忽"{"之前的申明性字符
      do{
        c=getc(fp);
      }while(c!={);
      //读取"{"和"}"之间的字符数据
      for(intj=0;j<COLUMN;j++)
      {
        c=getc(fp);
        if(c==})
        {
          data=;
          break;
        }
        elseif((c==)||(c==
)||(c=={))
        {
          j--;
        }
        else
        {
          data=c;
        }
      }
    }
  }
  fclose(fp)
  //把从文件中读取的数据赋给响应的字符型变量
  pstrZY00=data;
  pstrZY01=data;
  pstrZY02=data;
  pstrZY03=data;
  pstrZY04=data;
  pstrZY05=data;
  pstrZY06=data;
  pstrZY07=data;
  pstrZY08=data;
  //创立数据库工具
  Cdatabasedb;
  //确认数据
  if(  !strcmp(pstrZY00,NULLSTRING)||!strcmp(pstrZY01,NULLSTRING)||
    !strcmp(pstrZY03,NULLSTRING)||!strcmp(pstrZY05,NULLSTRING)||
    !strcmp(pstrZY06,NULLSTRING)||!strcmp(pstrZY07,NULLSTRING)||
    !strcmp(pstrZY08,NULLSTRING)  )
  {
    *pCtxt  <<"<br><center>"
        <<"PleasebecertaintoenteryourZY00,ZY01,ZY03,ZY05,ZY06,ZY07,ZY08.
"
        <<"Thankyou."
        <<"</center>";
    return;
  }
  //格局化增加纪录的前提
  strQuery.Format("ZY00=%-.20s",pstrZY00);
  //翻开数据库工具,假如此工具不存在就加入
  if(!db.Open(ZyDB,//lpszDSN
    FALSE,//bExclusive
    FALSE,//bReadOnly
    CONNECTSTRING,//lpszConnect
    FALSE))//bUseCursorLib
  {
    *pCtxt<<"Couldnotopenthedatabase.";
    return;
  }
  //创立RECOREDSET类的数据库表工具
  CZyCMT1rsZy(&db);
  //指定格局化的增加纪录的前提给表工具
  rsZy.m_strFilter=strQuery;
  //翻开表工具,假如不克不及翻开就CATCH非常处置
  try
  {
    if(rsZy.Open(Crecordset::dynaset))
    {
      //假如想增加的纪录已存在于数据库的表中,就给出IDS_ONFILE中包括的反应信息
      if(!rsZy.IsBOF())
      {
        strOutput.Format(IDS_ONFILE,pstrZY00,SCRIPTPATH);
      }
      else
      {
        //机关拔出纪录语句
        stringSql.Format("InsertintoCMT1(ZY00,ZY01,ZY02,ZY03,ZY04,ZY05,ZY06,"
          "ZY07,ZY08)VALUES(%-.20s,%-.50s,%s,%-.80s,%s,"
"%-.100s,%-.9s,%-.5s,%-.2s)",pstrZY00,pstrZY01,pstrZY02,pstrZY03,pstrZY04,pstrZY05,pstrZY06,pstrZY07,pstrZY08);
        //实行拔出纪录命令。假如乐成给出IDS_THANKYOU中包括的反应信息,
        //不然CATCH非常处置
        try
        {
          db.ExecuteSQL(stringSql);
          strOutput.Format(IDS_THANKYOU,pstrZY00,SCRIPTPATH);
        }
        catch(CDBException*pEX)
        {
          TCHARszError;
          if(pEX->GetErrorMessage(szError,sizeof(szError)))
            strOutput.Format(IDS_EXCEPTION,szError,SCRIPTPATH);
          else
            strOutput.Format(IDS_UNKNOWN,SCRIPTPATH);
        }
      }
    }
    else
      //假如数据库表工具不克不及翻开,给出IDS_UNKNOWN中包括的反应信息
      strOutput.Format(IDS_UNKNOWN,SCRIPTPATH);
  }
  catch(CDBException*pEX)
  {
    TCHARszError;
    if(pEX->GetErrorMessage(szError,sizeof(szError)))
      strOutput.Format(IDS_EXCEPTION,szError,SCRIPTPATH);
    else
      strOutput.Format(IDS_UNKNOWN,SCRIPTPATH);
  }
  rsZy.Close();    //封闭表工具
  db.Close();    //封闭数据库
  //给用户显现反应的信息
  *pCtxt<<strOutput;
  EndContent(pCtxt);  //HTML尾格局
} 
  编译好的ISAPI静态毗连库程序将其置于/Scripts目次中。/Scripts是交互程序的假造目次。它可经由过程WWW服务办理器来设定。当WWW第一次被安装时,缺省的ISAPI可实行的假造目次是/Scripts。
5、输出数据文件名界面的编写
  HTML文件是在一般文本中拔出HTML标识符,WWW扫瞄器经由过程辨认HTML文件中的标识符,依照HTML文件中的标识符所指定的格局显现文件。上面给出向中药数据库表CMT1中增加纪录的输出数据文件名界面的HTML详细写法,此文件取名为FileWrite1.html。
<html>
<bodybgcolor="white">
<center>
<h2><p><fontcolor="#FF0000">加纪录到中药表一</font></p></h2>
<hr>
<h3>请输出文件名:</h3>
<formaction="/scripts/Zy.dll?FileWrite1Entry"method="post">
<p><inputname="FileName"size=40></p>
<inputtype="submit"value="提交">
<inputtype="reset"value="重置">
</form>
</center>
</body>
</html>
  在Netscape或InternetExplorer的URL中键进http://webserver/FileWrite1.html,个中webserver是服务器名或服务器的域名,屏幕上就会显现输出数据文件名的界面,依据界面提醒在表栏中输出数据文件名,提交后反应信息在客户真个显现
6、结论
  我们开展的使用ISAPI向数据库中增加纪录的办法不必要在DOS提醒符下举行任何操纵。别的,我们的数据文件中可包括为编写数据文件的用户到场的提醒字符,提醒字符其实不会到场到数据库中,而MicrosoftSQLServer的bcp命令没法选定疏忽数据文件中的任何字符,只能把数据文件中的一切数据拷贝到数据库中。同时,后者需在DOS提醒符下操纵。
  使用ISAPI作交互程序不但可完成收集数据库查询,并且可对数据库中的纪录举行操纵(增加、修正、删除等)。跟着WindowsNT利用的提高,ISAPI的使用局限将会愈来愈普遍。
楼上说交互性不好,太牵强了吧。在微软提供的一套框架中,利用asp做网站,开发效率高,使用人数少,减少不必要的开销。交互性是互动方式,是有开发人员决定的。

海妖 发表于 2015-1-19 09:33:56

交流是必要的,不管是生活还是学习我们都要试着去交流,通过交流我们可以学到很多我们自己本身所没有的知识,可以分享别人的经验甚至经历。

金色的骷髅 发表于 2015-1-24 12:06:31

接下来就不能纸上谈兵了,最好的方法其实是实践。实践,只能算是让你掌握语言特性用的。而提倡做实际的Project也不是太好,因为你还没有熟练的能力去综合各种技术,这样只能使你自己越来越迷糊。

爱飞 发表于 2015-2-1 10:17:22

不是很难但是英文要有一点基础网上的教程很少有系统的详细的去买书吧,另不用专门学习vb关于vbscript脚本在asp教材都有介绍

飘飘悠悠 发表于 2015-2-7 03:26:46

跟学别的语言一样,先掌握变量,流程控制语句(就是ifwhileselect)等,函数/过程,数组

蒙在股里 发表于 2015-2-20 07:38:40

我想问如何掌握学习节奏(先学什么再学什么)最好详细点?

莫相离 发表于 2015-3-6 16:49:45

下面简单介绍一下我学习ASP的方法,希望对想学习ASP的朋友有所帮助...

仓酷云 发表于 2015-3-13 04:18:27

接下来就不能纸上谈兵了,最好的方法其实是实践。实践,只能算是让你掌握语言特性用的。而提倡做实际的Project也不是太好,因为你还没有熟练的能力去综合各种技术,这样只能使你自己越来越迷糊。

愤怒的大鸟 发表于 2015-3-20 12:39:28

尽管MS自己讲C#内核中更多的象VC,但实际上我还是认为它和Java更象一些吧。首先它是面向对象的编程语言,而不是一种脚本,所以它具有面向对象编程语言的一切特性,比如封装性、继承性、多态性等等,这就解决了刚才谈到的ASP的那些弱点。
页: [1]
查看完整版本: ASP编程:使用ISAPI完成向数据库中增加纪录