首页 新闻 会员 周边

虚心请教C#sql连接,未将对象引用设置到对象的实例 刚学代码有点乱,别见怪

0
悬赏园豆:10 [已解决问题] 解决于 2011-06-17 11:05
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;

namespace ConsoleApplication1
{
class DBOperation
{
private static string conn = "Data Source=.;Initial Catalog=qq;Integrated Security=True";
//User ID=sa;Password=123456";如果Password为空,可以不写
public static SqlConnection con = new SqlConnection(conn);
string strMsg="";
#region 异常处理
public void Conn()
{
try
{
//打开数据库
con.Open();
CheckUserInFo();
Console.WriteLine(
"打开成功");
Console.WriteLine(strMsg);
}
catch (Exception ex)
{
Console.WriteLine(
"异常:{0}", ex.Message);
}
finally
{
//关闭数据
con.Close();
Console.WriteLine(
"关闭成功");
Console.ReadLine();
}
}
#endregion

#region
public string CheckUserInFo()
{

Console.Write(
"请输入QQ号:");
int ID = int.Parse(Console.ReadLine());
Console.Write(
"请输入密码:");
string pwd = Console.ReadLine();
string sql =string.Format("select QQid,password from qquser where qqid={0} and password={1}",ID,pwd);
SqlCommand com
= new SqlCommand(sql,con);
int i = (int)com.ExecuteScalar();
if (i != 1)
{
strMsg
= "输入错误";
return strMsg;
}
else
{
strMsg
= "登陆成功";
return strMsg;
}
}

#endregion
}
}
问题补充:

int i = (int)com.ExecuteScalar();

单步调试,这句执行完就报错了

漂流瓶&子風的主页 漂流瓶&子風 | 初学一级 | 园豆:198
提问于:2011-06-15 17:25
< >
分享
最佳答案
0

string sql =string.Format("select count(1) from qquser where qqid={0} and password={1}",ID,pwd);
SqlCommand com
= new SqlCommand(sql,con);
int i = (int)com.ExecuteScalar();
if (i <= 0)
{
更改下代码就可以了。

com.ExecuteScalar();是返回第一行的第一列的值。

 

收获园豆:5
小胆粗心 | 菜鸟二级 |园豆:300 | 2011-06-16 12:13
嗯能解决了,不过要把count(1)改成count(*)我是要找数据库里有这个用户名和密码不,谢谢了
漂流瓶&子風 | 园豆:198 (初学一级) | 2011-06-17 11:04
count(1)是可以的啊。你用什么数据库?这样能提高查询速度
小胆粗心 | 园豆:300 (菜鸟二级) | 2011-06-17 12:31
@
小胆粗心:count(1)的意思是:只要找到一条满足条件的就返回吗? Microsoft SQL Server 2008的,刚学有不对的别见怪
漂流瓶&子風 | 园豆:198 (初学一级) | 2011-06-17 15:30
其他回答(5)
0

确实很乱啊,你调试下到哪报错了。

code先生-null | 园豆:307 (菜鸟二级) | 2011-06-15 17:32
int i = (int)com.ExecuteScalar();

单步调试,这句执行完就报错了
支持(0) 反对(0) 漂流瓶&子風 | 园豆:198 (初学一级) | 2011-06-15 17:42
0

的确是有点乱,但还是比较简单的一个逻辑。我看出来有几点问题

首先,你用的ExecuteScalar方法去判断用户是否验证成功,验证成功返回1,那SQL语句应该写"select 1 from qquser where ...";这估计就是引起异常的原因

SQL语句中两个参数应该都不是数值类型应该用单引号引起来像这样“qqid=‘{0}' and pwd='{1}' ”,当然最好是用带参数的SQL程序更加安全,这样的写法也可以

还有就是SqlConnectioin尽可能不要全局,更加不要用静态变量,这样很容易出问题,内存也很难释放掉。conn俩各界字符串用静态没问题,但连接最好是每次用的时候再New出来,并用using括起来保证释放会比较好

strMsg既然作为返回值完全可以作为局部变量,没必要在外部声明

 


收获园豆:5
七月霄雨 | 园豆:1282 (小虾三级) | 2011-06-15 22:56
0

楼上的说的对,应该供ExecuteNonQuery()方法,返回实体类类型

蓦然回首的思念 | 园豆:900 (小虾三级) | 2011-06-16 09:08
0

password是sql的关键字来的,你用[]把它给括起来,然后的话,你的查询条件是两个字符窜,在sql里面的话要用单引号筐住

aXinNo1 | 园豆:370 (菜鸟二级) | 2011-06-16 13:00
0

你多对这个方法不熟悉 ExecuteScalar(),他的意思是返回第一行第一列的值,所以你在查询的时候count(0) 查看该登录名和密码是否在数据库中存在...

like%'远远'% | 园豆:635 (小虾三级) | 2011-06-16 14:49
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册