在window下的Mysql基本操作以接口的方式封装并提供出来,C++多线程操作

最近刚刚需要同时用到 mysql和多线程,网上mysql和多线程的教程很多,但是能同时使用的资料没找到,不过通过网上的这些的资料,写了个demo来理解和理顺自己这几天的学习,分享一下。
Mysql_Base.h
01  #include
02  #include
03 
04  #include
05  #include
06  #include  
07  #include
08  #include
13  #define NUM_THREADS 5
14 
15  typedef   struct  parameters_1{
16      char  order[ 60 ];
17      char  T_name[ 20 ];
18      int  id;
19  para_1;
20 
21  typedef   struct  parameters_2{
22      char  order[ 60 ];
23      //char dbname[20];
24      int  id;
25  para_2;
26  class  MYSQL_BASE
27  {
28  private :
29      static   int  p_thread;
30      static  MYSQL mysql[ 5 ];
31      static  MYSQL_RES *res;        //查询结果集,结构类型
32      //static MYSQL_FIELD *fd;     //包含字段信息的结构
33      static  MYSQL_ROW row;        //存放一行查询结果的字符串数组
34      static   char  sqlbuf[ 60 ];     //存放Mysql指令的字符串
35      static   char  usename[NUM_THREADS][ 20 ];
36      static   char  password[NUM_THREADS][ 20 ];
37      static  HANDLE _Thread[ 5 ];
38      static  CRITICAL_SECTION g_cs; //临界区
39      //static HANDLE Mutex;
40 
41 
42      static  para_1 f_para;
43      static  para_2 s_para;
44 
45  public :
46     MYSQL_BASE();
47     ~MYSQL_BASE();
48 
49  public :
50      void  Mysql_Start( char  mysqlname[ 20 ], char  mypwd[ 20 ], char  order[ 60 ], char  daname[ 20 ]);
51 
52  private :
53      static  DWORD WINAPI  Database_Order( void  *para); //(char dbname[20],void *id);    
54      static  DWORD WINAPI  Table_Order( void  *para); //(char dbname[20],char order[60],void *id);
55      static   void  ShowResult(MYSQL sql);
56 
57  };

Mysql_Base.cpp
001  #include "Mysql_Base.h"
002  #include
003  using   namespace   std ;
004 
005  //静态变量的初始化
006  MYSQL   MYSQL_BASE :: mysql [ NUM_THREADS ];
007  MYSQL_RES   * MYSQL_BASE :: res ;
008  MYSQL_ROW   MYSQL_BASE :: row ;
009  char   MYSQL_BASE :: usename [ NUM_THREADS ][ 20 ];
010  char   MYSQL_BASE :: password [ NUM_THREADS ][ 20 ];
011  int   MYSQL_BASE :: p_thread   =   0 ;
012  HANDLE   MYSQL_BASE :: _Thread [ 5 ];
013  CRITICAL_SECTION   MYSQL_BASE :: g_cs ;
014 
015  para_1   MYSQL_BASE :: f_para ;
016  para_2   MYSQL_BASE :: s_para ;
017  //HANDLE MYSQL_BASE::Mutex;
018 
019  //FILE *stream;
020 
021  MYSQL_BASE :: MYSQL_BASE ()
022  {
023       InitializeCriticalSection ( & g_cs );
024       //res = new MYSQL_RES;
025  }
026  MYSQL_BASE ::~ MYSQL_BASE ()
027  {
028       //mysql_close(&mysql);
029  }
030 
031  void   MYSQL_BASE :: Mysql_Start ( char   mysqlname [ 20 ], char   mypwd [ 20 ], char   order [ 60 ], char   Tname [ 20 ])
032  {
033 
034       mysql_init ( & mysql [ p_thread ]);
035       //Mutex = CreateMutex(NULL,FALSE,NULL);
036      
037       //para_2 s_para;
038       for (;  p_thread   <</span> NUM_THREADS;)
039     {
041             strcpy(usename[p_thread],mysqlname);
042             strcpy(password[p_thread],mypwd);
043 
044             strcpy(s_para.order,order);
045             strcpy(f_para.order,order);
046             s_para.id = p_thread;
047             f_para.id = p_thread;
048             strcpy(f_para.T_name,Tname);
049 
050             if (((memcmp(order,"create d",8))==NULL)||((memcmp(order,"show d",6))==NULL)||((memcmp(order,"drop d",6))==NULL))//对数据库的操作
051             {
052                 _Thread[p_thread] = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)MYSQL_BASE::Database_Order,&s_para,0,NULL);
053             }
054             if ((memcmp(order,"create t",8)==NULL)||(memcmp(order,"show t",6)==NULL)||(memcmp(order,"insert",6)==NULL)
055                 ||(memcmp(order,"update",6)==NULL)||(memcmp(order,"delete",6)==NULL)||(memcmp(order,"select",6)==NULL)
056                 ||(memcmp(order,"drop t",6)==NULL))//对表的操作
057             {
058                 _Thread[p_thread] = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)MYSQL_BASE::Table_Order,&f_para,0,NULL);
059             }
060             //sleep(2);
061             //CloseHandle(_Thread[p_thread]);
062             //p_thread++;
063             return;
064             //ResumeThread(Thread_1);
065 
066     }
067 }
068 
069 DWORD WINAPI  MYSQL_BASE::Database_Order(void *para)
070 {    
071     //DWORD dw = WaitForSingleObject(_Thread[p_thread],INFINITE);
072     //printf("%d\n",dw == WAIT_OBJECT_0);
073     EnterCriticalSection(&g_cs);
074     para_2 *c_para = (para_2*)para;
075     //sprintf(sqlbuf,CREATE_QUERY,dbname);
076     if (mysql_real_connect(&mysql[c_para->id], "localhost", usename[c_para->id], 
077         password[c_para->id],NULL, 0, NULL, 0== NULL{
078             printf("Error %u: %s\n", mysql_errno(&mysql[c_para->id]), mysql_error(&mysql[c_para->id]));
079             exit(1);
080     }
081     if (!strncmp(c_para->order,"create d",8))
082     {
083         if (mysql_query(&mysql[c_para->id], c_para->order))
084         {
085             printf("Error %u: %s\n", mysql_errno(&mysql[c_para->id]), mysql_error(&mysql[c_para->id]));
086             exit(1);
087         } 
088         else
089         {
090             printf("Create a database successfully!\n");
091             mysql_query(&mysql[c_para->id], "show databases;");
092             ShowResult(mysql[c_para->id]);
093         }
094     }
095     if (!strncmp(c_para->order,"drop d",6))
096     {
097         if (mysql_query(&mysql[c_para->id], c_para->order))
098         {
099             printf("Error %u: %s\n", mysql_errno(&mysql[c_para->id]), mysql_error(&mysql[c_para->id]));
100             exit(1);
101         } 
102         else
103         {
104             printf("delete a database successfully!\n");
105             mysql_query(&mysql[c_para->id], "show databases;");
106             res = mysql_store_result(&mysql[c_para->id]);
107             int num_fields = mysql_num_fields(res);
108             while ((row = mysql_fetch_row(res)))
109             {
110                 for(int i = 0i <</span> num_fieldsi++)
111                 {
112                     printf("%s ", row[i] ? row[i] : "NULL");
113                 }
114                 printf("\n");
115             }
116             mysql_free_result(res);
117         }
118     }
119     if (!strncmp(c_para->order,"show d",6))
120     {
121         if (mysql_query(&mysql[c_para->id], c_para->order))
122         {
123             printf("Error %u: %s\n", mysql_errno(&mysql[c_para->id]), mysql_error(&mysql[c_para->id]));
124             exit(1);
125         } 
126         ShowResult(mysql[c_para->id]);
127 
128     }
129     
130     //mysql_close(&mysql);
131     LeaveCriticalSection(&g_cs);
132     CloseHandle(_Thread[c_para->id]);
133     p_thread++;
134     //ReleaseMutex(_Thread[p_thread]);
135     return p_thread;
136     
137     //return 1;
138 }
139 
140 DWORD WINAPI  MYSQL_BASE::Table_Order(void *para)
141 {
142     //WaitForSingleObject(Mutex,INFINITE);
143     EnterCriticalSection(&g_cs);
144     para_1 *m_para = (para_1*)para;
145     //printf("%d,%s\n",m_para->id,m_para->order);
146     if (mysql_real_connect(&mysql[m_para->id], "localhost", usename[m_para->id], 
147         password[m_para->id],m_para->T_name, 0, NULL, 0== NULL{
148             printf("Error %u: %s\n", mysql_errno(&mysql[m_para->id]), mysql_error(&mysql[m_para->id]));
149             exit(1);
150     }
151 
152     if (mysql_query(&mysql[m_para->id], m_para->order)) {
153         printf("Error %u: %s\n", mysql_errno(&mysql[m_para->id]), mysql_error(&mysql[m_para->id]));
154         exit(1);
155     }
156     if ((strncmp(m_para->order,"select",6))==NULL||(strncmp(m_para->order,"show",4))==NULL)
157     {
158         ShowResult(mysql[m_para->id]);
159     }
160     if ((strncmp(m_para->order,"create t",8))==NULL)
161     {
162         printf("Create a database successfully!\n");
163         mysql_query(&mysql[m_para->id], "show tables;");
164         ShowResult(mysql[m_para->id]);
165     }
166     if ((strncmp(m_para->order,"drop t",6))==NULL)
167     {
168         printf("delete a database successfully!\n");
169         mysql_query(&mysql[m_para->id], "show tables;");
170         ShowResult(mysql[m_para->id]);
171     }
172     if ((strncmp(m_para->order,"insert",6))==NULL)
173     {
174         printf("insert a data successfully!\n");
175         //char in_order[60];
176         //sprintf(in_order,"select * from s%",m_para->T_name);
177         //mysql_query(&mysql[m_para->id], in_order);
178         //ShowResult(mysql[m_para->id]);//表格插入操作之后的可视化工作不好做
179     }
180     //mysql_close(&mysql);
181     //ReleaseMutex(Mutex);
182     LeaveCriticalSection(&g_cs);
183     p_thread++;
184     return p_thread;
185 }
186 
187 void MYSQL_BASE::ShowResult(MYSQL sql)
188 {
189     res = mysql_store_result(&sql);
190     int num_fields = mysql_num_fields(res);
191     while ((row = mysql_fetch_row(res)))
192     {
193         for(int i = 0i <</span> num_fieldsi++)
194         {
195             printf("%s ", row[i] ? row[i] : "NULL");
196         }
197         printf("\n");
198     }
199     mysql_free_result(res); 
201 }
204 int main()
205 {
206     //pthread_t tids[NUM_THREADS];
207     MYSQL_BASE *mysql_base = new MYSQL_BASE;
208     char dbname[20],passwd[20],order[60],dataname[20];
209 
210         printf("Please provide a screen name and password:\n");
211         strcpy(dbname,"root");
212         strcpy(passwd,"2175");
213         //gets(dbname);
214         //gets(passwd);
215         printf("Please enter a MYSQL order and mysql name when needed:\n");
216     while(1)
217     {
218         gets(order);
219         gets(dataname);
220         //strcpy(order,"show databases;");
221         //strcpy(dataname,"");
222         mysql_base->Mysql_Start(dbname,passwd,order,dataname);
223         //sleep(2);
224     }
227     return 0;
228 }
数据库的某些操作的可视化没有做好,比如说insert。关于多线程的保护开始选择了互斥量,但是后来还是换成了更容易理解的临界区,静态变量一定要初始化,这里放在了.cpp文件的开头,其实数据库的很多操作都是互通的,所以不用每个操作都写成函数,所以我分成了两类,一类是对数据库的操作,一类是对数据库中表的操作,主要是因为链接函数的参数问题,也对mysql理解不够,相信绝对是用一个函数来代替的,分类也显得很代码很笨重。下面是运行后的截图(我把用户名和密码写死了):
在window下的Mysql基本操作以接口的方式封装并提供出来,C++多线程操作

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值