科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件Visual Stuido.NET扩展存储过程

Visual Stuido.NET扩展存储过程

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

进入正题前,首先请确认你电脑上已经安装了Microsoft VS.Net 2003和Microsoft SQL Server 2000

作者:isec 来源:CSDN 2007年11月9日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
第二步,从数据库中取得含二车站名的所有路线

  在扩展存储过程中连接数据库有两种方法,第一种请参见MS Sql Server ODS示例中的xp_dblib,这里只介绍第二种方法,采用SQL开头的一系列ODBC API.

  为了使用这些API,首先要在proc.cpp或者stdafx.h中加入#include .

  一次数据库连接的过程包括以下几个步骤:

  1、初始化ODBC连接,并分配环境句柄;

  2、设置环境;

  3、根据环境句柄分配数据库连接句柄;

  4、调用SQLDriverConnect连接MS SQL Serve数据源;

  5、分配和使用语句;

  6、调用SQLDisconnect断开连接;

  7、依次释放分配的句柄。

  直接用例子来说明,现在我们要从数据库中读取含此二车站名的所有路线,可以用下面的代码:

{
SQLHENV hEnv = SQL_NULL_ENV; // 环境句柄
SQLHDBC hDbc = SQL_NULL_HDBC; // 连接句柄
SQLHSTMT hStmt = SQL_NULL_HSTMT; // 语句句柄
SQLCHAR connStr[255] = "Driver={SQL Server};SERVER=localhost;UID=你的用户名;PWD=你的密码;DATABASE=Railway;";
// 分配环境句柄
SQLAllocHandle(SQL_HANDLE_ENV, NULL, &hEnv);
// 设置连接环境,ODBC版本设为3.x
SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);
// 根据环境分配连接句柄
SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDbc);
// 建立数据库连接
SQLDriverConnect(hDbc, NULL, connStr, SQL_NTS, NULL, 255, NULL, SQL_DRIVER_NOPROMPT);
// 根据连接分配语句句柄
SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hStmt);

// 定义查询语句query,别忘记#include <tchar.h>
TCHAR query[255] = "select Routes.TrainID, AllStations from Routes, Trains where Routes.TrainID=Trains.TrainID and AllStations like '%";
_tcscat(query, (TCHAR*)pbStart);
_tcscat(query, "%");
_tcscat(query, (TCHAR*)pbEnd);
_tcscat(query, "%'");
// 现在,query="select Routes…… like '%起点站%终点站%'",我们运行此查询
SQLExecDirect(hStmt, (SQLCHAR*)query, SQL_NTS);
// 获得查询所得的行数
UINT uiRowsCount; //结果集中的行数
SQLSetStmtAttr(hStmt, SQL_ATTR_ROWS_FETCHED_PTR), (void*)&uiRowsCount, sizeof(SQLINTEGER));
// 初始化结果集数组,包括两个:TrainID和AllStations
int *piTrainID = (int*)::malloc(uiRowsCount * sizeof(int));
PCHAR *ppcStations = (PCHAR*)::malloc(uiRowsCount * sizeof(PCHAR));

// 因为结果集中第一列,即TrainID为整型,长度不变,故可以直接绑定
SQLBindCol(hStmt, 1, SQL_INTEGER, (SQLPOINTER)piTrainID, sizeof(int), NULL);

// 取出第二列的数据,因为其长度不定,故必须先获得长度
SQLINTEGER lColLen; // 字符串的列,即AllStations长度
UINT nRow = 0; // 行标

while (SQLFetch(hStmt) == SQL_SUCCESS_WITH_INFO) //取出一行
{
// 获得长度
SQLGetData(hStmt, 2, SQL_CHAR, NULL, 0, &lColLen);
// 根据长度为第二列的数据分配空间
ppcStation[nRow] = ::malloc(lColLen);
// 获得数据
SQLGetData(hStmt, 2, SQL_CHAR, ppcStation[nRow], lColLen, &lColLen);
// 行标随行的Fetch递增
++nRow;
}
// 现在,我们就取出了所有TrainID和AllStations
// 关闭数据库连接,释放资源
SQLFreeHandle(SQL_HANDLE_STMT, hStmt);
SQLDisConnect(hDbc);
SQLFreeHandle(SQL_HANDLE_DBC, hDbc);
SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
}

  顺便说一句,到目前为止给出的两段代码,都是在方法RETCODE xs_TrainQuery(SRV_PROC*)中,加入这两段代码前,请先将项目自动生成的代码清空。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章