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 (?,?,?,?,?,?,?,?,?,?);"; 这个语句中的’?’表示要添加的数据。(添加多少个数据,就写多少个问号)
第三步:写主函数调用,代码略。
完成后,数据库中的数据变为