搜索文章:

首页  |  Java技术  |  Asp.net  |  Asp编程  |  VC/C++  |  Delphi  |  VB编程

利 用 ISAPI 实 现 向 数 据 库 中 添 加 记 录 (四)

4、isapi 应 用 程 序 的 编 写

   我 们 利 用 sql 语 句 可 嵌 入 在 应 用 程 序 中 的 特 点, 把 sql 的 有 关 请 求 语 句 嵌 入 在 isapi 交 互 程 序 中。 isapi 交 互 程 序 用 visual c++ 编 写, 以 下 是 实 现 向 中 药 数 据 库 的 表 cmt1 中 添 加 记 录 的 主 要 程 序 段:

  
   // 建 立 一 个 czy 类 的 成 员 函 数 filewrite1entry, 实 现 向 中 药 数 据 库 的 表 cmt1 中 添 加 记 录
void czy::filewrite1entry(chttpservercontext* pctxt, lptstr pstrfilename)
{
    const unsigned rec_num=1;    // rec_num(数据文件中记录个数)
    const unsigned line=9;        // line(表中数据域的个数)
    const unsigned column=6000;    // column(每个数据域中字符的最大个数)
    char c,data[line][column];
    file *fp;
    startcontent(pctxt);        //html头格式
    writetitle(pctxt);            //html标题
    cstring stringsql;
    cstring strquery;
    cstring stroutput;
    cstring pstrzy00,pstrzy01,pstrzy02,pstrzy03,pstrzy04,pstrzy05,
            pstrzy06,pstrzy07,pstrzy08;
    //以"读"的方式打开文件名为pstrfilename的文件
    if (!(fp = fopen (pstrfilename, "r")))
    {
        *pctxt    << "< center>< font color=red>warning: < /font>cannot open this file.< /center>";
        return;
    }
    //从文件中读取数据
    for(int k=0; k< rec_num; k++)
    {
        for(int i=0; i< line; i++)
        {
            //忽略"{"以前的说明性字符
            do{
                c=getc(fp);
            }while(c!={);
            //读取"{"和"}"之间的字符数据
            for(int j=0; j< column; j++)
            {
                c=getc(fp);
                if(c==})
                {
                    data[i][j]=\0;
                    break;
                }
                else if((c==\r)||(c==\n)||(c=={))
                {
                    j--;
                }
                else
                {
                    data[i][j]=c;
                }
            }
        }
    }
    fclose(fp)
    //把从文件中读取的数据赋给相应的字符型变量
    pstrzy00 = data[0];
    pstrzy01 = data[1];
    pstrzy02 = data[2];
    pstrzy03 = data[3];
    pstrzy04 = data[4];
    pstrzy05 = data[5];
    pstrzy06 = data[6];
    pstrzy07 = data[7];
    pstrzy08 = data[8];
    //创建数据库对象
    cdatabase db;
    // 确认数据
    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>"
                << "please be certain to enter your zy00,zy01,zy03,zy05,zy06,zy07,zy08. \r\n"
                < < "thank you."
                < < "< /center>";
        return;
    }
    // 格式化添加记录的条件
    strquery.format("zy00 = %-.20s", pstrzy00);
    // 打开数据库对象,如果此对象不存在就退出
    if(!db.open(zydb, //lpszdsn
        false, //bexclusive
        false, //breadonly
        connectstring, //lpszconnect
        false)) //busecursorlib
    {
        *pctxt < < "could not open the database.";
        return;
    }
    //创建recoredset类的数据库表对象
    czycmt1 rszy(&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("insert into cmt1 (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)
                {
                    tchar szerror[1024];
                    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)
    {
        tchar szerror[1024];
        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。

()

相关文章:
© 2006   www.java-asp.net