मैं एक परेशान करने वाली समस्या में भाग गया हूँ जिसकी जड़ तक मैं नहीं पहुँच सकता। मैंने इसी तरह की समस्याओं के लिए इंटरनेट पर खोज की है - और मुझे अन्य फ़ोरम में कुछ अनुत्तरित मिले हैं - इसलिए मैंने सोचा कि मैं इसे यहाँ जाने दूँगा।

एक 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 के आउटपुट में बदलने की कोशिश की है। मैं स्तब्ध हूँ - मुझे मदद चाहिए।

1
GoD1x 20 अक्टूबर 2011, 12:55

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)
1
kv-prajapati 20 अक्टूबर 2011, 14:36
यह मुझे और मिला, धन्यवाद अब यह मुझे रेटिंग = "नल" पर लौटाता रहता है, लेकिन मुझे इसे वहां से लेने में सक्षम होना चाहिए .. ऐसा नहीं लगता था कि मुझे उस पैरामीटर को पास करने की आवश्यकता होगी जिसका मैं उपयोग कर रहा हूं आउटपुट
 – 
GoD1x
20 अक्टूबर 2011, 13:23
ठीक है, मैंने अपने एसपी को काम करने के लिए मिला है - हालांकि मुझे पाठक को कुछ भी पढ़ने के लिए नहीं मिल रहा है। यह कहता रहता है .hasRows गलत है - कोई विचार है कि वह क्या हो सकता है?
 – 
GoD1x
20 अक्टूबर 2011, 14:14
- रीडर और कनेक्शन ऑब्जेक्ट को बंद करने के बाद आप आउटपुट पैरामीटर से एक मान प्राप्त कर सकते हैं। स्ट्रिंग का प्रयोग करें v=outParameter.Value;
 – 
kv-prajapati
20 अक्टूबर 2011, 14:25

क्या आप निम्न कोशिश कर सकते हैं?

command.Parameters.AddWithValue("@personID", personID);
command.Parameters.AddWithValue("@ean", ean);
1
Junaid 20 अक्टूबर 2011, 13:05
क्या आप @ratingschars varchar(36) OUTPUT NULL को हटाने का प्रयास कर सकते हैं? जैसा कि @AVD ने सुझाव दिया है, क्या आप आउटपुट पैरामीटर के लिए एक चर जोड़ने का उपयोग कर सकते हैं? यह लिंक मदद कर सकता है …
 – 
Junaid
20 अक्टूबर 2011, 13:22

साथ ही, 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
0
Bogdan Sahlean 20 अक्टूबर 2011, 18:33