怎么在MYSQL中用C语言实现事务处理
mysql_options(&mysql,mysql_init_command,“ set autocommit = 0”);取消自动提交mysql_commit()提交事务MySQL_Rollback()卷回去交易!
mysql查询语句 C语言
#ifdef WIN32
#include 《windows.h》
#include 《odbcinst.h》
#include 《sqlext.h》
#else
#include 《mysql.h》
#include 《unistd.h》
#define SQLHANDLE static MYSQL
#endif
#include 《stdarg.h》
#include 《stdlib.h》
#include 《stdio.h》
#include 《string.h》
SQLHANDLE hDBEnv, hDBC;
int DB_Open(char * dbcn, char * usr, char * pwd)
{
int r;
#ifdef WIN32
r = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hDBEnv);
if(r) return 0;
r = SQLSetEnvAttr(hDBEnv,SQL_ATTR_ODBC_VERSION,
(void*)SQL_OV_ODBC3,0);
if(r) return 0;
r = SQLAllocHandle(SQL_HANDLE_DBC, hDBEnv, &hDBC);
if(r) return 0;
r = SQLConnect(hDBC,
(unsigned char *)dbcn, strlen(dbcn),
(unsigned char *)usr, strlen(usr),
(unsigned char *)pwd, strlen(pwd));
return r==SQL_SUCCESS || r==SQL_SUCCESS_WITH_INFO;
#else
mysql_init(&hDBC);
MYSQL * rx = mysql_real_connect(
&hDBC, dbcn, usr, pwd, NULL, 0, NULL, 0);
if(!rx) return 0;
return 1;
#endif
}//end DB_Open
int DB_Exec(char * sql)
{
#ifdef WIN32
SQLHANDLE hStatement = NULL;
SQLAllocHandle(SQL_HANDLE_STMT, hDBC, &hStatement);
SQLExecDirect(hStatement,(unsigned char *)sql, strlen(sql));
SQLCloseCursor(hStatement);
SQLFreeHandle(SQL_HANDLE_STMT, hStatement);
hStatement = NULL;
#else
mysql_real_query (&hDBC, sql, strlen(sql));
#endif
return 1;
}//end DB_Exec
int DB_Close(void)
{
#ifdef WIN32
SQLDisconnect(hDBC);
SQLFreeHandle(SQL_HANDLE_DBC, hDBC);
SQLFreeHandle(SQL_HANDLE_ENV, hDBEnv);
#else
mysql_close(&hDBC);
#endif
return 1;
}//DB_Close()
#ifndef WIN32
typedef struct tagMySQLRecordset {
MYSQL_RES * hRecord;
void * * row;
int * size;
int cols;
} MYSQLRecordset;
#endif
void DB_CleanQuery(void *hRecordset)
{
if(!hRecordset) return;
#ifdef WIN32
__try {
SQLCloseCursor(hRecordset);
SQLFreeHandle(SQL_HANDLE_STMT, hRecordset);
hRecordset = NULL;
}__finally{
return;
}//end try
#else
MYSQLRecordset * hRec = (MYSQLRecordset *) hRecordset;
mysql_free_result (hRec-》hRecord);
free(hRec-》row); hRec-》row = NULL;
free(hRec-》size); hRec-》size = NULL;
free(hRec); hRec = NULL;
#endif
}//end DB_CleanQuery
int DB_Next(void * hRecordset)
{
int r=0; if(!hRecordset) return 0;
#ifdef WIN32
r = SQLFetch(hRecordset);
r = r == SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO;
if(!r) {
DB_CleanQuery(hRecordset);
}//end if
#else
MYSQLRecordset * hRec = (MYSQLRecordset *) hRecordset;
MYSQL_ROW row = mysql_fetch_row (hRec-》hRecord);
if(row) {
for(int i=0; i《hRec-》cols; i++) {
memcpy(hRec-》row);
}//next i
r = 1;
}else{
DB_CleanQuery(hRecordset);
r = 0;
}//end if
#endif
return r;
}//end DB_Next
int DB_params_count(const char * fmt)
{
int i=0, j=0;
while(fmt) {
if(fmt==’%’) j++;
i++;
}//end while
return j;
}//end DB_params_count
void * DB_Query(char *sql, const char *fmt, ...)
{
int r=0;
int cols = DB_params_count(fmt);
if(cols《1) return NULL;
#ifdef WIN32
SQLHANDLE hStatement = NULL;
SQLAllocHandle(SQL_HANDLE_STMT, hDBC, &hStatement);
r = SQLExecDirect(hStatement,(unsigned char *)sql, strlen(sql));
r = r==SQL_SUCCESS || r == SQL_SUCCESS_WITH_INFO;
if(!r) {
return NULL;
}//end if
#else
r = mysql_real_query (&hDBC, sql, strlen(sql));
if(r) return NULL;
MYSQL_RES * rec = NULL;
rec = mysql_store_result (&hDBC);
if(!rec) return NULL;
MYSQLRecordset * hStatement
= (MYSQLRecordset *)malloc(sizeof(MYSQLRecordset));
if(!hStatement) return NULL;
memset(hStatement, 0, sizeof(MYSQLRecordset));
hStatement-》hRecord = rec;
hStatement-》cols = cols;
hStatement-》row = (void **)malloc(cols * sizeof(void *));
memset(hStatement-》row, 0, cols * sizeof(void *));
hStatement-》size = (int *)malloc(cols * sizeof(int));
memset(hStatement-》size, 0, cols * sizeof(int));
#endif
va_list ap; va_start(ap, fmt);
void * var; char buf;
int i=0,j=0,k=0,sz=0; char c=0;
int len = strlen(fmt); int bad=1;
#ifdef WIN32
int col=1;
#else
int col=0;
#endif
while(fmt) {
c = fmt;
if(c != ’%’) continue;
c = fmt;
var = va_arg(ap, void *);
if(c == ’d’) {
#ifdef WIN32
SQLBindCol(hStatement, col, SQL_C_SLONG, var, 4,NULL);
#else
hStatement-》row = var;
hStatement-》size = sizeof(long);
#endif
col++;
continue;
}//end if
if(c == ’f’) {
#ifdef WIN32
SQLBindCol(hStatement, col, SQL_C_FLOAT, var, 4,NULL);
#else
hStatement-》row = var;
hStatement-》size = sizeof(float);
#endif
col++;
continue;
}//end if
memset(buf, 0, 32); bad=1;
for(j=i-1; j《len; j++) {
c = fmt;
if(c》=’0’ && c《=’9’) buf=c;
if(c==’s’) {bad=0; k=j+1; break;}
}//next j
if(bad) return NULL;
sscanf(buf, “%d“, &sz);
#ifdef WIN32
SQLBindCol(hStatement, col, SQL_C_CHAR, var, sz, NULL);
#else
hStatement-》row = var;
hStatement-》size = sz;
#endif
col++;
i = k;
}//end while
va_end(ap);
return hStatement;
}//end DB_Rec
如何用C语言编一个密码生成器
C语言实现密码生成器,参考代码如下:
#include#include
#include
//const char lower_chars = “abcdefghijklmnopqrstuvwxyz“;
//const char upper_chars = “ABCDEFGHIJKLMNOPQRSTUVWXYZ“;
//const char number_chars = “0123456789“;
const char lower_chars = “abcdefghijkmnpqrstuvwxyz“; // no l or o
const char upper_chars = “ABCDEFGHJKLMNPQRSTUVWXYZ“; // no I or O
const char number_chars = “23456789“; // no 1 or 0
const char special_chars{};:’\“《》,.?/“;
const int _ks_pass_len = 17;
void mkpass(char pass)
{
int i = 0, j = 0, k = 0,n = 0;
n = _ks_pass_len/4;
for (; i 《 n; i++)
{
pass;
pass;
pass;
pass;
}
j = _ks_pass_len - 4*n;
for (i = 0; i《j; i++) {
pass;
}
//字符乱序
for (i = 0; i 《 32; i++)
{
j = rand()%(_ks_pass_len);
k = pass;
pass;
pass = k;
}
pass = ’\0’;
}
int _tmain(int argc, _TCHAR* argv)
{
srand(time(0));
char szPass;
for (int i=0; i《16; i++)
{
mkpass(szPass);
printf(“%s\n“,szPass);
}
return 0;
}《j; i++)