C语言教程:如何修改数据库中的数据 (c修改数据库中的数据)
随着信息化时代的不断发展,数据库已经成为了计算机系统中不可或缺的一部分。作为一种常见的数据存储方式,数据库不仅可以存储大规模的数据,还可以在不同的系统之间进行数据共享和数据交换。在实际应用中,一旦数据库中的数据发生了变化,往往需要使用编程语言来对其进行修改。本文将介绍如何使用C语言修改数据库中的数据。
一、连接数据库
在C语言中,要想对数据库中的数据进行修改,必须首先连接到数据库服务器。连接数据库的方法分为两种,一种是使用ODBC连接,另外一种是使用第三方的库文件连接,如MySQL提供的libmysql.dll库文件。本文将以使用ODBC连接数据库为例进行说明。
需要在代码中调用头文件#include 和#include ,同时还需要准备一些连接数据库的变量,其中包括一个SQLHENV类型的变量,一个SQLHDBC类型的变量和一个SQLHSTMT类型的变量。这三个变量分别代表了ODBC环境句柄、数据库连接句柄和语句句柄。
需要调用SQLAllocHandle函数来分配ODBC句柄。SQLAllocHandle函数包括三个参数,之一个参数为需要分配的句柄的类型,第二个参数为其父句柄,第三个参数为该句柄需要赋予的属性值。对于ODBC环境句柄和数据库连接句柄,可以不用指定其父句柄,而在语句句柄上,需要指定其父句柄为数据库连接句柄。
需要调用SQLConnect函数连接到数据库。SQLConnect函数包括五个参数,分别为数据库连接句柄、数据库用户名、数据库密码、数据库服务器名和数据库名称。以MySQL数据库为例,通过调用SQLConnect函数连接到MySQL数据库的例子代码如下所示:
“`c
SQLHENV henv;
SQLHDBC hdbc;
SQLHSTMT hstmt;
SQLRETURN retcode;
SQLCHAR* dsn = (SQLCHAR*)”Data Source=test”;
SQLCHAR* user = (SQLCHAR*)”root”;
SQLCHAR* pswd = (SQLCHAR*)”123456″;
SQLCHAR* serv = (SQLCHAR*)”localhost”;
SQLCHAR* db = (SQLCHAR*)”test”;
retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0);
retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
retcode = SQLConnectA(hdbc, serv, SQL_NTS, user, SQL_NTS, pswd, SQL_NTS);
if (retcode != SQL_SUCCESS) {
printf(“connect to mysql fled!\n”);
return 0;
}
“`
二、修改数据库中的数据
连接到数据库后,就可以开始对数据库中的数据进行修改了。修改数据操作的核心在于SQL语句的执行。在C语言中,可以通过调用SQLExecDirect函数执行SQL语句。SQLExecDirect函数包括两个参数,分别为语句句柄和指向SQL语句的字符串指针。
对于修改数据操作,常用的SQL语句有INSERT、UPDATE和DELETE。其中,INSERT用于向数据库中添加新的数据记录,UPDATE用于更新数据库中的数据记录,DELETE用于删除数据库中的数据记录。下面分别介绍这三种SQL语句的用法。
1.修改数据
要修改数据库中的数据,首先需要使用SELECT语句查询出需要修改的数据记录。例如,要修改学号为001的学生的姓名为“小明”,可以使用如下的SQL语句:
“`sql
SELECT * FROM student WHERE sno=’001′;
“`
查询到符合条件的数据记录后,就可以使用UPDATE语句来修改该数据记录的内容。例如,将上述查询结果中的sname字段修改为“小明”,可以使用如下的SQL语句:
“`sql
UPDATE student SET sname=’小明’ WHERE sno=’001′;
“`
注意,需要将表名和字段名按照实际情况进行修改。
为了在C语言中执行上述的SQL语句,可以使用如下的代码:
“`c
char sql[1024] = { 0 };
sprintf(sql, “UPDATE student SET sname=’小明’ WHERE sno=’001′”);
retcode = SQLExecDirectA(hstmt, (SQLCHAR*)sql, SQL_NTS);
“`
上述代码中,sprintf函数用于组合SQL语句,通过拼接字符串的方式生成完整的SQL语句字符串。SQLExecDirectA函数用于执行SQL语句。
2.插入数据
要想向数据库中插入新的数据记录,可以使用INSERT语句。例如,要向student表中插入学号为“002”的学生,可以使用如下的SQL语句:
“`sql
INSERT INTO student(sno, sname) VALUES(‘002’, ‘小红’);
“`
这条SQL语句会在student表中添加一条新的数据记录,将sno字段设为“002”,将sname字段设为“小红”。
在C语言中执行上述的SQL语句,可以使用如下的代码:
“`c
char sql[1024] = { 0 };
sprintf(sql, “INSERT INTO student(sno, sname) VALUES(‘002’, ‘小红’)”);
retcode = SQLExecDirectA(hstmt, (SQLCHAR*)sql, SQL_NTS);
“`
3.删除数据
要想从数据库中删除数据记录,可以使用DELETE语句。例如,要从student表中删除学号为“002”的学生,可以使用如下的SQL语句:
“`sql
DELETE FROM student WHERE sno=’002′;
“`
这条SQL语句会将student表中符合条件的数据记录全部删除。
在C语言中执行上述的SQL语句,可以使用如下的代码:
“`c
char sql[1024] = { 0 };
sprintf(sql, “DELETE FROM student WHERE sno=’002′”);
retcode = SQLExecDirectA(hstmt, (SQLCHAR*)sql, SQL_NTS);
“`
三、关闭数据库连接
在C语言中执行完数据库操作后,需要调用SQLDisconnect函数断开与数据库服务器的连接,并释放ODBC的句柄空间。例如:
“`c
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
“`
SQLDisconnect函数用于断开与数据库服务器的连接,SQLFreeHandle函数用于释放分配的句柄空间。
四、完整代码
下面是使用C语言修改数据库中数据的完整代码:
“`c
#include
#include
#include
int mn(int argc, char* argv[])
{
SQLHENV henv;
SQLHDBC hdbc;
SQLHSTMT hstmt;
SQLRETURN retcode;
SQLCHAR* dsn = (SQLCHAR*)”Data Source=test”;
SQLCHAR* user = (SQLCHAR*)”root”;
SQLCHAR* pswd = (SQLCHAR*)”123456″;
SQLCHAR* serv = (SQLCHAR*)”localhost”;
SQLCHAR* db = (SQLCHAR*)”test”;
char sql[1024] = { 0 };
retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0);
retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
retcode = SQLConnectA(hdbc, serv, SQL_NTS, user, SQL_NTS, pswd, SQL_NTS);
if (retcode != SQL_SUCCESS) {
printf(“connect to mysql fled!\n”);
return 0;
}
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
if (retcode != SQL_SUCCESS) {
printf(“SQLAllocHandle fled!\n”);
return 0;
}
sprintf(sql, “SELECT * FROM student WHERE sno=’001′”);
retcode = SQLExecDirectA(hstmt, (SQLCHAR*)sql, SQL_NTS);
while (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
SQLCHAR sno[32] = { 0 };
SQLCHAR sname[64] = { 0 };
SQLINTEGER age = 0;
SQLLEN len1 = 0, len2 = 0, len3 = 0;
retcode = SQLBindCol(hstmt, 1, SQL_C_CHAR, sno, sizeof(sno), &len1);
retcode = SQLBindCol(hstmt, 2, SQL_C_CHAR, sname, sizeof(sname), &len2);
retcode = SQLBindCol(hstmt, 3, SQL_C_SLONG, &age, 0, &len3);
retcode = SQLFetch(hstmt);
if (retcode == SQL_NO_DATA) {
break;
}
printf(“sno:%s sname:%s age:%d\n”, sno, sname, age);
}
sprintf(sql, “UPDATE student SET sname=’小明’ WHERE sno=’001′”);
retcode = SQLExecDirectA(hstmt, (SQLCHAR*)sql, SQL_NTS);
sprintf(sql, “SELECT * FROM student WHERE sno=’001′”);
retcode = SQLExecDirectA(hstmt, (SQLCHAR*)sql, SQL_NTS);
while (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
SQLCHAR sno[32] = { 0 };
SQLCHAR sname[64] = { 0 };
SQLINTEGER age = 0;
SQLLEN len1 = 0, len2 = 0, len3 = 0;
retcode = SQLBindCol(hstmt, 1, SQL_C_CHAR, sno, sizeof(sno), &len1);
retcode = SQLBindCol(hstmt, 2, SQL_C_CHAR, sname, sizeof(sname), &len2);
retcode = SQLBindCol(hstmt, 3, SQL_C_SLONG, &age, 0, &len3);
retcode = SQLFetch(hstmt);
if (retcode == SQL_NO_DATA) {
break;
}
printf(“sno:%s sname:%s age:%d\n”, sno, sname, age);
}
sprintf(sql, “INSERT INTO student(sno, sname) VALUES(‘002’, ‘小红’)”);
retcode = SQLExecDirectA(hstmt, (SQLCHAR*)sql, SQL_NTS);
sprintf(sql, “SELECT * FROM student WHERE sno=’002′”);
retcode = SQLExecDirectA(hstmt, (SQLCHAR*)sql, SQL_NTS);
while (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
SQLCHAR sno[32] = { 0 };
SQLCHAR sname[64] = { 0 };
SQLINTEGER age = 0;
SQLLEN len1 = 0, len2 = 0, len3 = 0;
retcode = SQLBindCol(hstmt, 1, SQL_C_CHAR, sno, sizeof(sno), &len1);
retcode = SQLBindCol(hstmt, 2, SQL_C_CHAR, sname, sizeof(sname), &len2);
retcode = SQLBindCol(hstmt, 3, SQL_C_SLONG, &age, 0, &len3);
retcode = SQLFetch(hstmt);
if (retcode == SQL_NO_DATA) {
break;
}
printf(“sno:%s sname:%s age:%d\n”, sno, sname, age);
}
sprintf(sql, “DELETE FROM student WHERE sno=’002′”);
retcode = SQLExecDirectA(hstmt, (SQLCHAR*)sql, SQL_NTS);
sprintf(sql, “SELECT * FROM student WHERE sno=’002′”);
retcode = SQLExecDirectA(hstmt, (SQLCHAR*)sql, SQL_NTS);
while (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
SQLCHAR sno[32] = { 0 };
SQLCHAR sname[64] = { 0 };
SQLINTEGER age = 0;
SQLLEN len1 = 0, len2 = 0, len3 = 0;
retcode = SQLBindCol(hstmt, 1, SQL_C_CHAR, sno, sizeof(sno), &len1);
retcode = SQLBindCol(hstmt, 2, SQL_C_CHAR, sname, sizeof(sname), &len2);
retcode = SQLBindCol(hstmt, 3, SQL_C_SLONG, &age, 0, &len3);
retcode = SQLFetch(hstmt);
if (retcode == SQL_NO_DATA) {
break;
}
printf(“sno:%s sname:%s age:%d\n”, sno, sname, age);
}
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return 0;
}
“`