C语言+ODBC+SQL 操作(向SQL里面添加数据)

为了节省时间,我就引用上一节的数据库的表和C语言的结构体数组,在结构体数组中添加数据,清空数据库数据。

第一步查询:SQLBindParameter函数的用法。 

SQLRETURN SQLBindParameter(
      SQLHSTMT        StatementHandle,    // statement句柄
      SQLUSMALLINT    ParameterNumber,    // 参数位于语句中的序号,最小为1
      SQLSMALLINT     InputOutputType,    // 入参/出参类型标识[1]
      SQLSMALLINT     ValueType,          // 对应的C数据类型标识[2]
      SQLSMALLINT     ParameterType,      // 对应的SQL数据类型标识[2]
      SQLULEN         ColumnSize,         // 对应字段长度
      SQLSMALLINT     DecimalDigits,      // 如果是浮点数,则对应字段精度
      SQLPOINTER      ParameterValuePtr,  // 参数缓存
      SQLLEN          BufferLength,       // 参数缓存字节数
      SQLLEN *        StrLen_or_IndPtr);  // 用于表示字符串长度或NULL值的标识[3]

 注意:

  1、在ODBC中,整型的SQL_INTEGER类型对应的C语言数据类型标识是SQL_C_LONG,而不是SQL_C_INT,并且没有SQL_C_INT这种类型。

  2、在存入整型的数据时,SQLPOINTER ParameterValuePtr  应该要加取地址符‘&’。

  3、SQLUSMALLINT ParameterNumber 这个参数不能随便写,要与建表时的顺序相同。

第二步:写添加数据的函数。

void workertianjiashuju(int i)
{
    SQLRETURN ret;  
    SQLHENV henv;//SQLHANDLE henv  
    SQLHDBC hdbc;//SQLHANDLE hdbc  
    SQLHSTMT hstmt;//SQLHANDLE hstmt  
  
    ret=SQLAllocHandle(SQL_HANDLE_ENV,NULL,&henv);//申请环境句柄  
    ret=SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(SQLPOINTER)SQL_OV_ODBC3,SQL_IS_INTEGER);//设置环境属性  
    ret=SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc);//申请数据库连接句柄  
    ret=SQLConnect(hdbc,(SQLCHAR*)"phonesql",SQL_NTS,(SQLCHAR*)"sa",SQL_NTS,(SQLCHAR*)"123456",SQL_NTS);//连接数据库  
    if(ret==SQL_SUCCESS || ret==SQL_SUCCESS_WITH_INFO){  
       ret=SQLAllocHandle(SQL_HANDLE_STMT,hdbc,&hstmt);//申请SQL语句句柄  
      SQLCHAR sql[]="INSERT INTO worker VALUES (?,?,?,?,?,?,?,?,?,?);";
	  SQLINTEGER P = SQL_NTS;
	  ret=SQLPrepare(hstmt,sql,SQL_NTS);
       ret=SQLBindParameter(hstmt,1,SQL_PARAM_INPUT,SQL_C_LONG,SQL_INTEGER,0,0,&gong[i].num,0,&P);//绑定参数  
	   ret=SQLBindParameter(hstmt,2,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,20,0,gong[i].name,20,&P);//绑定参数 
       ret=SQLBindParameter(hstmt,3,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,10,0,gong[i].sex,10,&P);//绑定参数
       ret=SQLBindParameter(hstmt,4,SQL_PARAM_INPUT,SQL_C_LONG,SQL_INTEGER,0,0,&gong[i].age,0,&P);//绑定参数  
	   ret=SQLBindParameter(hstmt,5,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,20,0,gong[i].shenfennum,20,&P);
	   ret=SQLBindParameter(hstmt,6,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,10,0,gong[i].xueli,10,&P);
	   ret=SQLBindParameter(hstmt,7,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,10,0,gong[i].mianmao,10,&P);
	   ret=SQLBindParameter(hstmt,8,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,20,0,gong[i].mima,20,&P);
	   ret=SQLBindParameter(hstmt,9,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,10,0,gong[i].quanxian,10,&P);
	   ret=SQLBindParameter(hstmt,10,SQL_PARAM_INPUT,SQL_C_CHAR,SQL_CHAR,20,0,gong[i].born,20,&P);
	   ret=SQLExecute(hstmt);//直接执行SQL语句  
       if(ret==SQL_SUCCESS || ret==SQL_SUCCESS_WITH_INFO){  		
           
		   /*****************测试结构体数组********************/
		 printf("添加第%d条信息成功!\n",i+1);  
  
         SQLFreeHandle(SQL_HANDLE_STMT,hstmt);//释放语句句柄  
       }else printf("添加数据库操作失败!\n");  
              
         SQLDisconnect(hdbc);//断开与数据库的连接  
    }  
    else printf("连接数据库失败!\n");     
    SQLFreeHandle(SQL_HANDLE_DBC,hdbc);//释放连接句柄  
    SQLFreeHandle(SQL_HANDLE_ENV,henv);//释放环境句柄 

}

 注意:SQLCHAR sql[]="INSERT INTO worker VALUES (?,?,?,?,?,?,?,?,?,?);";  这个语句中的’?’表示要添加的数据。(添加多少个数据,就写多少个问号)

 第三步:写主函数调用,代码略。

   完成后,数据库中的数据变为


posted @ 2015-05-03 15:24  Beta_陳  阅读(4908)  评论(5编辑  收藏  举报