मैं एक परेशान करने वाली समस्या में भाग गया हूँ जिसकी जड़ तक मैं नहीं पहुँच सकता। मैंने इसी तरह की समस्याओं के लिए इंटरनेट पर खोज की है - और मुझे अन्य फ़ोरम में कुछ अनुत्तरित मिले हैं - इसलिए मैंने सोचा कि मैं इसे यहाँ जाने दूँगा।
एक webservice की निम्न WebMethod एक डेटाबेस से संपर्क करता है, जो ठीक काम करता है, और एक संग्रहीत प्रक्रिया चलाता है।
समस्या यह है कि जब मैं पैरामीटर को एकल वर्णों के रूप में पास करता हूं तो यह मुझे बताता है कि यह किसी भी पैरामीटर को नहीं ढूंढ सकता है और जब मैं पूर्ण लंबाई "ईन" पैरामीटर पास करता हूं तो यह मुझे निम्न त्रुटि संदेश बताता है:
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(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;
}
एक बात जो ध्यान देने योग्य है वह यह है कि अगर मैं SP के OUTPUT भाग को हटा दूं, तो यह ठीक नीचे चला जाता है और वापस आ जाता है
ratings = "Null";
लेकिन यह देखते हुए कि मैं पाठक से एक स्ट्रिंग पढ़ने की कोशिश करता हूं, मुझे नहीं लगता कि यह एसपी से वर्चर आउटपुट के साथ क्यों काम नहीं करेगा।
डेटाबेस में हमारे पास संबंधित संग्रहीत प्रक्रिया है, जो SQL सर्वर प्रबंधन स्टूडियो में निष्पादित होने पर ठीक काम करती है:
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 जवाब
संग्रहीत-प्रक्रिया में तीन पैरामीटर होते हैं जहां आपके कोड में, आपने केवल दो पैरामीटर जोड़े हैं। तो OutPut के रूप में तीसरा पैरामीटर जोड़ें प्रकार।
संपादित करें:
संग्रहीत प्रक्रिया:
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)
क्या आप निम्न कोशिश कर सकते हैं?
command.Parameters.AddWithValue("@personID", personID);
command.Parameters.AddWithValue("@ean", ean);
@ratingschars varchar(36) OUTPUT
NULL को हटाने का प्रयास कर सकते हैं? जैसा कि @AVD ने सुझाव दिया है, क्या आप आउटपुट पैरामीटर के लिए एक चर जोड़ने का उपयोग कर सकते हैं? यह लिंक मदद कर सकता है …
साथ ही, 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
नए सवाल
asp.net
ASP.NET एक Microsoft वेब अनुप्रयोग विकास ढांचा है जो प्रोग्रामर को गतिशील वेब साइटों, वेब अनुप्रयोगों और वेब सेवाओं के निर्माण की अनुमति देता है। प्रोजेक्ट प्रकार टैग के साथ संयोजन के रूप में इस टैग का उपयोग करना उपयोगी है। [asp.net-mvc], [asp.net-webforms], या [asp.net-web-api]। ASP.NET Core के बारे में प्रश्नों के लिए इस टैग का उपयोग न करें - इसके बजाय [asp.net-core] का उपयोग करें।