Хранимая процедура не видит параметры или возвращает ошибку типа данных преобразования - PullRequest
1 голос
/ 20 октября 2011

Я столкнулся с довольно раздражающей проблемой, которую, похоже, не могу найти в корне. Я искал в Интернете похожие проблемы - и я нашел несколько оставшихся без ответа на других форумах - так что я решил попробовать.

Следующий WebMethod веб-сервиса связывается с базой данных, которая работает нормально и выполняет хранимую процедуру.

Проблема в том, что, когда я передаю параметры как отдельные символы, он говорит мне, что не может найти ни один из параметров, а когда я передаю полный параметр "ean", он сообщает мне следующее сообщение об ошибке:

System.Data.OleDb.OleDbException: Error converting data type varchar to int.
   at System.Data.OleDb.OleDbDataReader.ProcessResults(OleDbHResult hr)
   at System.Data.OleDb.OleDbDataReader.NextResult()
   at System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)
   at System.Data.OleDb.OleDbCommand.ExecuteReader(CommandBehavior behavior)
   at System.Data.OleDb.OleDbCommand.ExecuteReader()
   at Service.GetOthersRatings(Int32 personID, String ean)

А теперь вот Webmethod:

[WebMethod(Description = "GetRatings")]
public string GetRatings(int personID, string ean)
{
    string ratings = "";
    OleDbConnection connection = new OleDbConnection(connectionString);
    OleDbCommand command = new OleDbCommand("GetRatings", connection);
    command.CommandType = CommandType.StoredProcedure;
    command.Parameters.Add("@personID",OleDbType.Integer,10).Value = personID;
    command.Parameters.Add("@ean",OleDbType.VarChar,30).Value = ean;
    try
    {
        connection.Open();
        myReader = command.ExecuteReader();
        if (myReader.HasRows)
        {
            while (myReader.Read())
            {
                ratings = myReader.GetString(0);
            }
        }
        else
        {
            ratings = "Null";
        }
    }
   catch (Exception e)
    {
        ratings = "Error - " + e.ToString();
    }
    finally
    {
    }
    return ratings;
}

Одна вещь, о которой стоит упомянуть, это то, что, если я удаляю OUTPUT часть SP, он работает нормально и возвращает

    ratings = "Null";

Но, увидев, что я пытаюсь прочитать строку из читателя, я не понимаю, почему она не будет работать с выводом varchar из SP.

В базе данных у нас есть соответствующая хранимая процедура, которая отлично работает, если только выполняется в SQL Server Management Studio:

IF ( OBJECT_ID('GetRatings') IS NOT NULL ) 
DROP PROCEDURE GetRatings
GO

CREATE PROCEDURE GetRatings
    @ratingschars           varchar(36) = NULL OUTPUT,
    @personID               int,
    @ean                    varchar(30)

AS
BEGIN TRAN
SET NOCOUNT ON;
    BEGIN
    DECLARE @pris varchar(2)
    DECLARE @forventet varchar(2)
    DECLARE @smag varchar(2)
    DECLARE @count varchar(30)

    IF EXISTS(SELECT * FROM feedback where personID = @personID AND ean = @ean)
        BEGIN 
            SELECT @pris = (SELECT CAST(pris AS varchar(2)) FROM feedback   where personID = @personID AND ean = @ean)
            SELECT @forventet = (SELECT CAST(forventet AS varchar(2)) FROM feedback where personID = @personID AND ean = @ean)
            SELECT @smag = (SELECT CAST(smag AS varchar(2)) FROM feedback where personID = @personID AND ean = @ean)
            SELECT @ratingschars = @pris + @forventet + @smag
        END
    ELSE
        BEGIN
            SELECT @pris = (SELECT CAST(avg(pris) AS varchar(2)) FROM feedback WHERE ean = @ean)
            SELECT @forventet += (SELECT CAST(avg(forventet) AS varchar(2)) FROM feedback WHERE ean = @ean)
            SELECT @smag += (SELECT CAST(avg(smag) AS varchar(2)) FROM feedback WHERE ean = @ean)
            SELECT @count += (SELECT CAST(count(*) AS varchar(30)) FROM feedback WHERE ean = @ean)
            SELECT @ratingschars = @pris + @forventet + @smag + @count
        END
    END
COMMIT TRAN

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

Ответы [ 3 ]

1 голос
/ 20 октября 2011

Хранимая процедура имеет три параметра, где, как и в вашем коде, вы добавили только два параметра.Поэтому добавьте третий параметр как OutPut type.

EDIT:

Хранимая процедура:

ALTER PROCEDURE SampleProc

@no1 int,
@no2 int,
@result int OUTPUT
AS
  set @result=@no1+@no2
RETURN

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

cmd.CommandText = "SampleProc"
cmd.CommandType = CommandType.StoredProcedure
cmd.Connection = cn

Dim no1 as New OleDbParameter("@no1", OleDbType.Integer)
Dim no2 as New OleDbParameter("@no2", OleDbType.Integer)
Dim resultas New OleDbParameter("@result", OleDbType.Integer)
result.Direction = ParameterDirection.Output

no1.Value = 10
no2.Value = 20

cmd.Parameters.Add(no1)
cmd.Parameters.Add(no2)
cmd.Parameters.Add(result)

cn.Open()
cmd.ExecuteNonQuery()
cn.Close()

Dim returnResult as Integer 
returnResult=CType(result.Value,Integer)
1 голос
/ 20 октября 2011

Вы можете попробовать следующее?

command.Parameters.AddWithValue("@personID", personID);
command.Parameters.AddWithValue("@ean", ean);
0 голосов
/ 20 октября 2011

Также, IF EXISTS(...) ... ELSE ... можно заменить на:

IF EXISTS(SELECT * FROM feedback where personID = @personID AND ean = @ean)
    BEGIN 
        SELECT  @ratingschars 
                = CAST(pris AS varchar(2)) 
                + CAST(forventet AS varchar(2)) 
                + CAST(smag AS varchar(2))
        FROM    feedback   
        WHERE   personID = @personID 
        AND     ean = @ean
    END
ELSE
    BEGIN
        SELECT  @ratingschars
                = CAST(avg(pris) AS varchar(2))      --or STR
                + CAST(avg(forventet) AS varchar(2)) --or STR
                + CAST(avg(smag) AS varchar(2))      --or STR
                + CAST(count(*) AS varchar(11))
        FROM    feedback 
        WHERE   ean = @ean
    END
END

или

SELECT  @ratingschars --Question: all these columns (pris, forventet, smag) are NOT NULL ?
        = CAST(pris AS varchar(2)) 
        + CAST(forventet AS varchar(2)) 
        + CAST(smag AS varchar(2))
FROM    feedback   
WHERE   personID = @personID 
AND     ean = @ean

IF @ratingschars IS NULL
    BEGIN
        SELECT  @ratingschars
                = CAST(avg(pris) AS varchar(2))
                + CAST(avg(forventet) AS varchar(2))
                + CAST(avg(smag) AS varchar(2))
                + CAST(count(*) AS varchar(30))
        FROM    feedback 
        WHERE   ean = @ean
    END
...