乱码问题解决方式,连接字符串使用GBK,修改数据库默认编码为gbk
4、保存HDBC到全局变量中,长连接、短连接。比如Java、C#中访问数据库复杂多少。一通百通。
要掌握调试的技巧,分析问题可能出错的原因和出错的地方,然后调试分析。一定不能和书上不一致,就懵了
5、自己动手写用户管理系统:新增密码字段、新建用户,检验登录;
- SQLINTEGER cbsatid=SQL_NTS;
- //需要一行一行的读取,这种方式就叫做通过游标读取,无论是在JDBC、ADO/ADO.net。。。结果集
- //调用SQLFetch一次就向下读取一行,直到返回值为SQL_NO_DATA_FOUND的时候表示读到了最后
- //是不是和C语言文件访问中EOF有点像。
- while (SQLFetch(hstmt)!=SQL_NO_DATA_FOUND)
- {
- TCHAR name[20]; //字符数组,SQLCHAR其实就是char的一个别名,所以和char name[20]一样。
- //调用SQLGetData来取列(Column)的内容
- //第一个参数就是代表SQL语句的hstmt、第二是要读取的列的序号(从1开始)
- //第三个是列的类型(SQL_C_CHAR字符串,在SQLExt.h中所有以SQL_C_开头的都是可选值)
- //第四个参数就是要接收的值的指针!!!
- //第五个是指针指向的缓冲区的大小
- //第六个不用管,那么调就行
- SQLGetData(hstmt,1,SQL_C_CHAR,name,sizeof(name)/sizeof(SQLCHAR),&cbsatid);
- MessageBox(hwnd,name,TEXT(""),MB_OK);
- }
- while (SQLFetch(hstmt)!=SQL_NO_DATA_FOUND)
- {
- SQLINTEGER i; //字符数组,SQLCHAR其实就是char的一个别名,所以和char name[20]一样。
- //调用SQLGetData来取列(Column)的内容
- //第一个参数就是代表SQL语句的hstmt、第二是要读取的列的序号(从1开始)
- //第三个是列的类型(SQL_C_CHAR字符串,在SQLExt.h中所有以SQL_C_开头的都是可选值)
- //第四个参数就是要接收的值的指针!!!
- //第五个是指针指向的缓冲区的大小
- //第六个不用管,那么调就行
- SQLGetData(hstmt,2,SQL_C_LONG,&i,sizeof(i),&cbsatid);
- TCHAR name[20];
- SQLGetData(hstmt,1,SQL_C_CHAR,name,sizeof(name)/sizeof(TCHAR),&cbsatid);
- TCHAR s[20];
- wsprintf(s,TEXT("%s年龄是:%d"),name,i);
-
- MessageBox(hwnd,s,TEXT(""),MB_OK);
- }
- result = SQLPrepare(hstmt,(SQLCHAR*)"select FUserName,FPassword from T_User",SQL_NTS);
- CHECKDBSTMTERROR(hwnd,result,hstmt);
- result =SQLExecute(hstmt);
- CHECKDBSTMTERROR(hwnd,result,hstmt);
- SQLINTEGER cbsatid=SQL_NTS;
- TCHAR inputUserName[20];
- GetDlgItemText(hwnd,IDC_EDITUSERNAME,inputUserName,sizeof(inputUserName)/sizeof(TCHAR));
- TCHAR inputPassword[20];
- GetDlgItemText(hwnd,IDC_EDITPASSWORD,inputPassword,sizeof(inputPassword)/sizeof(TCHAR));
- BOOL found=FALSE;
- while (SQLFetch(hstmt)!=SQL_NO_DATA_FOUND)
- {
- TCHAR userName[20];
- SQLGetData(hstmt,1,SQL_C_CHAR,userName,sizeof(userName)/sizeof(TCHAR),&cbsatid);
- TCHAR password[20];
- SQLGetData(hstmt,2,SQL_C_CHAR,password,sizeof(password)/sizeof(TCHAR),&cbsatid);
- if(0==lstrcmp(inputUserName,userName))
- {
- if(0==lstrcmp(inputPassword,password))
- {
- MessageBox(hwnd,TEXT("输入正确,登陆成功!"),TEXT("提示"),MB_OK);
- found = TRUE;
- break;
- }
- }
- }
- if(FALSE==found)
- {
- MessageBox(hwnd,TEXT("输入错误"),TEXT("报错"),MB_OK|MB_ICONERROR);
- }
复制代码
缺点是???
数据量大了以后运行速度很慢。比如说咱们如鹏100万会员。
Wsprintf
课下作业:
(1)
细化报错信息:当用户名不存在的时候提示“用户名不存在”,当用户名存在而密码错误的时候报告“密码错误”。
(2)
保存用户的时候,如果用户已经存在则更新已有的用户信息;否则新增用户信息。
(3)删除指定用户名的用户;
(4)有能力的同学研究ListView控件的使用,列出当前数据库中的所有用户信息,选择某个用户可以删除、可以更新。
下节课内容:
作业点评:ListView控件的使用与用户管理系统。
SQL注入漏洞及参数化SQL