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