存储过程给出一个空的读取器

本文关键字:一个 读取 存储过程 | 更新日期: 2023-09-27 18:07:32

我有以下存储过程

ALTER PROCEDURE dbo.USER_AUTH
(
@username varchar,
@password varchar
)
AS
BEGIN
SELECT * FROM users
WHERE username = @username
AND password = @password;
END

users表中有两行

给出一个空阅读器错误

_Command = new SqlCommand("[dbo].[USER_AUTH]", _Connection);
_Command.CommandType = System.Data.CommandType.StoredProcedure;
_Command.Parameters.AddWithValue("@username", _Username);
_Command.Parameters.AddWithValue("@password", _Password);
reader = _Command.ExecuteReader();

_Command = new SqlCommand("select * from users where 
                    username=@username and password=@password" , _Connection);
_Command.Parameters.AddWithValue("@username", _Username);
_Command.Parameters.AddWithValue("@password", _Password);
reader = _Command.ExecuteReader(); 

式中,_ConnectionSqlConnection _Connection, _CommandSqlCommand _CommandreaderSqlDataReader

存储过程给出一个空的读取器

这是因为您的存储过程声明了

ALTER PROCEDURE dbo.USER_AUTH
(
   @username varchar,
   @password varchar
)

而不指定两个varchar的大小。通过这种方式,只传递一个字符给参数,当然没有检索到

将sp改为

ALTER PROCEDURE dbo.USER_AUTH
(
   @username nvarchar(30),
   @password nvarchar(30)
)

或者任意大小的数据库字段

您必须指定varchar 的长度因此,如果我们不指定长度,这些是SQL Server使用的默认值-这意味着我们期望存储在数据库中的数据将在我们不知情的情况下被默默地截断。

要改掉的坏习惯:不带(length)声明VARCHAR

ALTER PROCEDURE dbo.USER_AUTH
(
@username varchar(20),
@password varchar(20)
)
AS
BEGIN
SELECT * FROM users
WHERE username = @username
AND password = @password;
END
相关文章: