2014-11-28 3 views
1

процедуры или функция «вход» ожидает параметр «@Abc», который не был снабженПроцедура или функция ожидает параметр, который не был снабжен

4 часа поиска и не пытаемся и не использовать, я уже поставил этот параметр (копирование/вставка) и количество параметров, заданных процедуре, одинаковы для процедуры и в порядке.

@Abc - выходной параметр.

Хранится определение процедуры:

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER proc [dbo].[login] 
(
    @Abc int output, 
    @firstname varchar(255) output, 
    @lastname varchar(255) output, 
    @Email varchar(255), 
    @pass varchar(255) 
) 
As 
begin 
if not exists (select Email from user_1 where [email protected]) 
select @Abc = 0 
else begin 
if not exists (
    select Email from user_1 where email [email protected] and password = @pass 
    ) 
    select @Abc = 1 
else 
select @Abc = 2,@firstname = u.first_name ,@lastname=u.last_name from user_1 u where u.email = @email 
end 
end 

кода для вызова хранимой процедуры:

myCon.Open(); 

TextBox username = UserName; 
TextBox password = Password; 

SqlCommand myCommand = new SqlCommand("login", myCon); 

SqlParameter count= myCommand.Parameters.Add("@Abc", SqlDbType.Int); 
count.Direction = ParameterDirection.Output; 

SqlParameter fnp = myCommand.Parameters.Add("@firstname", SqlDbType.VarChar,255); 
fnp.Direction = ParameterDirection.Output; 

SqlParameter lnp = myCommand.Parameters.Add("@lastname", SqlDbType.VarChar, 255); 
lnp.Direction = ParameterDirection.Output; 

myCommand.Parameters.AddWithValue("@Email",username.Text); 
myCommand.Parameters.AddWithValue("@pass", password.Text); 

myCommand.ExecuteNonQuery(); 
myCon.Close(); 
+3

Как и в сторону - пожалуйста, скажите мне, что вы не хранить пароли в незашифрованном виде в базе данных. –

+2

Вы должны проверить [Может ли мы перестать использовать AddWithValue() уже?] (Http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/) и будьте осторожны при использовании '.AddWithValue()' - это может привести к неожиданным и неожиданным результатам ... –

+0

@ j.steen это школьный проект, а не реальная база данных – daredevil

ответ

5

Вы опущены:

myCommand.CommandType = CommandType.StoredProcedure; 

Таким образом, команда, посланная к БД является malfed sp_executeSQL звонок вместо желаемого exec login

FYI есть и более короткий синтаксис:

myCommand.Parameters.Add("@Abc", SqlDbType.Int).Direction = ParameterDirection.Output; 
+0

спасибо большое работал :) – daredevil