存储过程提供空读者

时间:2014-06-09 09:58:00

标签: c# sql-server stored-procedures sqldatareader

我有以下存储过程

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

用户表中有两行。

这会给出一个空读者错误

_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

2 个答案:

答案 0 :(得分:2)

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

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

没有指定两个varchars的大小。通过这种方式,只有一个char被传递给参数,当然没有任何内容被检索

将sp更改为

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

或两个数据库字段的大小

答案 1 :(得分:1)

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

Bad habits to kick : declaring VARCHAR without (length)

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