介绍
在C语言中,与数据库有关的操作需要调用相应的库,例如Microsoft SQL Server(简称MSSQL)需要调用 sqloledb 库。在本文中,将通过使用C语言和MSSQL数据库,来实现表格自增的管理。
前置条件
1.环境搭建
在开始之前,我们需要确保以下事项已经完成:
拥有本地的MSSQL数据库,并正确安装与配置了MSSQL服务。
在安装了Visual Studio或其他C语言编译环境。
2.引入sqloledb库
在VS中,我们需要引入 sqloledb 库以实现与MSSQL的操作。按以下步骤操作:
打开项目:
#include <stdio.h>
#include <windows.h>
#include <sql.h>
#include <sqlext.h>
int main()
{
//code here
return 0;
}
设置项目属性:
右键项目,选择“属性”:
选择“VC++目录”标签页,设置包含目录、库目录、库文件:
选择“链接器”-“输入”标签页,添加“sqloledb.lib”:
表格自增管理实现
我们假设我们要创建一个包含自增id、姓名、年龄、性别的表格,并且实现对其增、删、改、查的功能。
1.连接数据库
首先,我们需要连接MSSQL数据库。下面是我给大家的示例:
HENV henv=NULL ;
HDBC hdbc=NULL ;
//为环境句柄分配空间
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=SQLConnectW(hdbc,L"msdb",SQL_NTS,L"sa",SQL_NTS,L"123",SQL_NTS) ;
其中,由SQLConnectW()函数连接数据库,
第二个参数是数据库名(msdb);
第四个参数是用户名(sa);
第六个参数是密码(123)。
我们可以通过返回值来判断是否成功连接数据库:
if (SQL_SUCCESS!=ret && SQL_SUCCESS_WITH_INFO!=ret){
//连接失败
//do something...
}
else{
//连接成功
//do something...
}
以下是对上述代码的一些解释:
SQL_SUCCESS:操作成功
SQL_SUCCESS_WITH_INFO:操作成功并返回一些信息
SQL_INVALID_HANDLE:无效的句柄(例如连接失败)
SQL_ERROR:操作失败
2.创建表格
下一个步骤是创建表格。下面是表格创建语句的示例:
CREATE TABLE dbo.UserTable(
id INT IDENTITY(1,1) PRIMARY KEY,
name VARCHAR(20) NOT NULL,
age TINYINT NOT NULL,
sex VARCHAR(20) NOT NULL
)
在本示例中,我们创建了一个名为UserTable的表格,有自增的id、name、age、sex四个字段。下面我们可以调用以下SQLExecDirect()函数在MSSQL中创建表格:
char sql[] = "CREATE TABLE dbo.UserTable("
"id INT IDENTITY(1,1) PRIMARY KEY,"
"name VARCHAR(20) NOT NULL,"
"age TINYINT NOT NULL,"
"sex VARCHAR(20) NOT NULL"
");";
SQLExecDirectW(hstmt,(SQLWCHAR*)(s2ws(sql).c_str()),SQL_NTS);
这里s2ws()函数的作用是将char类型字符串转换成wchar_t类型。为什么要转换?因为SQLExecDirectW()函数要求的第二个参数是SQLWCHAR指针类型,而不是char指针类型。
在这里需要注意,我们需要调用SQLExecDirect()函数后才能创建表格,如果表格已经存在,那么将会返回错误。
3.增加数据
增加数据的操作一般包括以下几个步骤:
插入数据到表格中;
提交数据。
下面是一个包含三个字段的插入操作的示例:
char sql[] = "INSERT INTO dbo.UserTable (name,age,sex) VALUES ('张三',28,'男');";
//插入数据
SQLExecDirectW(hstmt,(SQLWCHAR*)(s2ws(sql).c_str()),SQL_NTS);
//提交数据
SQLEndTran(SQL_HANDLE_DBC,hdbc,SQL_COMMIT);
这里需要注意,所有的插入、删除、修改操作需要调用SQLEndTran()函数来提交数据。同时需要注意的是,只有提交后才能看到数据的变化。
4.删除数据
与增加数据的过程非常相似,删除数据的操作一般包括以下几个步骤:
发送删除语句;
提交数据。
下面是一个包含条件的删除数据示例:
char sql[] = "DELETE FROM dbo.UserTable WHERE name='张三';";
//发送删除语句
SQLExecDirectW(hstmt,(SQLWCHAR*)(s2ws(sql).c_str()),SQL_NTS);
//提交数据
SQLEndTran(SQL_HANDLE_DBC,hdbc,SQL_COMMIT);
在这个示例中,我们选择了名字为"张三"的数据行,并将其删除。与前面的插入示例相同,我们需要调用SQLEndTran()函数提交数据。
5.修改数据
修改数据的操作也很类似,以下是一个示例:
char sql[] = "UPDATE dbo.UserTable SET name='李四',age=29,sex='女' WHERE id=1;";
//发送修改语句
SQLExecDirectW(hstmt,(SQLWCHAR*)(s2ws(sql).c_str()),SQL_NTS);
//提交数据
SQLEndTran(SQL_HANDLE_DBC,hdbc,SQL_COMMIT);
在这个示例中,我们选择了id为1的数据行,并将其修改名字为"李四"、年龄为29、性别为"女"。
6.查询数据
最后一个操作就是查询表格中的数据了。以下是一个包含指定条件并返回结果的示例:
char sql[] = "SELECT * FROM dbo.UserTable WHERE age>20;";
//发送查询语句
SQLExecDirectW(hstmt,(SQLWCHAR*)(s2ws(sql).c_str()),SQL_NTS);
//处理结果
while ((ret=SQLFetch(hstmt))==SQL_SUCCESS || ret==SQL_SUCCESS_WITH_INFO)
{
//获取数据
char name[20];
int age;
char gender[20];
SQLGetData(hstmt,2,SQL_C_CHAR,&name,20,NULL) ;
SQLGetData(hstmt,3,SQL_C_SLONG,&age,sizeof(age),NULL) ;
SQLGetData(hstmt,4,SQL_C_CHAR,&gender,20,NULL) ;
//do something...
}
在这个示例中,我们选择了所有的年龄大于20岁的数据行,并将其返回。我们可以使用SQLGetData()函数去获取指定字段的数据。然后,我们需要将其存储到指定的变量中。
7.终止
完成对表格的管理后,我们需要关闭连接和句柄:
//关闭连接和句柄
SQLDisconnect(hdbc) ;
SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
SQLFreeHandle(SQL_HANDLE_DBC,hdbc);
SQLFreeHandle(SQL_HANDLE_ENV,henv);
在这个示例中,我们使用了SQLDisconnect()函数来关闭连接,使用SQLFreeHandle()函数来释放句柄。
总结
通过C语言和MSSQL数据库的搭配,我们可以实现对表格的自增管理。我们可以通过连接数据库,创建表格,插入、删除、修改、查询数据来实现完整SQL语句的操作。当然,我们需要熟练掌握VS、sqloledb库的使用,才能顺利完成这些操作。