SQL预处理SQL_STMT_*的使用和含义

来源:互联网 发布:2016年淘宝会员数量 编辑:程序博客网 时间:2024/06/18 09:36
typedef struct st_mysql_bind{  unsigned long*length;          /* output length pointer */  my_bool       *is_null;  /* Pointer to null indicator */  void*buffer;  /* buffer to get/put data */  /* set this if you want to track data truncations happened during fetch */  my_bool       *error;  unsigned char *row_ptr;         /* for the current data position */  void (*store_param_func)(NET *net, struct st_mysql_bind *param);  void (*fetch_result)(struct st_mysql_bind *, MYSQL_FIELD *,                       unsigned char **row);  void (*skip_result)(struct st_mysql_bind *, MYSQL_FIELD *,      unsigned char **row);  /* output buffer length, must be set when fetching str/binary */  unsigned long buffer_length;  unsigned long offset;           /* offset position for char/binary fetch */  unsigned long length_value;     /* Used if length is 0 */  unsigned intparam_number;  /* For null count and error messages */  unsigned int  pack_length;  /* Internal length for packed data */  enum enum_field_types buffer_type;/* buffer type */  my_bool       error_value;      /* used if error is 0 */  my_bool       is_unsigned;      /* set if integer type is unsigned */  my_boollong_data_used;  /* If used with mysql_send_long_data */  my_boolis_null_value;    /* Used if is_null is 0 */  void *extension;} MYSQL_BIND;

此结构体可以用来作为软解析传入值,也可以用来作为传出结果的载体

在此结构体存储的都是函数指针和char类型的C语言里最小基础类型作为bool类型(节省内存,方便内存对齐)

在未来C语言的发展中,C语言是可以用面相对象的思想来解决问题的,而且依靠C语言强大的直接操作内存的特性

和面向对象的设计的高效性,能更好更深入的解决问题。代价就是处理相同的问题相对于其他语言而言需要消耗大量的时间而且容易出现错误


在C语言面向对象思想中 成员变量可以看作是基本存储数据类型

    成员函数指针可以看作是类的成员函数

    函数调用就是将数据放入到函数模板中处理

    在C++java中,函数是不占用内存的。是用来处理数据的一个模板。

    和这些函数的成员变量处于不同的存储区

在学习的过程中多看开源操作系统或者开源软件的源码,能够提高自己的编码能力和设计解决问题的能力


C语言连接MYSQL数据库预处理的代码

判断用户是否存在的一个简单的小例子;水平不高,仅做参考


bool userExist(const char *username,MYSQL* my_connection){    char *sql = "select * from stu where name=?;";    MYSQL_STMT * preparestatment = mysql_stmt_init(my_connection);    int prepare_result = mysql_stmt_prepare(preparestatment, sql,                                            strlen(sql));    if( 0 == prepare_result ){        printf("user = %s %d\n",username,strlen(username));        MYSQL_BIND params[2];        int id=2;        char name[21];        strncpy(name,username,20);        memset(params, 0, sizeof(params));        params[1].buffer_type = MYSQL_TYPE_LONG;        params[1].buffer = &id;        params[0].buffer_type = MYSQL_TYPE_STRING;        params[0].buffer = name;        params[0].buffer_length = strlen(name);        params[0].is_null=0;        mysql_stmt_bind_param(preparestatment, params);        mysql_stmt_execute(preparestatment);        mysql_stmt_close(preparestatment);        /*mysql_stmt_store_result(preparestatment);        while(mysql_stmt_fetch(preparestatment) == 0) //返回结果集中的下一行            printf("%d\t%s\n", num, nam);        */        return true;    }else {        printf("prepare error:%s",strerror(errno));        return false;    }}


接下来的是加深对指针,排序,回调函数的理解的一个小程序


#include<stdio.h>#include<stdlib.h>#include<string.h>#define DATASIZE 20typedef struct Node{    int data;    struct Node * next;} Node,*PNode;int com(const void * a,const void * b){    return (*((PNode*)a))->data > (*((PNode*)b))->data ? 1 : 0;}int  quicksort(void * array,int length,int elem_size,int (*compare)(const void *,const void*)){    void * temp = (void*)malloc(elem_size*2);    realquicksort(temp,array,0,length-1,elem_size,compare);    free(temp);}int realquicksort(void*t, void*array,int l,int r,int len,int (*compare)(const void *,const void*)){    if(l<r)    {        int i,j,rand_pos;        i = l;        j = l+1;        void *a=t+len;        srand(time(NULL));        rand_pos = rand()%(r-l+1)+l;        memcpy(t,array+rand_pos*len,len);        memcpy(array+rand_pos*len,array+l*len,len);        memcpy(array+l*len,t,len);        memcpy(a,array+l*len,len);        while(j<=r)        {            if(compare(a,array+j*len))            {                i++;                memcpy(t,array+i*len,len);                memcpy(array+i*len,array+j*len,len);                memcpy(array+j*len,t,len);            }            j++;        }        memcpy(array+l*len,array+i*len,len);        memcpy(array+i*len,a,len);        PNode* temp=(PNode*)array;        realquicksort(t,array,l,i-1,len,compare);        realquicksort(t,array,i+1,r,len,compare);    }}int main(){    PNode head = (PNode)malloc(sizeof(Node)),pre=NULL,temp;    int i,j;    // 生成随机数    srand(time(NULL));    head->data=rand()%(DATASIZE*100);    head->next=NULL;    pre = head;    for(i=1;i<DATASIZE;i++){        temp=(PNode)malloc(sizeof(Node));        temp->data=rand()%(DATASIZE*100);        temp->next=NULL;        pre->next=temp;        pre = temp;    }    printf("这些都是随机生成的数,以单链表的形式存储\n");    temp=head;    while(temp){        printf("%d ",temp->data,temp);        temp=temp->next;    }    printf("\n");    PNode pnodes[DATASIZE];    int pnodesLen=0;    temp=head;    while(temp){        pnodes[pnodesLen++]=temp;        temp=temp->next;    }    quicksort(pnodes,pnodesLen,sizeof(PNode),com);    printf("after order\n");    for(i=0;i<pnodesLen;i++){        printf("%d ",pnodes[i]->data);    }}











原创粉丝点击