SQL表明明有数据,为何SqlDataReader reader = command.ExecuteReader();reader.HasRow返回false?

xuanyin235 2019-02-14 11:55:11
1.首先我在SQLServer中创建了SQL2012Db数据库,并在数据库中添加了UserLogin表,如下所示:

CREATE TABLE UserLogin
(
CardId int IDENTITY(1,1), --Identity makes the column Not Null internally
UserName varchar(10) Not Null, --Name value is a must and can't be Null
LoginPwd varchar(10),
LoginType int
)
Insert into UserLogin (UserName,LoginPwd,LoginType )
Values('Jack','111111',1),
('User','222222',0)



2.然后创建proc_UserLogin存储过程,如下所示:

use SQL2012Db
go
create proc proc_UserLogin
@p_User varchar(10),
@p_Password varchar(10),
@p_Type int
as
insert into UserLogin(UserName,LoginPwd,LoginType)values(@p_User,@p_Password,@p_Type)
go



然后,利用C#对数据库建立连接,

private void Btn_Login_Click(object sender, EventArgs e)
{
string strIP = TBox_IP.Text;
string strDb = TBox_DB.Text;
string strUser = TBox_User.Text;
string strPwd = TBox_Pwd.Text;
int iType = 1;
string errmsg = "";

if (!m_DbAction.Login(strIP, strDb, ref strUser, strPwd, iType, out errmsg))
{
MessageBox.Show(errmsg);
return;
}
}


public bool Login(string str_ip, string str_db, ref string str_user, string str_pwd, int i_type, out string errmsg)
{
SQLServerAPI api = new SQLServerAPI(str_ip, str_db, m_User, m_Pwd);

SqlParameter[] param = new SqlParameter[3];
param[0] = new SqlParameter("p_User", str_user);
param[1] = new SqlParameter("p_Password", str_pwd);
param[2] = new SqlParameter("p_Type", i_type);

DataTable result;
int err = api.ExecQueryStoreProc("proc_UserLogin", ref param, out result);
if (err != 0)
{
switch (err)
{
case -1:
errmsg = MyRe.MSS_NOUSER;
break;
case -2:
errmsg = MyRe.MSS_WRONGPASSWORD;
break;
default:
errmsg = MyRe.MSS_UNKNOWNERROR;
break;
}
return false;
}
DataRow dr = result.Rows[0];

str_user = dr["CardID"].ToString();
errmsg = MyRe.MSS_SUCCESS;

return true;
}


public int ExecQueryStoreProc(string procname, ref SqlParameter[] param, out DataTable result)
{
if (!Connect())
{
result = null;
return -1;
}

try
{
SqlCommand command = new SqlCommand(procname, m_SqlConnection);
command.CommandType = CommandType.StoredProcedure;

if (m_Transaction != null)
command.Transaction = m_Transaction;

SqlParameter rvalue = command.Parameters.Add(new SqlParameter("RETURN_VALUE", SqlDbType.Int));
rvalue.Direction = ParameterDirection.ReturnValue;

if (param != null)
command.Parameters.AddRange(param);

result = new DataTable();
SqlDataReader reader = command.ExecuteReader();
if (reader.HasRows)
result.Load(reader);

return Convert.ToInt32(command.Parameters["RETURN_VALUE"].Value);
}
catch (Exception)
{
result = null;
return -1;
}
finally
{
DisConnect();
}
}

最后,按如下操作输入

执行上述代码的时候,reader.HasRows一直返回false,为什么?我明明SQL表中是存在数据的,求大神指点,谢谢!
...全文
299 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuanyin235 2019-02-15
  • 打赏
  • 举报
回复
上述C#代码已经上传至百度网盘,请大神帮忙看下,感谢! 链接:https://pan.baidu.com/s/1UaYGm7BvSZqU0b-ZISQzMA 提取码:g5hl
xuanyin235 2019-02-15
  • 打赏
  • 举报
回复
引用 2 楼 Hello World, 的回复:
登录不是用select来判断有没有么,为什么用insert into?
binggo,看来还是我对SQL不熟啊,proc_UserLogin存储过程实际上就是将SQL执行语句块以存储过程的方式来执行,既然我是查询数据库UserLogin表的登录信息与界面输入是否一致,那就应该用select语句来做判断。我之前的理解有误,认为proc_UserLogin单次执行用来创建与UserLogin表的连接 感谢2楼的提点,我这边修改了一下proc_UserLogin存储过程,以及测试OK了,修改如下:

USE [SQL2012Db]
GO
/****** Object:  StoredProcedure [dbo].[proc_UserLogin]    Script Date: 02/15/2019 09:37:59 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER proc [dbo].[proc_UserLogin]
	@p_User varchar(100), 
	@p_Password varchar(200),  
	@p_Type int
as  
declare @CardID   varchar(20),    @Name         varchar(50),
        @Password varchar(20)

  select @CardID = CardID, @Name = UserName,
         @Password = LoginPwd
  from UserLogin
  where ((@p_Type = 0 and CardID = @p_User) or (@p_Type = 1 and UserName = @p_User))

  if @@rowcount <= 0
  begin
    return -1;
  end

  if @Password != @p_Password
  begin
    return -2
  end

  select @CardID as CardID, @Name as Name, @Password as Password

  return 0 
吉普赛的歌 2019-02-15
  • 打赏
  • 举报
回复
感觉楼主的思路非常混乱。
登录确实应该用查询, 而不是插入。
查询到账户、密码对得上就可以了。
select * from UserLogin where UserName=@userName and LoginPwd=@loginPwd

上面这个sql 有记录, 即为有效账户, 允许登录。

另外, 只要不是搞毕业设计之类的玩具系统, 一般会用 MD5 来加密, 数据库不应该存原始密码。

你可能是初学, 建议找一本带源码的实战项目的书, 从头到尾敲一遍代码, 再来自己创造。
Hello World, 2019-02-15
  • 打赏
  • 举报
回复
登录不是用select来判断有没有么,为什么用insert into?

22,206

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧