• Linux下用freetds执行SqlServer的sql语句和存储过程


      Windows下访问Sqlserver很方便,特别是用ADO,即便是用C++写代码,也没怎么感觉麻烦,如果是用C#的话,写起来估计更是飞一般的感觉,可现在我要处理的问题是在Linux下访问SqlServer,执行sql语句和存储过程……

      好,不废话了,下面开工。

    一、包含头文件

    #include <sybfront.h> //freetds

    #include <sybdb.h> //freetds 

    二、执行sql语句或存储过程

    1、查询类 

    1.1 核心代码:

    bool queryCmd(DBPROCESS *dbprocess,const char* strSql)
    {
        dbcmd(dbprocess,strSql);
        if(dbsqlexec(dbprocess) == FAIL)
        {
            printf("Query error.\n");
            returnfalse;
        }
        DBINT result_code;
        char infArr[MaxColumnNums][MaxColumnSize];
        int retCode = 1;
        while ((result_code = dbresults(dbprocess)) != NO_MORE_RESULTS)
        {
            if (result_code == SUCCEED)
            {
                int i=1;
                int sz = 0;
                while(true)
                {
                    //retCode = dbbind(dbprocess,i++, CHARBIND, (DBCHAR)0, (BYTE*)infArr[i]);
                    retCode = dbbind(dbprocess,i, CHARBIND, (DBINT)0, (BYTE*)infArr[i]);
                    if(retCode != 1) break;
                    i++;
                }
                sz = i;
                while (dbnextrow(dbprocess) != NO_MORE_ROWS)
                {
                    for(i=1; i<=sz; i++)
                    {
                        //printf("%s ",infArr[i]);
                        cout<<infArr[i]<<" ";//<<endl;
                        memset(infArr[i],0,sizeof(infArr[i]));
                    }
                    cout<<endl;
                }
            }
        }
        returntrue;
    } 

    1.2 直接执行Sql语句

    queryCmd(dbprocess, "select * from table"); 

    1.3 不带参数的存储过程 

    创建存储过程如下: 

    createproctestPro 

    as 

      select*fromstu; 

    go 

    调用如下:

    queryCmd(dbprocess, "exec testPro"); 

    1.4 带参数的存储过程 

    创建存储过程如下: 

    createprocgetPro1(@numint) 

    as

      select*fromstuwhereStuID=@num;

    go 

    调用如下:

    queryCmd(dbprocess, "exec getPro1 1003"); 

    2、更新类

    2.1 核心代码: 

    bool updateCmd(DBPROCESS *dbprocess,const char* strSql)
    {
        dbcmd(dbprocess,strSql);
        if(dbsqlexec(dbprocess) == FAIL)
        {
            printf("error : update fail\n");
            returnfalse;
        }
        returntrue;
    }

    2.2 直接执行sql语句

    updateCmd(dbprocess,"insert into stu(StuID, Name, Age) values(888,'Mike',24)");

    2.3不带参数的存储过程

    创建存储过程如下: 

    createprocdelPro1

    as

      deletefromstuwhereStuID=888

    go

    调用如下:

    updateCmd(dbprocess,"exec delPro1"); 

    2.4 带参数的存储过程

    创建存储过程如下: 

    createprocdelPro2(@numint)

    as

      deletefromstuwhereStuID=@num

    go 

    调用如下: 

    updateCmd(dbprocess,"exec delPro2 888"); 

    三、编译选项

    比如源文件为test2.cppfreetds的安装路径为usr/local/freetds ,则如下编译:

    g++ -g test2.cpp -o test2 -L/usr/local/freetds/lib -lsybdb -I/usr/local/freetds/include

    PS环境 freetds 0.91 + Sqlserver 2008

    好,就这些了,希望对你有帮助。

  • E-Mail : Mike_Zhang@live.com
  • 转载请注明出处,谢谢!
  • 相关阅读:
    64位整数乘法
    HTML中常见问题汇总贴
    题解 牛客【「水」悠悠碧波】
    题解 CF1391B 【Fix You】
    四级-句子
    快速幂||取余运算
    最大子列和
    JvavScript中的函数与对象
    JavaScript中的流程控制语句
    冒泡排序,选择排序,插入排序,归并排序
  • 原文地址:https://www.cnblogs.com/MikeZhang/p/useFreetdsAccessSqlServer2008.html
  • Copyright © 2020-2023  润新知