2012年3月4日星期日

c++和c#访问mysql的简单代码示例


贴一份示例代码。
1) C#访问mysql
using System;
using System.Collections.Generic;
using System.Text;

using MySql.Data.MySqlClient;
using System.Data;
using System.Data.Common;

namespace SybaseUtilTest
{
    class Program
    {
        // http://bugs.mysql.com/47422
        static void testDataAdapter()
        {
            try
            {
                MySqlClientFactory factory = MySqlClientFactory.Instance;
                DbConnection conn = factory.CreateConnection();
                conn.ConnectionString = string.Format("server={0};user id={1}; password={2}; database={3}; port={4}; pooling=false",
                            "localhost", "root", "passwd", "test", 3306);
                conn.Open();

                DbDataAdapter da = factory.CreateDataAdapter();

                da.SelectCommand = conn.CreateCommand();
                da.SelectCommand.CommandText = "select * from t12345";


                da.DeleteCommand = conn.CreateCommand();
                da.DeleteCommand.CommandText = "delete from t12345 where id = @id";

                DbParameter param = factory.CreateParameter();
                param.ParameterName = "@id";
                param.DbType = DbType.Int32;
                param.SourceColumn = "id";
                param.SourceVersion = DataRowVersion.Current;

                da.DeleteCommand.Parameters.Add(param);
                da.DeleteCommand.UpdatedRowSource = UpdateRowSource.None;

                DataTable dt = new DataTable("t12345");
                da.Fill(dt);

                int index = 0;
                foreach ( DataRow o in dt.Rows )
                {
                    if (o["id"].Equals(4))
                    {
                        Console.WriteLine(String.Format("index={0}, to delete id = 4, col2 = {1}" , index, o["col2"]));
                        break;
                    }
                    index++;
                }
                dt.Rows[index].Delete();
                da.Update(dt);
                dt.AcceptChanges();

                da.Dispose();
                conn.Close();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Source + " "
                    + ex.Message + " "
                    + ex.StackTrace);
            }
            
        }
        
        static void Main(string[] args)
        {
            testDataAdapter();
        }
    }
}

  
2) C++访问:
#include <iostream>
#include <windows.h>
#include <mysql.h>
#include <string>
static const char host[32] = "localhost";
static const char user[32] = "test";
static const char passwd[32] = "passwd";
static const char db[32] = "test";
/**
mysql> select * from t;
+----+
| id |
+----+
|  1 |
+----+
1 row in set (0.00 sec)
mysql> delimiter //
mysql> create procedure get_t(in t1 int)
    -> begin
    -> select id from t where id=t1;
    -> end
    -> //
Query OK, 0 rows affected (0.05 sec)
mysql> call get_t(1);
    -> //
+----+
| id |
+----+
|  1 |
+----+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
*/
void test_more_results(MYSQL* h)
{
    char str[512] = "insert into test_num values(101);insert into test_num values(122);commit;";
    int r = mysql_real_query(h, str, strlen(str));
    if (r)
    {
        const char * error = mysql_error(h);
        std::cout<<"*** Connection Error " << error << std::endl;
    }
    do
    {
        MYSQL_RES* res = mysql_store_result(h);
        mysql_free_result(res);
    }
    while ( (0 == mysql_next_result(h)) );
    
}
void test_proc_stmt(MYSQL* h)
{
    MYSQL* mysql_ = h;
    MYSQL_BIND          bind;
    MYSQL_BIND          obind[1];
    // test_more_results(mysql_);
    MYSQL_STMT *hStmt = mysql_stmt_init(mysql_);
    my_bool true_value= 1;
    mysql_stmt_attr_set(hStmt, STMT_ATTR_UPDATE_MAX_LENGTH, (void*) &true_value);    
    char sql[] = "call get_t(?)";
    //char sql[] = "select id from t where id=?";
    if (mysql_stmt_prepare(hStmt, sql, strlen(sql)))
    {
        std::cout<<__LINE__<<": stmt prepare error:  "<< (mysql_stmt_error(hStmt))<<std::endl;
        mysql_stmt_reset(hStmt);
        if (mysql_stmt_prepare(hStmt, sql, strlen(sql)))
        {
            std::cout<<__LINE__<<": stmt prepare error:  "<< (mysql_stmt_error(hStmt))<<std::endl;
            mysql_close(mysql_);
            exit( -1);
        }
    }
    int id = 1;
    unsigned long id_len = 0;
    memset(&bind, 0, sizeof(bind));
    bind.buffer_type = FIELD_TYPE_LONG;
    bind.buffer = (void*)&id;
    bind.is_unsigned = true;
    bind.length = &id_len;
    // bind[0].buffer_length = sizeof(id);
    // bind[0].is_null = 0;
    
    if (mysql_stmt_bind_param(hStmt,(MYSQL_BIND*)(&bind)) != 0)
    {
        std::cout<<__LINE__<<": stmt prepare error:  "<< (mysql_stmt_error(hStmt))<<std::endl;
        mysql_close(mysql_);
        exit( -1);
    }
    if (mysql_stmt_execute(hStmt) != 0)
    {
        std::cout<<__LINE__<<": stmt prepare error:  "<< (mysql_stmt_error(hStmt))<<std::endl;
        mysql_close(mysql_);
        exit( -1);
    }
    int t2;
    memset(obind, 0, sizeof(obind));
    obind[0].buffer_type= MYSQL_TYPE_LONG;
    obind[0].buffer= (char *)&t2;
    obind[0].buffer_length = sizeof(t2);
    
    if (mysql_stmt_bind_result(hStmt, (MYSQL_BIND*)&obind[0]) != 0)
    {
        std::cout<<__LINE__<<": stmt prepare error:  "<< (mysql_stmt_error(hStmt))<<std::endl;
        mysql_close(mysql_);
        exit( -1);
    }
    if ( mysql_stmt_store_result(hStmt) != 0 )
    {
        std::cout<<__LINE__<<": stmt prepare error:  "<< (mysql_stmt_error(hStmt))<<std::endl;
        mysql_close(mysql_);
        exit( -1);
    }
    
    
    int rows = mysql_stmt_num_rows(hStmt);
    for (int i=0; i<rows; i++)
    {
        if (mysql_stmt_fetch(hStmt) == 0)
        {
            std::cout<<"id = "<<t2<<std::endl;
        }
    }
    mysql_stmt_free_result(hStmt);
    mysql_stmt_close(hStmt);
}
//
// Just for demo only.
// 
int main()
{
    MYSQL*              mysql_ = NULL;
    MYSQL_RES*          result_ = NULL;
    MYSQL_ROW           row_;
    mysql_ = mysql_init(mysql_);
    // if (mysql_real_connect(mysql_, host, user, passwd, db, 3306, NULL, CLIENT_MULTI_STATEMENTS) == NULL)
    if (mysql_real_connect(mysql_, host, user, passwd, db, 3306, NULL, CLIENT_MULTI_STATEMENTS) == NULL)
    {
        const char * error = mysql_error(mysql_);
        std::cout<<"*** Connection Error " << error << std::endl;
        return -1;
    }
    mysql_autocommit(mysql_, false);
    std::string encodeStr = "set names 'gbk'";
    mysql_real_query(mysql_, encodeStr.c_str(), encodeStr.size());
    
    /*
    const char* tmpTableName = "t";  // assume you are querying the table 't'
    char str[512];
    int cnt = 0;
    sprintf(str,"select count(*) as cnt from %s", tmpTableName);
    mysql_real_query(mysql_, str, strlen(str));
    result_ = mysql_store_result(mysql_);
    while (row_ = mysql_fetch_row(result_))
    {
        // get the field value
        if (row_[0])
        {
            std::cout<<"count = "<<row_[0]<<std::endl;
            // convert it into int
            cnt = atoi(row_[0]);
            std::cout<<"cnt value = "<<row_[0]<<std::endl;
        }
    }
    mysql_free_result(result_);
    test_more_results();
    */
    test_proc_stmt(mysql_);
    
    do
    {
        MYSQL_RES* res = mysql_store_result(mysql_);
        mysql_free_result(res);
    }
    while ( (0 == mysql_next_result(mysql_)) );
    
    test_proc_stmt(mysql_);
    mysql_close(mysql_);
    return 0;
}

oracle10g server for win32的简装版(共50M)

本文为原创,如若转载本文,请尊重个人劳动,务必附上本文链接地址:
http://hi.baidu.com/hexiong/blog/item/70c00a7bd40392f80ad1870a.html 
作者:iihero@CSDN, hexiong@baidu

下载地址:
http://download.csdn.net/source/2405299 
http://download.csdn.net/source/2405301 

上一次整理这种工具已经是4年以前了。
重新弄了一下。原理比较简单。
1. 只要DB server所需要的主要目录及文件
2. 使用一个批处理文件一次性安装,无需安装程序.
3. 安装或携带非常方便, 尤其是对开发人员而言

有时间再试验11g for win32上的。以下是readme。
(免责声明): 
这是一个精简版的oracle10g for windows 32平台.
此压缩包,仅供学习研究使用,本文作者不负任何责任。切不可将其用于商业用途,请遵守
Oracle公司相关商业规定。如因私自将其用于商业用途,由此带来的法律纠纷或其它问题,
概与本人无关.
author: iihero@CSDN  (iiihero AT hotmail.com, iihero AT qq.com)

0. 如果你已经安装了别的版本的oracle,
请自行备份注册表:[HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE], 这样即算有冲突,
你也可以重新导入以前的注册项而得已恢复

1. 将压缩包解压至目录,设该目录值为: <D>
其下将有目录:
<D>/oracle/*
<D>/oracle/10.1.0

2. 新的ORACLE_HOME将为:<D>/oracle/10.1.0
运行完iihero.ora10g.bat安装完以后,(一个批处理一次安装全部完成)
你需要将<D>/oracle/10.1.0/BIN添加到path里头
缺省的ORACLE_SID为iihero

3. 安装完以后,别忘了添加环境变量ORACLE_SID=iihero以及将%ORACLE_HOME%/bin
添加到PATH环境变量里头,在这之后,
即可使用sqlplus system/manager进入并修改密码,执行相关操作。

欢迎大家试用,如果发现有什么问题,可以与本人联系。

Ultraedit使用技巧小结


来自我在百度上的同名短文。作者:hexiong 
版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
http://hi.baidu.com/hexiong/blog/item/f9bbf01f3a4c1ef4e0fe0bdf.html
从Ultraedit8.0一直使用到现在,感觉这个东东确实不错。现将一些基本的经验总结如下,与大家共享;欢迎有兴趣的朋友前来补充。
Tip 0: 没有注册码,如何有效使用Ultraedit呢?
很多人立即想到使用crack版,可实际追究起来,那是违法的事情。实际上,Ultraedit并没有把路子完全堵死。我们可以使用一些小技巧来屏蔽掉这个问题。
修改ultraedit的快捷方式,将命令行改为:E:/uedit9/UEDIT32.EXE p:,其中p:必须是你的机器上不存在的分驱,这样,就不会有试用时间结束的问题了。

Tip 1: 如何去掉所编辑文本中包含特定字符串的行? 
这则技巧是在UltraEdit的帮助文件里提到.CTRL+R 调出来替换(Replace)窗口,选中"使用正则表达式";然后用查找 %*你的字符串*^p 替换成空内容即可.如,我当前有个文本文件,需要去掉所有包含 http://www.baidu.net/ 这个字符串的行,查找 %*http://www.baidu.net/*^p 替换成空即可.注意,^p 是 DOS 文件类型的换行符.如果是 Unix 类型文件,则用 ^n.
Tip 2: 如何在行末添加特定字符,比如逗号?
有了上面的经验(其实我第一次是从同事那里学到的),CTRL+R 调出来替换(Replace)窗口,选中"使用正则表达式".然后可以查找 ^p(或者^n,如果是Unix 文件),用 ,^p(或者,^n)进行"全部替换"即可.补充一点,如果是 MAC(Apple) 类型文件,则换行符号为 ^r .
Tip 3: 如何删除空行?
参考上面两个例子,查找 ^p$ 然后替换为空即可.
看来,正则表达式需要学习一下喽.
Tip 4: 编辑文件如何加入时间戳 ?
F7 快捷键即可.你试试看?

Tip 5: 为何 拷贝(Copy)/粘贴(Paste)功能不能用了?
不怕大家笑话,我有几次使用 UltraEdit 的过程中发现拷贝与粘贴的内容是不匹配的.不知所以然,干脆重新启动了笔记本.今天翻看手册才恍然大悟:UltraEdit有10个剪切板(clipboard),分别用Ctrl+0 - Ctrl+9 切换. Ctrl+0 是 Windows 的,其他则为用户自定义的.我在使用的过程中错调用了 CTRL+n, 结果内容就有问题了.你遇到过没?
Tip 6: 即使是打开小文件也有迟延?
这是我遇到过的问题.每次打开文件的时候总有几秒钟的耽搁.我的机器性能可不算差.怎么回事? 网络打印机搞得鬼! 打开"高级"->"设置"->"编辑器"->"高级",看看是不是选中了"载入/恢复打印机设置"?如果是的话,去掉(不同的版本/汉化与否可能该位置所在有差别).
Tip 7: 删除当前行内容 CTRL+e
Tip 8: 你按一下快捷键ALT+c试试,变为列编辑模式,可以一次输入多行内容,只要你选好行范围,编辑整齐的数据表非常合适。

Tip 9: 光标位于某一行,按Ctrl+F2试试,有了标签了,多设几个,按住F2,它会往你设定的标签处跳来跳去,很好玩。

Tip 10: 暂时没想出来,有兴趣的前来补充。
更多内容整理中......

embedded_mysql:成功实验程序实现Embedded MySQL Server启动(C/C++)


今天,碰巧有人问,说写的代码server_init,老是失败,我不信,试了一番,大费周折,总算成功。
有兴趣的,不妨自己动手一试,蛮有意思的。
我机器上原本有一个解压缩版的MySQL5.0.9,位于D:/program/mysql-5.0.9-beta-win32,默认存储引擎是InnoDB
1. 为便于测试,首先建立一个测试表,并插入几条记录,引擎定为MyISAM
create table t2(id int primary key, col2 varchar(32)) engine=MyISAM;

2. 创建Embed Server的配置文件,
D:/program/mysql-5.0.9-beta-win32/Embedded/my.ini,值得一提的是,差点把我害惨了,就是Server那一项的名字必须与你的Server程序的名字保持一致。这里,EmbedMySQLServer就是我后边的exe程序的名,否则server永远也启不来。
内容如下:
[EmbedMySQLServer]
basedir = D:/program/mysql-5.0.9-beta-win32
datadir = D:/program/mysql-5.0.9-beta-win32/data
language = D:/program/mysql-5.0.9-beta-win32/share/english
skip-innodb
port=3306
[libmysqld_client]
language = D:/program/mysql-5.0.9-beta-win32/share/english
port=3306

3. 开始写自己的代码了
create EmbedMySQLServer.exe, source code like:

  1. // #define _WIN32_WINNT 0x0400
  2. #include <windows.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <stdarg.h>
  6. #include "mysql.h"
  7. MYSQL *mysql;
  8. MYSQL_RES *results;
  9. MYSQL_ROW record;
  10. #pragma comment(lib, "D://program//mysql-5.0.9-beta-win32//Embedded//DLL//debug//libmysqld.lib")
  11. static char *server_options[] = { "mysql_test""--defaults-file=D:/program/mysql-5.0.9-beta-win32/Embedded/my.ini" };
  12. int num_elements = sizeof(server_options)/ sizeof(char *);
  13. static char *server_groups[] = { "EmbedMySQLServer""libmysqld_client" };
  14. int main(void)
  15. {
  16.    int ret = mysql_server_init(num_elements, server_options, server_groups);
  17.    printf("return %ld/n", ret);
  18.    mysql = mysql_init(NULL);
  19.    mysql_options(mysql, MYSQL_READ_DEFAULT_GROUP, "libmysqld_client");
  20.    mysql_options(mysql, MYSQL_OPT_USE_EMBEDDED_CONNECTION, NULL);
  21.    MYSQL* t = mysql_real_connect(mysql, NULL,"test","test""test", 0,NULL,0);
  22.    
  23.    mysql_query(mysql, "SELECT id, col2 FROM t2");
  24.    results = mysql_store_result(mysql);
  25.    while((record = mysql_fetch_row(results))) {
  26.       printf("%s - %s /n", record[0], record[1]);
  27.    }
  28.    mysql_free_result(results);
  29.    mysql_close(mysql);
  30.    mysql_server_end();
  31.    return 0;
  32. }
4. 最终运行结果:
return 0
1 - test
2 - test
3 - test
4 - test
5 - fdas
Press any key to continue

像这类东东,MySQL Online Doc都没好好说,它都推荐买它的商业license,看来自己多动动手,也蛮有意思的。

windows平台下文本编辑器使用体会与总结

自工作以来,用过许多纯文本编辑器。以下是我对这些文本编辑器的体会与总结。 

1. gvim 与 Gnu Emacs 
免费。功能很强大。但是有时候命令不太好记。如果只是在windows下编程开发,不推荐使用它。但是如果经常在windows与Unix多平台下开发,那么,使用gvim和emacs无疑非常便利。 

2. ultraedit 
如果你的单位允许你使用盗版或者你只是个人使用,或者单位为你购买了这个东东,那么,使用它非常方便。至少打开大文件以及强大的16进制查看、列编辑,多种我样的宏及模板功能。基本上足够了。我现在只在自己个人的机器上一直保留着使用Ultraedit7/8两个版本。后续版本基本上不再关注。因为这两个版本对我来说,功能已经足够了。而在工作的机器上,则没有用它。 

3. SciTE 
这个编辑器,别看外表很一般,但经过适当配置以后,功能几乎完美。自行编译了1.7.9版本,我给它定制了一个自己工作的版本,用它来打开大文件,也非常便利,至少不会像notepad++那样,经常被搞死。这也是我把它排在第3的原因。 

4. Notepad++ 
用这个编辑器来编辑和查看源码还是蛮不错的。只是不适合用来打开大的文本日志文件,曾经给该编辑器的作者发过邮件提过此事,也不了了之,估计想优化不是很容易。目前还在用4.1.2版本,用了若干插件:函数列表,文本加密等 

5. TextPad 
它有一个免费试用版本,似乎过期了以后也能用。一般功能也够了。只是老弹出对话框,不太爽。 

6. EditPlus 
很多年前曾经用过,同样需要付费,遂弃之 

7. EmEditor等 
并不觉得如何好用。 

其实,适合自己的就是最好的。用起来方便就行。我用的编辑器,基本上没怎么升过级,因为它们够用,而且容量挺小。

Oracle公司的几位创始人

Oracle共有三位创始人。 
1. Larry Ellison 
   Oracle公司的老大, 不是年纪最大,而是资格最大。现在只剩下这个创始人还在Oracle了,而且是绝对的权威。不知道他如果退了,谁会去接盘。 

2. Robert Miner 
   1941.11.23 - 1994.11.11, 死得太早了。他是男的。毕业于伊立诺斯大学。不是网上有些文章乱传的,弄成个女的,还居然说曾是ellison的女上司(有点搞)。他在Oracle早期发展过程中起着非常关健的作用。如果Ellison算是大脑,他就算是公司的心脏。两人合作的非常好。 
   可惜死于癌症。留下三个子女。 

3. Edward Oates 
   1946-, 68年毕业于San Jose州立大学,这个学校应该很一般。1996年就从Oracle退休了。做了一些别的公司的董事和顾问。 

现在只剩下Ellison了,如果他离开了自己掌控的甲骨文,不知道将会是什么样子。

几大知名IT公司名字由来

微软、雅虎、Google都是我们整天在新闻中接触到的著名IT公司,可是你知道它们名字 
的由来吗?下面这篇有趣的文章一定能让你收获不少。(各公司排名不分先后,按首字 
母倒序排列……) 

       Yahoo! 

       《格列佛游记》的作者Jonathan Swift发明了yahoo这个单词。在小说里,它代 
表了一个在外表和行为举止上都令人厌恶的家伙,简直都不能算是一个人。Yahoo! 的创 
始人杨致远和David Filo选择这个名字的原因是他们觉得自己是yahoo。 

       另一种说法,Yahoo是“Yet Another Hierarchical Officious Oracle”的首字 
母缩写,不过David Filo和杨致远坚持他们选择这个名称的原因是他们喜欢字典里对ya 
hoo的定义:“粗鲁,不通世故,粗俗。” 

       Xerox 

       xer是希腊文字根,代表“干”。由于Chestor Carlson发明的产品是干式复印, 
和当时占优势的湿法复印有显著的差别,所以他用Xerox命名。 

      SUN Microsystems 

       由斯坦福大学的四个家伙创建。SUN 是“Stanford University Network”的首 
字母缩写。 

      Sony 

       来自sonus和sonny的组合。sonus是拉丁词,代表声音。sonny是美国俚语,用来 
称呼聪明伶俐的少年。 

       SAP 

       代表“Systems, Applications, Products in Data Processing”。四个IBM的 
前雇员组建了SAP。他们为IBM工作时属于的部门叫“Systems/Applications/Projects” 
。 

       Red Hat 

       公司创始人Marc Ewing念大学的时候,他祖父给了他一顶康奈尔曲棍球队的帽子 
,上面有着红色和白色的条纹。他不小心把帽子弄丢了,很希望找回来。红帽子Linux 
beta版的用户手册里面有一段话,央求用户如果找到了他的红帽子,请归还! 

       Oracle 

       Larry Ellison和Bob Oats曾经为美国中央情报局(CIA)的一个咨询项目工作。 
这个项目的代号就叫 Oracle(中文意思是神谕,圣贤。CIA希望这个系统能够解决一切问 
题,故如此命名)。 

       Motorola 

       创始人Paul Galvin是在公司开始生产车用无线电的时候让公司叫现在这个名字 
的。原先它叫Victrola。 

       Microsoft 

       Bill Gate起了这个名字。表示公司将专注于MICROcomputer SOFTware(微型计 
算机软件),原来叫做Micro-Soft,后来把中间的“-”去掉了。 

       Lotus 

       从莲花式盘坐(padmasana)中得名。创始人Mitch Kapor 曾经是Maharishi Ma 
hesh Yogi的超脱静坐教师。(译者注:Mahesh Yogi, Maharishi,印度宗教领袖。) 

       Intel 

       Bob Noyce和Gordon Moore想把他们的公司命名为“Moore Noyce”,可是这个名 
字已经为一家连锁旅馆注册了,因此就改成了INTegrated ELectronics(集成电子)的 
缩写。 

       Hewlett-Packard 

       创始人Bill Hewlett和Dave Packard丢硬币来决定他们的公司叫Hewlett-Packa 
rd还是 Packard-Hewlett。 

       Hotmail 

       创始人Jack Smith想出了最初的主意,要建立一种任何计算机都可以通过Web访 
问的电子邮件服务。当Sabeer Bhatia起草商业计划书的时候,他尝试了各种以mail结尾 
的名字,最后,他选择了Hotmail。因为Hotmail包含了“html” ——编写网页的语言。 
Hotmail最早的形式是HoTMaiL。注:微软在1998年以4亿美元的巨资收购Hotmail。 

       Google 

       名字来自于一个关于搜索引擎到底能搜索多少信息的夸张说法。最早它叫“Goo 
gol”,代表1后面跟100个0。创始人 Sergey Brin和Larry Page曾经向一位投资人演示他 
们的项目,最后他们收到了一张给“Google”公司的支票! 

       Cisco 

       这个名字不是什么缩写,而是San Francisco的最后五个字母。公司的徽标也和 
旧金山有所关联,是不是像极了金门大桥? 

       Apple Computers 

       Steve Jobs最喜欢的水果。该公司成立后三个月还没有名字,Jobs威胁同事,如 
果五点钟之前还找不到一个比“苹果电脑”更好的名字,那么公司就叫这个名字了。( 
难道其他人也喜欢吃苹果?) 

       Apache 

       创始人是从给NCSA httpd后台代码打补丁起家的。结果,他们得到了“A PAtCH 
y” server(打过补丁的服务器),于是,就叫Apache了。 

       Adobe 

       创始人John Warnock家后面有一条叫做Adobe Creek的河。