关于C#数据库的简单问题,理论上不难,但是也被困扰3天,于是提问,请高手解答,在线等待!!! if( (thisReader["UserName"].ToString()==this.LoginName.Text) && (thisReader["UserCode"].ToString()==this.LoginCode.Text) ) 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 逻辑上有错误---应该在找到相应的用户名和密码后立即退出循环,你那种写法只有在最后一条记录正确的情况下才能正确登录! 可以这样写 while(thisReader.Read()) { if(thisReader["UserName"].ToString()==this.LoginName.Text&&thisReader ["UserCode"].ToString()==this.LoginCode.Text) { MessageBox.Show("Have Logined"); result="1"; break; } } if(result==null) { result="0"; MessageBox.Show("No Data Find"); } 继续请教高手,依照上面的代码改正后依然只是执行else语句 while(thisReader.Read()) { if((string)thisReader["UserName"]==this.LoginName.Text.Trim()&&(string)thisReader ["UserCode"]==this.LoginCode.Text.Trim()) { MessageBox.Show("Have Logined"); result="1"; break; } }if(result==null){result="0";MessageBox.Show("No Data Find");} thisReader["UserName"]是个OBJECT对象,你要转成STRING 你的代码我没有仔细看。因为网页里面显示的格式不是很好,所以……我的建议:自己写个类userDB,这个类里面有个check方法,bool 类型public bool check(string username,string userpsw){ //这里对用户名和密码进行验证 //建议使用sql = "select count(*) from tablename where username=@username and userpsw=@userpsw" //然后使用SqlParameter}然后在按钮点击事件里面private void LoginOk_Click(object sender, System.EventArgs e){ userDB userdb = new userDB(); bool result = userdb.check(this.txtUserName.Text,this.txtUserpsw.Text) //接着做其他事情} 同意 lxhlizhenhao(黎冠黎) ( ) 信誉:100 2004-07-09 22:54:00 得分: 0 不过我一般用sql去找,加参数 username usercode 找到一条记录则登录正确,找到两条或以上就报管理员有重名(不太可能),找不到记录则无法登录。 谢谢各位提供这么多解决的方法,我将试一试//////////////////////////////////////////////////////////////现在用这条语句if((this.LoginName.Text==thisReader["UserName"].ToString())&&(this.LoginCode.Text)==thisReader ["UserCode"].ToString()))可以执行if语句了,但是有一个小问题是它只能读取除第一行数据以外的数据,这是为什么?不是Read()应该从第一个数据开始遍历吗? 直接用SQL语句哪,为何要遍历整个表呢?? 我的理解:生成一个DataReader对象以后指针指向的是第一条记录的前面位置。read()方法把记录位置向后移动一个位置。 private void LoginOk_Click(object sender, System.EventArgs e) { try { string result=null; SqlConnection thisCon=new SqlConnection(@"Data Source=BILLGATES;Integrated Security=SSPI;Initial Catalog=LibraryManager"); thisCon.Open(); SqlCommand thisCommand=thisCon.CreateCommand(); thisCommand.CommandText="Select UserName,UserCode from Login where UserName='"+this.LoginName.Text+"' and UserCode='"+this.LoginCode.Text+"'"; SqlDataReader thisReader=thisCommand.ExecuteReader(); if(thisReader.Read()) { MessageBox.Show("Have Logined"); result="1"; } else { MessageBox.Show("No Data Find"); result="0"; } } catch(SqlException ex) { MessageBox.Show(ex.Message.ToString()); } } 回复人: bineon(雪冬寒) ( ) 信誉:88 2004-07-10 10:44:00 得分: 0 我的理解:生成一个DataReader对象以后指针指向的是第一条记录的前面位置。read()方法把记录位置向后移动一个位置。错!!就是从第一条读取,如果从第二条读取了,肯定是程序中有错,给你错觉了。 result問題出在RETURN ,只要第一條不符﹐則不會再找第二條了把result="0"; MessageBox.Show("No Data Find");放在WHILE之外就可以了 楼主麻烦了,用个dataset,用where语句,if dataset count〉0 passelse。。end if 老大你的条件不对!优先级!加括号!(thisReader["UserName"].ToString()==this.LoginName.Text||thisReader["UserCode"].ToString()==this.LoginCode.Text) 1.用&&代替||2.thisReader中的数据你监视过吗,看看它的值吧!!! 用 do 进行判断。第一次while thisReader.Read()会将指针指向第二条记录,如果你的第一条记录是符合的,那后面自然就没有!你可以跟踪数据源的,就知道为什么会执行ELSE啦!干吗不直接在SQL里加条件上??WHILE语句多余了 DataGrid中的Header自定义格式,并随内容刷新 BringToFront不好用,求MSDN未公开的API 求了!!!!!! C#中如何将string转换为char[]?知道的说声,帮我大忙了!!!! girdview里呈现的数据不能 更改 怎么设置 C#中如何与VB的WINSOCK通讯 string—实体属性映射 如何将Windows窗体(用户倥件DLL)插入到Web窗体中? 向大家请教treeview的问题?很急!!!!!!!!!! 热烈欢迎用过treeview的朋友进来看看 vs.net最新版是什么? 如何增加XML节点的一个属性,请指点!!!!!!!!!
可以这样写 while(thisReader.Read())
{
if(thisReader["UserName"].ToString()==this.LoginName.Text&&thisReader ["UserCode"].ToString()==this.LoginCode.Text)
{
MessageBox.Show("Have Logined");
result="1";
break; }
}
if(result==null)
{
result="0";
MessageBox.Show("No Data Find");
}
{
if((string)thisReader["UserName"]==this.LoginName.Text.Trim()&&(string)thisReader ["UserCode"]==this.LoginCode.Text.Trim())
{
MessageBox.Show("Have Logined");
result="1";
break; }
}if(result==null)
{
result="0";
MessageBox.Show("No Data Find");
}
我的建议:
自己写个类userDB,这个类里面有个check方法,bool 类型
public bool check(string username,string userpsw)
{
//这里对用户名和密码进行验证
//建议使用sql = "select count(*) from tablename where username=@username and userpsw=@userpsw"
//然后使用SqlParameter
}然后在按钮点击事件里面
private void LoginOk_Click(object sender, System.EventArgs e)
{
userDB userdb = new userDB();
bool result = userdb.check(this.txtUserName.Text,this.txtUserpsw.Text)
//接着做其他事情
}
不过我一般用sql去找,加参数 username usercode 找到一条记录则登录正确,找到两条或以上就报管理员有重名(不太可能),找不到记录则无法登录。
//////////////////////////////////////////////////////////////
现在用这条语句
if((this.LoginName.Text==thisReader["UserName"].ToString())&&(this.LoginCode.Text)==thisReader ["UserCode"].ToString()))
可以执行if语句了,但是有一个小问题是它只能读取除第一行数据以外的数据,这是为什么?不是Read()应该从第一个数据开始遍历吗?
{
try
{
string result=null;
SqlConnection thisCon=new SqlConnection(@"Data Source=BILLGATES;Integrated Security=SSPI;Initial Catalog=LibraryManager");
thisCon.Open();
SqlCommand thisCommand=thisCon.CreateCommand(); thisCommand.CommandText="Select UserName,UserCode from Login where UserName='"+this.LoginName.Text+"' and UserCode='"+this.LoginCode.Text+"'";
SqlDataReader thisReader=thisCommand.ExecuteReader();
if(thisReader.Read())
{
MessageBox.Show("Have Logined");
result="1";
}
else
{
MessageBox.Show("No Data Find");
result="0";
}
}
catch(SqlException ex)
{
MessageBox.Show(ex.Message.ToString());
}
}
我的理解:生成一个DataReader对象以后指针指向的是第一条记录的前面位置。read()方法把记录位置向后移动一个位置。
错!!就是从第一条读取,如果从第二条读取了,肯定是程序中有错,给你错觉了。
問題出在RETURN ,只要第一條不符﹐則不會再找第二條了
把result="0";
MessageBox.Show("No Data Find");放在WHILE之外就可以了
else
。。
end if
(thisReader["UserName"].ToString()==this.LoginName.Text||thisReader["UserCode"].ToString()==this.LoginCode.Text)
2.thisReader中的数据你监视过吗,看看它的值吧!!!
WHILE语句多余了