现在的位置: 首页 > 综合 > 正文

怎样在VC中用代码操作SQL(1)?—注册帐号,修改密码,登录3个功能

2013年07月25日 ⁄ 综合 ⁄ 共 5983字 ⁄ 字号 评论关闭
怎样在VC中用代码操作SQL(1)?---注册帐号,修改密码,登录3个功能
2010年08月19日 星期四 上午 10:12

效果图说明:图中包括3个模块(1.注册帐号 2.修改密码 3.登录),注意用户资料是保存SQL数据库中,而不是VC中
------------------本文分2部分 第1部分:讲解 第2部分:源代码-------------------------
---------------第1部分:讲解-----------------
第1步:SQL准备--->建立好数据库(新建数据库--->新建数据表(帐号与密码)) //代码详见源代码区备注1(后面简写成备注*)
第2步:VC准备---->建立好VC模型--->建立MFC对话框程序(是多字节字符集)   //注:此处为介绍主题,所以账号与密码框都在同一对话框上
步骤1:建立好界面
--->菜单栏上格式|Tab Order,专门设置键盘上的Tab键
--->Default Button,给登录添加上

--->注意帐号是组合框,而密码是编辑框(注:密码通常是带***号,在VC属性里直接改就可以了,本例为突出主题,没改)
步骤2:建立好响应区,但不添加任何响应事件
第3步:VC连接SQL数据库准备                                  //详见备注2
第4步:给框架添加"灵魂",代码已准备好,直接添加               //详见备注3
注意点1:在SQL中测试时,数字可以不用'单引号,但是字符串必须要,否则报错!
所以在获取到对话框的信息,用上单引号,其实就是在原有""下,多加''即可---------->出现错误,如图所示

CString str_user="'"+m_suser+"'";     //第1个正确
CString str_user="'"+"'"+m_suser+"'"; //第2个错误,error C2110: “+”: 不能添加两个指针
解决办法1:CString str_user=CString("'")+"'"+m_suser+"'";
解决办法2:CString str="'"+m_suser+"'";CString str_user="'"+str;//如果1次只能加1个指针,那分2次加
注意点2:为保证代码安全,所以用try,catch语句来帮忙<<=====******=====注意:一定要重视try,catch语句=====*******====>>

注意点3:容易出错:使用完后记的关闭对象,或者关闭对象后,不允许操作,当然这些提示try,catch会给出提示,一般情况下如果不用try,catch找错误,VC是找不到的,几乎无论什么错误都报R6010,而这错误代码是在MSDN(MSDN目前有R6009,R6016,但是R6010到R6015这几个没有)找不到,在网上也搜索不到.必须要用try,catch才能找到,而且非常详细----->说了很多边try,catch了,是为了说明它的重要性!

------------------------------------------第2部分:源代码----------------------------------------------------
备注1:SQL准备(注:此语句必须经过SQL数据库检测合格,才能给VC用!)
--------创建表----------
use KOUSER
go
CREATE TABLE kolist
(
   suser char(10) NOT NULL                         /*帐号字段,注意不是int,因为QQ除了数字附录还允许邮箱登录*/
         CONSTRAINT PK_sno PRIMARY KEY CLUSTERED, /*主键约束*/ 
   spassword      char(16)    NOT NULL,            /*密码字段*/

--------注册用户----------
use KOUSER
go
INSERT INTO kolist
VALUES ('123456789','123abc') --注:帐号必须为数字,所以在输入的时候限制为int,然后将其转换为CString类型保存在数据库
--------修改密码----------
use KOUSER
go
update kolist 
set spassword='555xyz' where suser='123456789';
--------登录----------

use KOUSER
go
select count(*) as name from kolist where suser='123456789' and spassword='555xyz';
//name是别名,即字段名.在VC中提取SQL数据库,就要这个字段名
图中当判断帐号与密码同时正确时(注:记的用单引号包括起来,否则出错),count会计算为1,然后将值传给别名name
-------SQL语句准备完毕!
备注2:
-----------头文件中stdafx.h----------------
#import "C:\Program Files\Common Files\System\ado\msado15.dll" rename_namespace ("ADODB")rename ("EOF","ADOEOF")
using namespace ADODB ;
-----------头文件中***dlg.h----------------//注:在添加时,VC编译器可能不认,需要生成一次(把头文件中信息写进去)
public:
_ConnectionPtr m_pMyConection;
_RecordsetPtr m_pMyRecord;
-----------源文件中***dlg.cpp----------------
void CVC用代码操作SQLDlg::OnBnClickedButton1()
{
AfxOleInit();//初始化COM库 
m_pMyConection.CreateInstance(__uuidof(Connection));//使用_ConnectionPtr接口
m_pMyRecord.CreateInstance(__uuidof(Recordset));//使用_RecordsetPtr接口
m_pMyConection->Open("Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial

Catalog=KOUSER;","","",-1); //打开数据库--->前3个是教材书上的,第4个是要连接的数据库,详见最后备注1
m_pMyConection->Close();//关闭_ConnectionPtr接口
}
备注3:
--------注册用户----------
注意点1:注册用户时,由于给用户名设置了主键,所以防止了重复,详见如图提示(注:这个是用try,catch语句捕获的提示)

--------修改密码----------
--------登录----------

void CVC怎样用代码操作SQLDlg::OnBnClickedButtonNewUser()
{
UpdateData(TRUE);
try
{
   CString str_user="'"+m_suser+"'";//加单引号,因为SQL中字符需要用'包括起来
   CString str_password="'"+m_spassword+"'";

m_pMyConection->Open("Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=KOUSER;","","",-1); 
        _bstr_t MySQL=("INSERT INTO kolist VALUES ("+str_user+","+str_password+")");

   this->m_pMyConection->Execute((_bstr_t)MySQL,NULL,adCmdText); 
   m_pMyConection->Close();//关闭_ConnectionPtr接口
}
catch(_com_error e)
{
   AfxMessageBox(e.Description());//注:可以添加return;返回值,不添加表示退出
}
}

void CVC怎样用代码操作SQLDlg::OnBnClickedButtonUpdatePassword()
{
UpdateData(TRUE);
try
{
   CString str_user="'"+m_suser+"'";//加单引号,因为SQL中字符需要用'包括起来
   CString str_password="'"+m_spassword+"'";
m_pMyConection->Open("Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=KOUSER;","","",-1); 
        CString MySQL=(_bstr_t)("update kolist set spassword="+str_password+" where suser="+str_user);
   this->m_pMyConection->Execute((_bstr_t)MySQL,NULL,adCmdText);
   m_pMyConection->Close();//关闭_ConnectionPtr接口
}
catch(_com_error e)
{
   AfxMessageBox(e.Description());
}
}

void CVC怎样用代码操作SQLDlg::OnBnClickedButtonEnter()
{
UpdateData(TRUE);
if(m_suser==""||m_spassword=="")
{
   AfxMessageBox(_T("帐号或密码不能为空"));
}
else
{
   try
   {
    CString str_user="'"+m_suser+"'";//加单引号,因为SQL中字符需要用'包括起来
    CString str_password="'"+m_spassword+"'";
m_pMyConection->Open("Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=KOUSER;","","",-1); 
            _bstr_t MySQL("select count(*) as name from kolist where suser="+str_user+" and spassword="+str_password);
    this->m_pMyRecord=this->m_pMyConection->Execute((_bstr_t)MySQL,NULL,adCmdText);

    CString MyValue; 
    MyValue=(TCHAR*)(_bstr_t)m_pMyRecord->GetFields()->GetItem(L"name")->Value;
    int n=atoi(MyValue);
    if(n==0)
    {
     AfxMessageBox("帐号或密码错误,请重输");
    }
    if(n==1)
    {
     AfxMessageBox("登录成功!");
    }
    AfxMessageBox(MyValue);
    m_pMyRecord->Close();//关闭_RecordsetPtr接口
    m_pMyConection->Close();//关闭_ConnectionPtr接口
   }
   catch(_com_error e)
   {
    AfxMessageBox(e.Description());
   }
}
}

备注1:

"Provider=SQLOLEDB.1;Persist Security Info=False;User ID=;PassWord=;Initial Catalog=;Data Source=" 
这句话每个关键题的含义,

Provider=SQLOLEDB.1 ------打开数据库用oledb的方式连接
Persist Security Info ----是否保存安全信息
User ID-------------------用户名
PassWord------------------密码
Initial Catalog-----------数据库的名称或者数据库ip或者目录
Data Source---------------数据源

若想获得更多信息,可以输入里面的关键字在网上搜索,例如Initial Catalog
-------------------------------------

附注1:源代码已上传至邮箱,即取即用,另外附加了ado.txt(百度文库下的讲解资料)与ado封装好的接口(据说是别人认为比较好的ADO,但是不是SQL,所以先保存着)

附注2:基本上完成了这3个模块.不过这仅是一点皮毛,后面调用的比这难上N倍,上次的IO端口,估计是每秒钟同时处理上万条信息,比如QQ用户上亿人在线,估计有1万人同时在改个人资料,以后继续更新了,本博客<<VC调用SQL详解 >>也准备好了,随时调用资料

附注3:新增新的功能.详见<<怎样在VC中用代码操作SQL(2)?---获取用户列表>>,以后新增的就不说明了.直接在第16轮SQL百科知识里找等.

附注4:解决了在拷贝代码在win32控制台应用程序时的BUG,原因:初始化COM出了错.

 //初始化COM库
 //AfxOleInit();//经测试,也与别的程序员讨论,这个Afx开头的只能在MFC对话框程序上运行,不能用在WIN32 控制台应用程序上
 ::CoInitialize(NULL);//经测试,可以运用在win32控制台应用程序上,当然也可以应用在MFC对话框程序上

 


 

抱歉!评论已关闭.