| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 634 人关注过本帖
标题:关于C语言的一个问题。
只看楼主 加入收藏
XQwindow
Rank: 2
等 级:论坛游民
帖 子:121
专家分:64
注 册:2013-1-1
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:9 
关于C语言的一个问题。
我用MySql想做一个简单的数据库模拟登录,注册程序。
然后我想在用户点击注册的时候,然后要注册的用户名已经在数据库里面了,就找到他的密码进行更新。
但是写了好久好久,还是无法更新数据。
请大家指点指点,
谢谢!
程序代码:
#define MAX_USERNAME 20
#define MAX_PASSWORD 20 
#define MAX_SQLWORD 120
void SaveUser(HWND hwnd)
{
    SQLHENV henv = NULL;
    SQLHDBC hdbc = NULL;
    SQLHSTMT hstmt = NULL;
    SQLRETURN result;
    SQLCHAR ConnStrIn[MAXBUFLEN] = "DRIVER={MySQL ODBC 5.1 Driver};SERVER=127.0.0.1;UID=root;PWD=root;DATABASE=mydb;CharSet=gbk;";
    SQLCHAR ConnStrOut[MAXBUFLEN];
    //分配环境句柄
    result = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
    //设置管理环境属性
    result = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
    //分配连接句柄
    result = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
    //设置连接属性
    result = SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (void*)LOGIN_TIMEOUT, 0);
    //连接数据库
    result = SQLDriverConnect(hdbc,NULL,
        ConnStrIn,SQL_NTS,
        ConnStrOut,MAXBUFLEN,
        (SQLSMALLINT *)0,SQL_DRIVER_NOPROMPT);
    if(SQL_ERROR==result)
    {
        ShowDBConnError(hwnd,hdbc);
        return;
    }
    //初始化语句句柄
    result = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);  
    TCHAR tInputUserName[MAX_USERNAME];
    TCHAR tInputPassWord[MAX_PASSWORD];
    TCHAR tSql[MAX_SQLWORD+10];
    GetDlgItemText(hwnd,IDC_EDITUSERNAME,tInputUserName,MAX_USERNAME);
    GetDlgItemText(hwnd,IDC_EDITPASSWORD,tInputPassWord,MAX_PASSWORD);
    wsprintf(tSql,"SELECT FPassWord FROM T_User WHERE FUserName='%s'",tInputUserName);//SELECT过滤一次,把FUserName是这个都过滤出来
    result = SQLPrepare(hstmt,(SQLCHAR*)tSql,SQL_NTS);
    CHECKDBSTMTERROR(hwnd,result,hstmt);
    //////////////////////////////////////////////////////////////////////////
    //result = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);  
    //result = SQLPrepare(hstmt,(SQLCHAR*)"UPDATE T_User SET FPassWord='eee' WHERE FUserName='A'",SQL_NTS);
    //CHECKDBSTMTERROR(hwnd,result,hstmt);
    //////////////////////////////////////////////////////////////////////////
    result =SQLExecute(hstmt);
    SQLINTEGER cbsatid=SQL_NTS;
    while (SQLFetch(hstmt)!=SQL_NO_DATA_FOUND)//找到相同的才进入循环,所以说有相同的用户名,然后就把他UPDATE
    {
        MessageBox(hwnd,TEXT("here"),TEXT(""),MB_OK);
        TCHAR tUpDatePassWord[MAX_PASSWORD];
        wsprintf(tUpDatePassWord,"UPDATE T_User SET FPassWord='%s' WHERE FUserName='%s'",tInputPassWord,tInputUserName);//SELECT后,找到的密码都更新
        result = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);  
        result = SQLPrepare(hstmt,(SQLCHAR*)tUpDatePassWord,SQL_NTS);
        CHECKDBSTMTERROR(hwnd,result,hstmt);
        break;
    }
    CHECKDBSTMTERROR(hwnd,result,hstmt);
    SQLFreeStmt(hstmt,SQL_CLOSE);
    SQLDisconnect(hdbc);
    SQLFreeHandle(SQL_HANDLE_DBC,hdbc);
    SQLFreeHandle(SQL_HANDLE_ENV,henv);
    MessageBox(hwnd,TEXT("执行SQL成功"),TEXT("SQL"),MB_OK|MB_ICONINFORMATION);
}
搜索更多相关主题的帖子: 注册 用户名 C语言 
2013-01-28 11:04
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9011
专家分:53957
注 册:2011-1-18
收藏
得分:7 
1. 你的代码能编译通过吗?难道你期望别人帮你补全代码?
2. “但是写了好久好久,还是无法更新数据” --- 你总得告诉别人是哪一句失败吧?
3. 无用的 GetDlgItemText 等去掉吧,直接写上定值。免得浪费别人的时间。
4. 把TCHAR[]类型的tSql强转为(SQLCHAR*)?我不知道说你什么好
5. select又while再update,实在是看不懂你兜兜转转想干什么
6. MAX_PASSWORD只有20,明显tUpDatePassWord数组溢出
7. while中只有 SQLPrepare,没有 SQLExecute
8. 明明没变参数,为什么不直接 SQLExecDirect
9. SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt)分配了两次,只释放了一次
10. 没用过MySQL,不知道你的连接字符串是否是表示数据库只读。
2013-01-28 13:47
XQwindow
Rank: 2
等 级:论坛游民
帖 子:121
专家分:64
注 册:2013-1-1
收藏
得分:0 
回复 2楼 rjsp
我没有说让人补全,这是个函数,不是全部的代码。
我也不知道哪里错了,事实上我真的调试了很久。
我不太懂那些用在哪些地方。
我说我这样写无法达到修改的目的。
我想问问你们看看我的那些地方错了。
可能我问的问题不是很准确,这个我道歉。
谢谢了、

[ 本帖最后由 XQwindow 于 2013-1-28 14:48 编辑 ]

我不知道我能否当程序员,但我依然热爱编程!
2013-01-28 14:46
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9011
专家分:53957
注 册:2011-1-18
收藏
得分:0 
我没有说让人补全,这是个函数,不是全部的代码。
------ 你应该贴出相关的全部代码。所谓“相关的”,就是无关的就别贴了,看2楼第三条;所谓“全部代码”,就是能编译的代码,看2楼第一条。
如果代码不能编译的话,那就只能通过肉眼看,不能通过编译器来检查和调试。
剔除无关代码和补全相关代码是需要耗费时间的,这是你的事情,应该你来做,不能推给想回答你问题的人,否则一来别人会觉得你故意给别人制造麻烦,二来一百个人就要重复一百次重复的工作,不符合低碳环保的要求。
总而言之,如果代码无法直接编译,或代码中无关的代码过多,大部分人会选择直接跳过。

我也不知道哪里错了,事实上我真的调试了很久。
------ 这个我就奇怪了,你哪一步没成功都不知道,还叫“调试了很久”?

我想问问你们看看我的那些地方错了。
------ 你错的地方很多,比如2楼说的第4、6、7、10条,你都得改正过来。尤其是第7条,肯定是要加SQLExecute的。
2013-01-28 15:07
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:7 
rjsp说的是对的,问题应该逐个解决,从上到下,眉毛胡子一把抓是无法解决问题的。另外补充一下,楼主这个问题其实不是什么C语言问题,主要是mySQL的问题,你不会手动操纵mySQL的正确步骤而已,会那个了,自然知道需要什么。这就是所谓的学C之后的实际应用,不是语言课程可以教你的。

授人以渔,不授人以鱼。
2013-01-28 15:17
XQwindow
Rank: 2
等 级:论坛游民
帖 子:121
专家分:64
注 册:2013-1-1
收藏
得分:0 
回复 4楼 rjsp
不是代码出错,不是代码编译不通过。
是运行之后,Mysql里面的数据没有改。

我不知道我能否当程序员,但我依然热爱编程!
2013-01-28 15:59
XQwindow
Rank: 2
等 级:论坛游民
帖 子:121
专家分:64
注 册:2013-1-1
收藏
得分:0 
回复 5楼 TonyDeng
是的,就是你说的

我不知道我能否当程序员,但我依然热爱编程!
2013-01-28 16:01
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9011
专家分:53957
注 册:2011-1-18
收藏
得分:0 
以下是引用XQwindow在2013-1-28 15:59:16的发言:

不是代码出错,不是代码编译不通过。
是运行之后,Mysql里面的数据没有改。
我算是服你了,比如
result =SQLExecute(hstmt); 如果 result 小于0,那就可以说 SQLExecute(hstmt) 这一句执行失败。

另外,我说的那几个问题你改了没有呀,改了之后行不行呀?
2013-01-28 16:05
XQwindow
Rank: 2
等 级:论坛游民
帖 子:121
专家分:64
注 册:2013-1-1
收藏
得分:0 
回复 8楼 rjsp
嗯,加了result =SQLExecute(hstmt);这个,
还有改了SQL语句,可以实现我说的功能了,对了,result =SQLExecute(hstmt);这个具体是什么意思啊?
麻烦解释解释!谢谢

我不知道我能否当程序员,但我依然热爱编程!
2013-01-28 17:30
ljw_Jerry
Rank: 1
等 级:新手上路
帖 子:1
专家分:7
注 册:2012-11-13
收藏
得分:7 
程序代码:
#define MAX_USERNAME 20
#define MAX_PASSWORD 20
#define MAX_SQLWORD 120
void SaveUser(HWND hwnd)
{
    SQLHENV henv = NULL;
    SQLHDBC hdbc = NULL;
    SQLHSTMT hstmt = NULL;
    SQLRETURN result;
    SQLCHAR ConnStrIn[MAXBUFLEN] = "DRIVER={MySQL ODBC 5.1 Driver};SERVER=127.0.0.1;UID=root;PWD=root;DATABASE=mydb;CharSet=gbk;";
    SQLCHAR ConnStrOut[MAXBUFLEN];
    //分配环境句柄
    result = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
    //设置管理环境属性
    result = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
    //分配连接句柄
    result = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
    //设置连接属性
    result = SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (void*)LOGIN_TIMEOUT, 0);
    //连接数据库
    result = SQLDriverConnect(hdbc,NULL,
        ConnStrIn,SQL_NTS,
        ConnStrOut,MAXBUFLEN,
        (SQLSMALLINT *)0,SQL_DRIVER_NOPROMPT);
    if(SQL_ERROR==result)
    {
        ShowDBConnError(hwnd,hdbc);
        return;
    }
    //初始化语句句柄
    result = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); 
    TCHAR tInputUserName[MAX_USERNAME];
    TCHAR tInputPassWord[MAX_PASSWORD];
    TCHAR tSql[MAX_SQLWORD+10];
    GetDlgItemText(hwnd,IDC_EDITUSERNAME,tInputUserName,MAX_USERNAME);
    GetDlgItemText(hwnd,IDC_EDITPASSWORD,tInputPassWord,MAX_PASSWORD);
    wsprintf(tSql,"SELECT FPassWord FROM T_User WHERE FUserName='%s'",tInputUserName);//SELECT过滤一次,把FUserName是这个都过滤出来
    result = SQLPrepare(hstmt,(SQLCHAR*)tSql,SQL_NTS);
    CHECKDBSTMTERROR(hwnd,result,hstmt);
    //////////////////////////////////////////////////////////////////////////
    //result = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); 
    //result = SQLPrepare(hstmt,(SQLCHAR*)"UPDATE T_User SET FPassWord='eee' WHERE FUserName='A'",SQL_NTS);
    //CHECKDBSTMTERROR(hwnd,result,hstmt);
    //////////////////////////////////////////////////////////////////////////
    result =SQLExecute(hstmt);
    SQLINTEGER cbsatid=SQL_NTS;
    while (SQLFetch(hstmt)!=SQL_NO_DATA_FOUND)//找到相同的才进入循环,所以说有相同的用户名,然后就把他UPDATE
    {
        MessageBox(hwnd,TEXT("here"),TEXT(""),MB_OK);
        TCHAR tUpDatePassWord[MAX_PASSWORD];
        wsprintf(tUpDatePassWord,"UPDATE T_User SET FPassWord='%s' WHERE FUserName='%s'",tInputPassWord,tInputUserName);//SELECT后,找到的密码都更新
        result = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); 
        result = SQLPrepare(hstmt,(SQLCHAR*)tUpDatePassWord,SQL_NTS);
        CHECKDBSTMTERROR(hwnd,result,hstmt);
        break;
    }
    CHECKDBSTMTERROR(hwnd,result,hstmt);
    SQLFreeStmt(hstmt,SQL_CLOSE);
    SQLDisconnect(hdbc);
    SQLFreeHandle(SQL_HANDLE_DBC,hdbc);
    SQLFreeHandle(SQL_HANDLE_ENV,henv);
    MessageBox(hwnd,TEXT("执行SQL成功"),TEXT("SQL"),MB_OK|MB_ICONINFORMATION);
}

2013-01-29 16:18
快速回复:关于C语言的一个问题。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014550 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved