使用c语言对sql server进行增删改查操作
众所周知,自从sql server 2000以后,便不再支持c语言的嵌入式语言操作,因此需要使用odbc连接的方式来进行操作。我在完成实验的时候一直找不到较为完整的操作代码,走了不少弯路,在这里分享给大家我的一些总结。
环境 windows 10 sql server 2019 vs2019 注意:请使用多字节字符集
ODBC连接 这一部分我就不做详细的赘述,在论坛中很容易搜索的到。连接数据库
#include
#include
#include
#include
#include
void Connect(SQLRETURN ret,
SQLHENV& henv,
SQLHDBC& hdbc,
SQLHSTMT& hstmt)//设置连接参数的句柄
{
const char* SY1 = "DOST";
unsigned char* SY = (unsigned char*)SY1;
const char* db21 = "sa";//数据库ODBC连接的账户
unsigned char* db2 = (unsigned char*)db21;
const char* pass1 = "12345678";//数据库ODBC连接的密码
unsigned char* pass = (unsigned char*)pass1;
ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);//申请环境句柄
ret = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, SQL_IS_INTEGER);
ret = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);//申请数据库连接句柄
ret = SQLConnect(hdbc, SY, SQL_NTS, db2, SQL_NTS, pass, SQL_NTS);
/*db2为配置的ODBC数据源名称,这里根据自己的配置进行修改*/
if (!(ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO))
{
printf("连接数据库失败!\n");
return;
}
ret = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);//用于分配句柄
}
3.增加功能
void insert(SQLRETURN ret,
SQLHENV& henv,
SQLHDBC& hdbc,
SQLHSTMT& hstmt)
{
int i = 0,j = 0,k = 0;
unsigned char tablename[60];
do
{
printf("请输入你想要插入数据的表的序号\n");
printf("1.学生表S 2.课程表C 3.学生成绩表SC\n");
scanf("%d", &i);
switch (i)
{
case 1:strcpy((char*)tablename, "S(sclass,sno,sname,ssex,Sdept,sage) values (?,?,?,?,?,?)");printf("请根据S(sclass,sno,sname,ssex,Sdept,sage)依次输入数据,数据之间带回车或空格\n"); break;//非常明显这里采用了动态sql的方式,问号的地方即为我们后期需要输入的地方
case 2:strcpy((char*)tablename, "C values (?,?,?,?)"); printf("请根据C(cno,cname,cpno,ccredit)依次输入数据,数据之间带回车或空格\n"); break;
case 3:strcpy((char*)tablename, "SC values (?,?,?,?)"); printf("请根据SC(sclass,sno,cno,grade)依次输入数据,数据之间带回车或空格\n"); break;
default:printf("输入错误,重新输入\n");
}
} while (i 3);
char s[5][10], s1[10] = "", s2[10] = "", s3[10] = "", s4[10] = "", s5[10] = "";
int num;
/*long conlumnlen;*/
SQLAllocStmt(hdbc, &hstmt);
SQLCHAR sql2[100] = "insert into ";//要注意,sqlchar实际上就是unsigned char,这在字符串操作语句当中是不能够直接操作的,需要强转为char型后再进行操作
strcat((char*)sql2, (char*)tablename);
//printf("%s\n", sql2);
SQLPrepare(hstmt, (SQLCHAR*)sql2, strlen((char*)sql2));//这里是对sql语句进行prepare操作,这一步有助于防注入,提高安全性
if (i == 1)
j = 5;
else if (i == 2|| i==3)
j = 3;
for (k = 0; k |