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
}
}
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();是返回第一行的第一列的值。
确实很乱啊,你调试下到哪报错了。
的确是有点乱,但还是比较简单的一个逻辑。我看出来有几点问题
首先,你用的ExecuteScalar方法去判断用户是否验证成功,验证成功返回1,那SQL语句应该写"select 1 from qquser where ...";这估计就是引起异常的原因
SQL语句中两个参数应该都不是数值类型应该用单引号引起来像这样“qqid=‘{0}' and pwd='{1}' ”,当然最好是用带参数的SQL程序更加安全,这样的写法也可以
还有就是SqlConnectioin尽可能不要全局,更加不要用静态变量,这样很容易出问题,内存也很难释放掉。conn俩各界字符串用静态没问题,但连接最好是每次用的时候再New出来,并用using括起来保证释放会比较好
strMsg既然作为返回值完全可以作为局部变量,没必要在外部声明
楼上的说的对,应该供ExecuteNonQuery()方法,返回实体类类型
password是sql的关键字来的,你用[]把它给括起来,然后的话,你的查询条件是两个字符窜,在sql里面的话要用单引号筐住
你多对这个方法不熟悉 ExecuteScalar(),他的意思是返回第一行第一列的值,所以你在查询的时候count(0) 查看该登录名和密码是否在数据库中存在...