zoukankan      html  css  js  c++  java
  • 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条信息成功!
    ",i+1);  
      
             SQLFreeHandle(SQL_HANDLE_STMT,hstmt);//释放语句句柄  
           }else printf("添加数据库操作失败!
    ");  
                  
             SQLDisconnect(hdbc);//断开与数据库的连接  
        }  
        else printf("连接数据库失败!
    ");     
        SQLFreeHandle(SQL_HANDLE_DBC,hdbc);//释放连接句柄  
        SQLFreeHandle(SQL_HANDLE_ENV,henv);//释放环境句柄 
    
    }
    

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

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

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

    
    
  • 相关阅读:
    c# – 通过反射获取命名空间中的所有类型
    宝塔任务计划通道设置
    DRF项目框架基础设计
    Redis-数据特征和应用场景
    Redis-持久化详解
    Dockerfile文件详解
    ntp同步阿里服务器时间(centos)
    NUC8/11更新EC Firmware
    ambarella H2 kernel调试记录
    MobaXterm 执行make menuconfig不能删除字符
  • 原文地址:https://www.cnblogs.com/beta-data/p/4474061.html
Copyright © 2011-2022 走看看