C++操作Sql Server--操纵句柄初始化及列相关信息查询

目录

前置知识:

Sql操作句柄:

sql表中列信息查询:

查询所有列信息

查询指定名称的列的信息


前置知识:

Sql操作句柄:

        由于每条由 codeblocks 环境传送到 SQL SERVER 环境的语句都需要进行句柄的初始化操作,因此将这一函数独立出来,减少代码的重复性,实现代码的重用。
参数说明:
        const string& conteol:数据库操纵语言

/** 初始化SQLExecDirext()句柄,每次操作(增删查改)都需要。*/
bool man_sql::init_SED(const string &control)
{
    ret=SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt);
    ret=SQLExecDirect(stmt,(SQLCHAR *)(control.c_str()), SQL_NTS);
    if(ret==SQL_SUCCESS||ret==SQL_SUCCESS_WITH_INFO)  return 1;
    else return 0;
}

sql表中列信息查询:

  • 查询所有列信息

参数表:
        const string & tablename:执行查询操作的表名
        vector<int>& len:查询结果(各列列长)存储位置
        int &col_num:表中列的数量的返回位置
执行功能:
        查询数据库某表所有列对应的列长信息并存储至数组中。
返回值:
        返回 1:查询执行成功且结果已经保存至指定位置(len 传参)。
        返回 0:查询过程出错。
         (失败原因分析:建议检查传参 tablename)

bool man_sql::getlength(const string & tablename, vector<int>&len, int &col_num)
{
    string info="select a.max_length from sys.columns a inner join sys.objects b on a.object_id = b.object_id where b.name=\'";
    info+=tablename+"\'";
    //初始化句柄
    if(init_SED(info)==0)
    {
        cout<<"数据库查询时出错!"<<endl;
        return 0;
    }
    //初始化对应变量
    col_num=0;
    char length[N];
    SQLLEN str_len1;
    //执行查询并逐列扫描存储起来
    ret=SQLBindCol(stmt, 1, SQL_C_CHAR, length, sizeof(length), &str_len1);
    while( (ret=SQLFetch(stmt))!=SQL_NO_DATA_FOUND )
    {
        if(ret==SQL_ERROR)
        {
            cout<<"查询结果存储时出错"<<endl;
            return 0;
        }
        else
        {
            len.push_back(0);
            sscanf(length, "%d", &len[col_num++]);
            if(len[col_num-1]==3) len[col_num-1]=20;
        }
    }
    return 1;
}
  • 查询指定名称的列的信息

 参数表:
        const string& tablename:执行查询操作的表名     
        vector& colname:执行查询的各列的列名数组     
        vector& len:查询结果(各列列长)存储位置
执行过程:
        查询名为 tablename 表中的指定列的列宽信息。
返回值:
        返回 1:查询执行过程所求列对应列长信息并有序存储至对应数组。
        返回 0:查询过程出错。 (失败原因分析:建议检查传参 tablename,colname)

bool man_sql::getlength(const string&tablename, vector<string>&colname, vector<int>&len)
{
    string info="SELECT b.max_length FROM sys.tables a join sys.columns b on b.object_id = a.object_id join INFORMATION_SCHEMA.COLUMNS c on b.name=c.COLUMN_NAME and a.name=c.TABLE_NAME where a.name=\'";
    info+=tablename+"\' and b.name in (\'";
    for(vector <string>::iterator iter=colname.begin(); iter<colname.end(); iter++)
    {
        info+=*(iter)+"\'";
        if(iter+1<colname.end()) info+=",\'";

        else info+=")";
    }
    //初始化句柄
    if(init_SED(info)==0)
    {
        cout<<"数据库查询时出错!"<<endl;
        return 0;
    }
    //初始化对应变量
    int col_num=0;
    char length[N];
    SQLLEN str_len1;
    //执行查询并逐列扫描存储起来
    ret=SQLBindCol(stmt, 1, SQL_C_CHAR, length, sizeof(length), &str_len1);
    while( (ret=SQLFetch(stmt))!=SQL_NO_DATA_FOUND )
    {
        if(ret==SQL_ERROR)
        {
            cout<<"查询结果存储时出错"<<endl;
            return 0;
        }
        else
        {
            len.push_back(0);
            sscanf(length, "%d", &len[col_num++]);
            if(len[col_num-1]==3) len[col_num-1]=20;
        }
    }
    return 1;
}

~本系列后续文章将在本文章介绍的句柄初始化以及列信息查询函数的基础上,对增、删、查、改相关的操作函数进行进一步介绍。~

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C语言中连接SQL Server数据库,需要使用ODBC API。以下是连接数据库的基本步骤: 1. 安装ODBC驱动程序:在连接SQL Server之前,需要安装Microsoft SQL Server ODBC驱动程序。可以从Microsoft官网下载适用于所需操作系统版本的驱动程序。 2. 初始化ODBC环境:在连接数据库之前,需要初始化ODBC环境。可以使用ODBC API中的SQLAllocHandle函数来分配ODBC环境句柄。 3. 连接数据库:使用ODBC API中的SQLConnect函数连接数据库。需要指定数据库名称、用户名和密码等连接参数。 4. 执行SQL语句:使用ODBC API中的SQLExecDirect函数执行SQL语句。可以执行SELECT语句来查询数据,也可以执行INSERT、UPDATE和DELETE语句来修改数据。 5. 关闭连接:使用ODBC API中的SQLDisconnect函数关闭与数据库的连接。 以下是一个简单的示例代码,演示如何连接SQL Server数据库: ``` #include <stdio.h> #include <sql.h> #include <sqlext.h> int main() { SQLHENV env; // ODBC环境句柄 SQLHDBC dbc; // ODBC连接句柄 SQLRETURN ret; // ODBC函数返回值 // 初始化ODBC环境 ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env); ret = SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0); // 连接数据库 ret = SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc); ret = SQLConnect(dbc, (SQLCHAR*)"myserver", SQL_NTS, (SQLCHAR*)"myuser", SQL_NTS, (SQLCHAR*)"mypassword", SQL_NTS); // 执行SQL语句 SQLCHAR* query = (SQLCHAR*)"SELECT * FROM mytable"; HSTMT stmt; ret = SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt); ret = SQLExecDirect(stmt, query, SQL_NTS); // 处理查询结果 SQLCHAR name[50]; SQLINTEGER age; while (SQLFetch(stmt) == SQL_SUCCESS) { SQLGetData(stmt, 1, SQL_C_CHAR, name, sizeof(name), NULL); SQLGetData(stmt, 2, SQL_C_LONG, &age, 0, NULL); printf("%s\t%d\n", name, age); } // 关闭连接 ret = SQLDisconnect(dbc); ret = SQLFreeHandle(SQL_HANDLE_DBC, dbc); ret = SQLFreeHandle(SQL_HANDLE_ENV, env); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值