Я получаю эту ошибку, когда пытаюсь вызвать код моей хранимой процедуры на моем сайте. Я давно застрял, так как я не знаю, где бы я ни конвертировал или объявлял значение как целое. Это мой оператор SQL:
create procedure GetRepPhoneID
@Rep nvarchar(100),
@phoneID nvarchar(100) output
as
set @phoneID = (select concat(CustomerRepPh, '~', cast(RepID as nvarchar(100))) as 'PhoneAndID'
from Reps
where CustomerRep=@Rep)
return @phoneID
go
Затем из моего кода С# я пытаюсь вызвать хранимую процедуру:
public static string GetRepPhone (строка Rep) {строка Connection = WebConfigurationManager.ConnectionStrings ["JDC_DatabaseConnectionString"]. ConnectionString; SqlConnection sqlConnection = новое SqlConnection (соединение);
//This funciton will take all of the values and create them.
try
{
sqlConnection.Open();
}
catch (Exception err)
{
Console.WriteLine(err.Message);
}
SqlCommand cmd = new SqlCommand();
cmd.Connection = sqlConnection;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "GetRepPhoneID"; //getting the procedure created in SQL.
SqlParameter CustomerParam = new SqlParameter();
CustomerParam.ParameterName = "Rep";
CustomerParam.SqlDbType = SqlDbType.NVarChar;
CustomerParam.Value = Rep;
CustomerParam.Direction = ParameterDirection.Input;
//We are using an output parameter not a return one because it is a string.
SqlParameter ReturnParam = new SqlParameter("phoneID", SqlDbType.NVarChar, 100);
ReturnParam.Direction = ParameterDirection.Output;
cmd.Parameters.Add(CustomerParam);
cmd.Parameters.Add(ReturnParam);
cmd.ExecuteNonQuery();
sqlConnection.Close();
return ReturnParam.Value.ToString();
}
Я делаю то же самое несколько раз в своем коде, но все они возвращают целые числа, поэтому не было ошибок, поэтому я знаю, что это должно работать. Ошибка cmd.ExecuteNonQuery()
на cmd.ExecuteNonQuery()
. Точная ошибка:
Conversion failed when converting the nvarchar value '(111)222-6666~29' to data type int.
Я понимаю, что я не могу преобразовать эту строку в целое число, но я не вижу нигде в своем коде. Я объявляю целое число, или я пытаюсь преобразовать.
Любая помощь будет оценена. Благодарю.
Вы вводите в заблуждение значение RETURN
для параметра OUTPUT
. RETURN - это необязательный код состояния типа INT
. Объявите другой параметр как OUTPUT.
Это означает, что это недопустимо в хранимой процедуре:
return @phoneID
Вместо этого добавьте @phoneID nvarchar(100) OUTPUT
в список параметров и удалите DECLARE @PhoneID
:
CREATE PROCEDURE GetRepPhoneID
(
@Rep NVARCHAR(100),
@phoneID NVARCHAR(100) OUTPUT
)
AS
SET NOCOUNT ON;
SELECT @phoneID = concat(CustomerRepPh, '~', RepID)
FROM Reps
WHERE CustomerRep = @Rep;
Вышеупомянутый представляет собой весь процесс. Вам не нужен RETURN
или SET
.
Затем в коде С# вам нужно изменить способ определения этого параметра:
SqlParameter ReturnParam = new SqlParameter("phoneID", SqlDbType.NVarChar, 100);
ReturnParam.Direction = ParameterDirection.Output;
Затем удалите эту строку, поскольку она не нужна, так как значение параметра останется после закрытия соединения:
string PhoneAndID = cmd.Parameters[1].Value.ToString();
И измените return
:
return ReturnParam.Value.ToString();
Наконец, вам, вероятно, необходимо обновить объявление входного параметра следующим образом:
SqlParameter CustomerParam = new SqlParameter("Rep", SqlDbType.NVarChar, 100);
CustomerParam.Value = Rep;
CustomerParam.Direction = ParameterDirection.Input;
String[1]: the Size property has an invalid size of 0.