周星星 之 Blog

关注 ASM/C/C++

  VC知识库BLOG :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 登录 ::
  126 随笔 :: 25 文章 :: 2604 评论 :: 9 Trackbacks
<2004年12月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

News

留言簿(45)

随笔分类

随笔档案

文章分类

文章档案

相册

相关链接

搜索

最新评论

  • 1. 自创
  • 中国人的习惯是吃完了饭再付帐;洋人的习惯是先付帐后吃饭。
    于是餐馆老板想出了一个办法:
        与国际接轨:吃饭前先把饭钱付了;
        适应中国国情:吃完饭后付一次帐。
    这样一顿饭就可以收两次钱了。
  • --周星星
  • 2. re: windows下最好的C++ IDE
  • # re: windows下最好的C++ IDE 2008-05-18 14:58 xuebuyu 
    我试了最简单的程序,譬如只有一个std::cout << ..., printf (...), 发现vc2005产生的debug版本不能在没有.net framework下运行,而release可以
    ---------------------------------------------------------------------------
    debug版本也不需要的,可能是因为manifest文件的问题
  • --joe
  • 3. re: VS2005/VS2008 中64位数据引起的一个严重bug
  •  将 *(__int64*)(str+1) = *(__int64*)(str+0); 分解为
    *(__int32*)(str+5) = *(__int32*)(str+4);
    *(__int32*)(str+1) = *(__int32*)(str+0);
    就OK了

    看来关于__int64的赋值,编译的代码要根据两个变量地址来决定分解为两个__int32的操作的顺序
  • --mslk
  • 4. re: 网摘
  • 可惜中国人但对于羊显凶兽相,而对于凶兽则显羊相,所以即使显着凶兽相,也还是卑怯的国民。这样下去,一定要完结的。
    --- 《鲁迅警世名言录》
  • --周星星
  • 5. re: windows下最好的C++ IDE
  • 我在VC6.0里装了ICC,能正常使用.之前类模板的局部特化现在能编译通过了.但是在类声明里对静态数据成员初始化还是编译不过啊??
  • --keke
  • 6. re: 网摘
  • --周星星
  • 7. 自创
  • 两兄弟A和B,特穷,大哥A每次都忍饥挨饿却把B喂饱。
    长大后A瘦得像根杆,风一吹就倒;B却发育得很好,连吹3天牛屄也不累。

    B:A那家伙就是基因不好,人品不好,好吃懒做……,所以我现在身强力壮,他却赢弱得很,满身是病,快挂了。拖我家后腿呀!
    A:如果不是当年我把吃的留给你,你小子能油光满面,脑满肠肥,而我能在发育期间饿得营养不良,现在快挂了吗?
    B:当年我吃了你多少,现在我10倍还给你,看你能不能变得和我一样强壮?
    A:<气死了>
  • --周星星
  • 8. 杨辉三角(随便写的,估计有更好的写法)
  • --周星星
  • 9. to allenm:
  • 谢谢大虾。

    “为什么用wubi安装而不是直接硬盘安装呢?”
    ------ 一来需要分区,有些麻烦;二来8.10有bug,硬盘安装时无法分区,google了一下,可行的方法有:
    a. 用光盘安装
    b. 把启动文件放另一块硬盘,或U盘上。(a的原理其实和这个一样)
    c. 到分区时,先反挂载ISO所在分区
  • --周星星
  • 10. re: ubuntu8.10安装记
  • 囧,刚才没有看完你的文章就发评论了,现在发现很多我说的你已经解决了,另外说明一下你貌似还没有解决的上GTALK和MSN的问题吧,用系统自带的pidgin就可以了,这两个都可以上的,另外QQ也可以上,如果不可以上的话你可以去腾讯官网下载DEB包。
  • --allenm
  • 11. re: ubuntu8.10安装记
  • 你是刚开始用Ubuntu吧,其实这个很好用的,只是刚开始的时候你还不太适应罢了,为什么用wubi安装而不是直接硬盘安装呢?可以装个双系统啊,而且Ubuntu带的grub会直接找到你的windows分区,启动的时候可以选择。因为cd盘容量比较小,所以带的简体中文语言实际上是不完全的,你现在也打不出中文吧,你可以在系统设置里面找到语言设置选项,选择简体中文,然后会提示你安装语言包,用系统自带的新力得更新工具就可以了。更新完后设置一下SCIM输入法就可以打出中文了。另外国内的比较好的源有cn99,这个据说速度比较快
  • --allenm
  • 12. Wicd
  • http://www.lirui.name/post/134.html
  • --周星星
  • 13. re: ubuntu8.10安装记
  • 阿帮兔的口碑还不错滴。
    只是安装后敲入gcc你会很失望。。。。
  • --HateMath
  • 14. re: ubuntu8.10安装记
  • 根据 http://tech.ddvip.com/2008-06/121290441645303.html 制得后的对比

  • --周星星
  • 15. re longinus:
  • 谢谢,现在终于成功了,不知不觉间我牙齿都咬出血了:)
  • --周星星
  • 16. re: ubuntu8.10安装记
  • 分区的问题我一个朋友也遇到了,当时也没解决,可能是硬盘驱动的问题

    不过他后来装opensuse了……
  • --longinus
  • 17. Intel之CMOV等价指令
  • --周星星
  • 18. re: 暂存
  • --周星星
  • 19. re: windows下最好的C++ IDE
  • 个人感觉作为C++程序员不要太拘泥于工具,还是专注一下语言本身的东西,而且我根据自身的项目经验,发现很多企业都逐渐开始跨平台的开发,可见跨平台是大势所趋,所以对自身的发展还是专注对语言本身和各种跨平台标准库的学习和使用。
  • --Wing
  • 20. 顺便问问LZ一个相关的问题
  • 如果一段代码里执行了很多循环
    foo()
    {
       for(i=0;...){}
       for(i=0;...){}
       ...
     }
    这时那种代码更合理呢? 偶个人感觉适合把int i;定义到循环外似乎更好些,不知对否?
  • --假骑士
  • 21. re: 再次随便说说,缓解一下看到此代码所带来的郁闷
  • 代码二的好处是循环后,变量temp就可以消失了。
    重复定义的问题,其实循环内,temp一直存在,不存在重复定义的问题。
    另,实测了一下,这两段代码在VC++6里面的时间效率基本一致。
  • --假骑士
  • 22. re: 编译期时立即数溢出
  • --100000
  • 23. re: 实时数据库的简介(初稿)
  • 杨,你好:

       能不能告知 PI软件的价格体系。
  • --Xian
  • 24. re: 疑难
  • 怎么做可以为众生带来最大的利益?
  • --向月
  • 25. re: 编译期时立即数溢出
  • 老大,你的这些问题,都是怎么发现的啊,是会程序的bug中吗,觉得你真牛B
  • --ricardo
  • 26. re: [zdd]的一道题
  • --jjnet
  • 27. re: 再次随便说说,缓解一下看到此代码所带来的郁闷
  • 其实这根本就没有意义,只是个人风格不同而已,对此我既不反对也不赞同星星的说法.

    例子:我喜欢将花摆在门边外面(左面),老婆喜欢把花摆在门边里面(右面).一好事之人,非要对此指指点点,一笑而置之不理!
  • --非法用户
  • 28. re: 佛学佳句
  • 南无阿弥陀佛!  ^_^
  • --meiko
  • 29. re: windows下最好的C++ IDE
  • 各位有听说过C-Free吗?国人的作品。

    我觉得还是很不错的,它能够支持很多种编译器,VC或者GCC等都可以。目前最新好像是4.0版.
  • --allen
  • 30. re jeffer:
  • :)避开VC的bug是一回事,VC有没有这个bug是另一回事。
  • --周星星
  • 31. re Dark:
  • your are right, thanks
  • --周星星
  • 32. re: VS2005/VS2008 中编译流程的一个严重bug
  • 试了一下,DEBUG方式编译是错了,但是Release编译倒是正确的
  • --Dark
  • 33. re: **
  • --jeffer
  • 34. re jeffer:
  • 每个人第一眼看到这代码自然会如你这样想,我一开始也认为是“未定义”行为。
    不过仔细对比一下,*(__int64*)(str+0) 对operator= 而言是个值,因此根本不存在所谓的重叠。

    如果不想被*(__int64*)(str+0)迷住了眼,那么写成
    __int64 tmp = *(__int64*)(str+0);
    *(__int64*)(str+1) = tmp;
    在VS200X的release下同样输出错误数据。
  • --周星星
  • 35. re: VS2005/VS2008 中64位数据引起的一个严重bug
  • 精典的搬石頭砸到自己 , 當來源和目標重叠.
    不能稱為bug, 這算是 沒定義, 寫碼自己要避免
    就好比
       memcpy( src , src+4 , 5);
       memcpy( src+4 , src , 5);
  • --jeffer
  • 36. 给ms发一个bug report吧
  • rt
  • --局部变量
  • 37. 求M数中取N数的排列组合
  • --周星星
  • 38. re: 计算24点的小程序(更新版)
  • 您好,我想请问一下24点的算法原理。是否能详细讲解一下,谢谢!
  • --妮妮
  • 39. re: 网摘
  • 1956年12月18日,国务院曾发出《关于今后在行文中和书报杂志里一律不用“满清”的称谓的通知》。通知原文如下:

    “满清”这个名词是在清朝末年中国人民反对当时封建统治者这一段历史遗留下来的称谓。在目前我国各民族已经团结成为一个自由平等的民族大家庭的情况下,如果继续使用,可能使满族人民在情绪上引起不愉快的感觉。为了增进各民族间的团结,今后各级国家机关、学校、企业,各民主党派,各人民团体,在各种文件、著作和报纸、刊物中,除了引用历史文献不便改动外,一律不要用“满清”这个名称。(见1986年南京大学出版社出版的《统一战线工作手册》)
  • --周星星
  • 40. re: gcc/mingw/libstdc简介
  • 非常之谢谢。。。
  • --以函
  • 41. szj 求助GDI+
  • Image image( L"D:\\boy3.jpg" );
    参数用CString strFilePath来代替怎么写
  • --szj
  • 42. re: [zdd]的一道题
  • 我觉得并不是return造成的。return的时候有一个析构是正常的。多出来的析构是在参数传递的时候多出来的。
    我猜想,没有copy constructor的时候

    foo(A()) 等价于 A a; foo(a);
  • --Justin Shen
  • 43. re: 取浮点数的整数部分(确实有点无聊,不喜欢就召回删除)
  • double a = 6.7f;
    double b = a * 10;
    int c = a * 10;
    int d = b;

    printf( "%d", c ); // 输出 67
    printf( "%d", d ); // 输出 66

    如果是double的刚好相反也。
  • --re: 取浮点数的整数部分
  • 44. re: 实时数据库的简介(初稿)
  • 谁有WPKS安装说明?
  • --YangJun
  • 45. 这鸡蛋真难吃
  • --周星星
  • 46. re: VS2005/VS2008 的一个严重bug
  • defined _CHAR_UNSIGNED
    255
    0
    char_max = 255
    char_min = 0

    为什么我的 VS2008 没有?

  • --Orez
  • 47. re: VS2005/VS2008 的一个严重bug
  • 但愿微软加油了
  • --REgicide
  • 48. re: VS2005/VS2008 的一个严重bug
  • 哦,确实是MS的严重BUG
  • --100000
  • 49. re: VS2005/VS2008 的一个严重bug
  • 不会吧,这都能错
  • --gaoqing000
  • 50. re: time_t 和 DATE 之间的相互转化
  • --yqever
  • 51. re: time_t 和 DATE 之间的相互转化
  • 嘿嘿,多谢。
    收藏了。
  • --yqever
  • 52. 判断strtoull是否溢出,errno=0是必要的
  • --周星星
  • 53. re: VS2005/VS2008 的一个严重bug
  • defined _CHAR_UNSIGNED
    255
    0
    char_max = 127
    char_min = 128


    visual studio 2008 sp1 居然还是这样的.
  • --test
  • 54. re: VS&G++ 重载operator delete的bug
  • 当不同堆栈,delete 一个 void* 进不了 Destructor
    如果操作是在 堆A里 new ,到堆 B 里 delete。
    那么 
    void operator delete( void* raw )
    。。。
    delete( (foo*)raw ); 
    delete( (int*)raw );   或者
    delete( (typename T*)raw );  模板 
  • --布伦特
  • 55. re pcasa:
  • 正常是正常了,可它完全不对了呀:)
    new operator 包含 operator new 和 construct
    delete operator 包含 destruct 和 operator delete
  • --周星星
  • 56. re: VS&G++ 重载operator delete的bug
  • --pcasa
  • 57. re: VS&G++ 重载operator delete的bug
  • this->operator new();

    MFC的做法是

    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
  • --布伦特
  • 58. re: VC2005调试器的一个小小bug
  • 貌似long long 出了问题,如果用*(unsigned __int64*)&a就能正常显示
  • --zdd
  • 59. re: windows下最好的C++ IDE
  • 我是菜鸟,听说SlickEdit2008很好用支持30种以上的语言..包括C/VC++但是不知用什么编译器好?...周大哥可以帮我解答一下吗..谢谢
  • --hn2008
  • 60. 我不认为 ‘靠’来源于 Wacko
  • 因为 wacko 在英文中很少做语气词,语气词是放在口边的,与句子无关的。如 fuck, damn, my god, my,  shit, 等等。

    he is a wacko person,  he is so wacko.  

    ‘靠’在中文里是语气词。对不上。

    问下年龄大的人,都知道在 80年代并没广泛使用这个语气词,而都是用 ‘操’。

    所以我认为 ‘靠’是 ‘操’的文雅化的变种。
  • --路过二

阅读排行榜

评论排行榜

OTL介绍:
OTL 是 Oracle, Odbc and DB2-CLI Template Library 的缩写,是一个C++操控关系数据库的模板库,最新 版本4.0.104,参见http://otl.sourceforge.net/,下载地址http://otl.sourceforge.net/otlv4_h.zip
优点:a. 跨平台
      b. 运行效率高,与C语言直接调用API相当
      c. 开发效率高,起码比ADO.net使用起来更简单,更简洁
      d. 部署容易,不需要ADO组件,不需要.net framework 等
缺点:
      a. 只有C++才可以使用她
      b. 说明以及范例不足(暂时性的)


总的说来,对于C++程序员而言,使用OTL操作关系数据库是最好的选择,其网站上有很多的范例,本人在这 里对使用OTL调用Oracle的存储函数(存储函数比存储过程多个返回值)作一个 示范,而其他的比如查询、更新、存储过程等就太简单了,直接看otl.sourceforge.net的范例

Oracle 存储函数 TEST 代码:
( a In Integer, b Out Integer, c in out Integer, d In Long ) Return Long
is
begin
    b := a;
    c := 2 * c;
    Return( '<' || d || '>' );
end;
说明:Oracle中的long不是C/C++中的长整型,而是varchar_long,对应着OTL中的otl_long_string,这是一 种很复杂的类型,本人就用它来举例。

C++调用TEST的代码:
#include <string>
#include <iostream>
//#define OTL_ORA9I // 使用这个宏就表示使用Oracle9i的API,而不是ODBC API
#define OTL_ODBC    // 使用这个宏就表示使用通用的ODBC API
#include "otlv4.h"
using namespace std;

void main( void )
{
    otl_connect::otl_initialize();
    try {
        otl_connect db;
        db.rlogon( "Driver={Microsoft ODBC for Oracle};Server=ZZZ;Uid=XXX;Pwd=YYY;" );
        // db.set_max_long_size(?); 如果varchar_long长 度非常长,超过默认值的话,你需要这一句

        otl_stream o( 1, "{ :E<varchar_long,out> = call TEST(  :A<int,in>,:B<int,out>,:C<int,inout>,:D<varchar_long,in&g t; ) }", db );
        o.set_commit(0);

        int a = 1;
        int b = 0;
        int c = 2;
        otl_long_string d( "abc", 0, 3 );
        otl_long_string e;
        o << a << c << d;
        o >> e >> b >> c;
        
        cout << "b = " << b   << '\n';
        cout << "c = " << c   << '\n';
        cout << "e = " << e.v << '\n';

        //db.commit();
        db.logoff();
    }
    catch( otl_exception& p ) {
        cerr << p.msg << "\n"
            << p.stm_text << "\n"
            << p.sqlstate << "\n"
            << p.var_info << "\n"
            << endl;
    }
}

说明:"{ :E<varchar_long,out> = call TEST(  :A<int,in>,:B<int,out>,:C<int,inout>,:D<varchar_long,in&g t; ) }"这一句中的A、B、C、D、E就是一个名字,随各人喜欢可写成其他任何名称。但这个格式需要注 意,它不是
"{ call :Name1<int,out> := function( Name2<int,in> }"
也不是
"{ call :Name1<int,out> \\:= function( Name2<int,in> }"
而是
"{ :Name1<int,out> = call function( Name2<int,in> }"
这一点和otl.sourceforge.net上的说明不一样。
posted on 2004-12-30 02:43 周星星 阅读(12553) 评论(22)  编辑 收藏

评论

# re: 使用OTL调用Oracle的存储函数 2004-12-30 09:43 非凡
星星也用上了OTL,感觉怎么样?

# re: 使用OTL调用Oracle的存储函数 2004-12-30 13:30 firingme
OTL和DTL都是ODBC Based的,感觉不好。用过DTL,很烦琐。DTL是模拟STL,而OTL是模拟iostream,都是C++的经典设计。不过都是没学到人家的精髓。

# re: 使用OTL调用Oracle的存储函数 2004-12-30 22:08 周星星
to 非凡:
^_^,感觉还不错,第一次使用OTL,第一次使用Oracle,第一次调用存储函数,但仍然算很顺利,其间问题主要出在Oracle身上。

to firingme:
从源代码上看OTL也可以直接调用Oracle和DB2的API,只要更改一个宏;DTL没听说过;“没学到人家的精髓”---有一点点赞同,我觉得otl_long_string设计得就有点不科学,呵呵!

# re: 使用OTL调用Oracle的存储函数 2005-01-03 07:30 firingme
这种东西,等boost的吧。其他人开发的,我不敢用。boost1.33里头已经加入了iostreams,相信马上针对数据库和网络的stream类型全部都要冒出来了……OTL和DTL的确不算什么好东西,我宁愿自己写几个简单的包装类用起来更舒坦。

# re: 使用OTL调用Oracle的存储函数 2005-01-05 23:42 cc5416
请问星星,你在windows底下用otl,都需要什么配置呀,我怎么编译可以通过,但运行出现
Error while trying to retrieve text for error ORA-12154

# to cc5416: 2005-01-06 00:31 周星星
不知道为什么,我什么也没有设置呀!

# re: 使用OTL调用Oracle的存储函数 2005-01-06 22:11 cc5416
在我的机器上#define OTL_ORA8I程序异常

只有使用#define OTL_ODBC才能运行

还有关于查询的,星星有没有好例子呀?
我怎么都调不通呢

# re: 使用OTL调用Oracle的存储函数 2005-01-06 22:42 cc5416
啊呀,原来是我在debug里忘记加ociw32.dll和oci.dll
所以o8i调不通哦

现在的问题是我不能用char[]接收,代码如下
otl_stream i( 50,
"SELECT user_id FROM subtotal_bill where month=12 and home_city = 592", db );

char f1[31];

while ( !i.eof() )
{
i>> f1 ;
cout << "f1=" << f1 << endl;
}
因为数据是15位的用数字型也无法正确显示

# re: 使用OTL调用Oracle的存储函数 2005-01-07 02:31 cc5416
唉呀...我的意思是如果数据类型为number(100)的要怎么查询,
我的机器上用long只能保存10位,long long就出错;
星星您是怎么做的呀
T_T

# re: 使用OTL调用Oracle的存储函数 2005-01-07 04:21 cc5416(愤怒的话梅)
汗自己,写出来了

# re: 使用OTL调用Oracle的存储函数 2005-01-21 00:38 BlueICE
我最反感一些人说别人的东西如何如阿不好,还不如自己如何如何,你能写出这样的创意的东西还公布源代码吗,你不行,至少你没有这样作过,那么你没有权利说这样的话。再者,也许你会作,但你会如此执着的写这样长的代码,我觉的作这样的工作值得我们尊敬,同样一些使用这个库的朋友link oci.lib都没有加,想想我们国家的计算机水平,当然我也曾经这样。所以我们没有什么理由说如何如何,如果你觉得不好,只能证明你没有好好的去用,OciClasses你用过吗,这个东西比起OTL可以说差远了,但CodeGuru的网上还有很多人感谢OciClasses的作者!谦虚,一些未尝不是一件好事!

# re: 使用OTL调用Oracle的存储函数 2005-02-25 19:45 七猫的垃圾箱
to:firingme
写好后能OPEN吗?我很期待,因为我觉得在方便上,DTL和OTL都很方便了,虽然DTL效率可能是有些问题,不过既然DTL全基于ODBC,效率不会成为瓶颈,





OTL是使用的ORACLE和DB2的原生API,ODBC的支持是后来才加入的,一个头文件5万多行吧,可以去看看此人简历。

# re: 使用OTL调用Oracle的存储函数 2005-05-28 20:59 程映


还是可以的哈
真的
我就是不知道函数
你可以告诉我不呀
这样学习它呀





# 请教如何把取出的字段都以字符串输入 2005-08-16 13:40 吴春福
我现在用otl从oracle取出数据,但由于收到的sql语句是动态的,所以我无法先确定字段的属性,请教各位高人,如何把取出的字段都以字符串输入

我从一些网站上找到一些如下的代码,但看不懂,请教有没有中文解释改类的使用及参数的使用

otl_stream i;

i.set_all_column_types(otl_all_num2str );

gdb.set_max_long_size(20000);    //read long longraw

string f1;

char f2[200];

string f10;

otl_value<otl_datetime> f3;

otl_column_desc* desc;

int desc_len;

i.open(1, sqlstr.c_str(),gdb);

desc=i.describe_select(desc_len);


# re: 使用OTL调用Oracle的存储函数 2005-09-12 15:54 sinall
楼上的,说明都在这里啊:
http://otl.sourceforge.net/
不能再详细了……

# re: 使用OTL调用Oracle的存储函数 2006-02-09 17:28 雅木
现在要写一个程序同时连接oracle 7\8\9,由于几乎都是基于oci的,而3个版本的oci的dll和lib是不一样的,所以不知道该怎么做了,请楼上的各位大哥,大伸援手,不吝赐教.~~


# re: 使用OTL调用Oracle的存储函数 2006-03-10 11:56 allen
otl_connect::otl_initialize();
db.rlogon("allen/allen@192.168.10.142"); // connect to Oracle

为什么我执行到db.rlogon的时候,会提示ORA-12535: TNS:operation timed out

# re: 使用OTL调用Oracle的存储函数 2006-03-28 13:43 小山坡
otl_stream类构造函数的第一参数otl_stream(const int arr_size,
这个参数有什么作用?详细一点

# re: 使用OTL调用Oracle的存储函数 2006-03-28 16:34 小山坡
otl的例子1中
create table test_tab(f1 number, f2 varchar2(30))
insert into test_tab values(:f1<float>,:f2<char[31]>)

为何insert语句中 :f1<float> 中只能是float,不能是int, double, 
long?????

# re: 使用OTL调用Oracle的存储函数 2006-07-10 11:24 lulu
OTL是完全免费的吗?

# re: 使用OTL调用Oracle的存储函数 2007-06-01 14:09 dayn9
感觉......他咋就不像做数据库的呢?

标题  
姓名  
主页
验证码 *
内容   
  登录  使用高级评论  Top
[使用Ctrl+Enter键可以直接提交]