2012-03-15 16 views
34

पर कॉल नहीं किया जा सकता है, मैं एक ऐसे एप्लिकेशन पर काम कर रहा हूं जहां कोई डेटाबेस से फिल्मों पर जानकारी प्राप्त कर सके और साथ ही फिल्मों को जोड़, अद्यतन और हटा सके। डेटाबेस में मेरे पास तीन टेबल हैं (मूवी, जेनर और मूवीगेन < - फिल्मों और उनकी शैली को स्टोर करता है)। सब कुछ एक चीज़ के अलावा ठीक काम करता है, और वह तब होता है जब किसी फिल्म को कोई शैलियों नहीं मिलती है (जो संभव होनी चाहिए)।डेटा शून्य है। इस विधि या संपत्ति को शून्य मान

समस्या नीचे दी गई विधि में होती है, और निम्न अपवाद फेंक दिया जाता है: डेटा शून्य है। इस विधि या संपत्ति को शून्य मानों पर नहीं कहा जा सकता है।

कारण (बेशक) यह है कि स्पोक शून्य हो जाता है क्योंकि फिल्म को कोई शैलियों नहीं मिला है, लेकिन मैं यह नहीं समझ सकता कि इस अपवाद को कैसे फेंक दिया जाए। जैसा कि मैंने कहा, शैली के किसी भी जानकारी को संग्रहीत किए बिना फिल्म को स्टोर करना संभव होना चाहिए।

अग्रिम धन्यवाद!

विधि:

public List<MovieGenre> GetMovieGenrebyMovieID(int movieID) { 

    using (SqlConnection conn = CreateConnection()) { 
     try { 

      SqlCommand cmd = new SqlCommand("dbo.usp_GetMovieGenreByMovieID", conn); 
      cmd.CommandType = CommandType.StoredProcedure; 

      cmd.Parameters.AddWithValue("@MovieID", movieID); 

      List<MovieGenre> movieGenre = new List<MovieGenre>(10); 

      conn.Open(); 

      using (SqlDataReader reader = cmd.ExecuteReader()) { 

       int movieGenreIDIndex = reader.GetOrdinal("MovieGenreID"); 
       int movieIDIndex = reader.GetOrdinal("MovieID"); 
       int genreIDIndex = reader.GetOrdinal("GenreID"); 

       while (reader.Read()) { 

        movieGenre.Add(new MovieGenre { 
         MovieID = reader.GetInt32(movieIDIndex), 
         MovieGenreID = reader.GetInt32(movieGenreIDIndex), 
         GenreID = reader.GetInt32(genreIDIndex) 
        }); 
       } 
      } 

      movieGenre.TrimExcess(); 

      return movieGenre; 
     } 
     catch { 
      throw new ApplicationException(); 
     } 
    } 
} 

sproc:

ALTER PROCEDURE usp_GetMovieGenreByMovieID 
@MovieID int 
AS 
BEGIN 
    BEGIN TRY 
     SELECT m.MovieID, g.GenreID, mg.MovieGenreID, g.Genre 
     FROM Movie AS m 
     LEFT JOIN MovieGenre AS mg 
      ON m.MovieId = mg.MovieID 
     LEFT JOIN Genre AS g 
      ON mg.GenreID = g.GenreID 
     WHERE m.MovieID = @MovieID 
    END TRY 
    BEGIN CATCH 
     RAISERROR ('Error while trying to receive genre(s).',16,1) 
    END CATCH 
END 
+9

यह: 'पकड़ {नई Appl फेंक icationException(); } 'एक बहुत बुरा विचार है। आप सभी संदर्भ जानकारी खो रहे हैं। कम से कम पकड़े हुए अपवाद को आंतरिक अपवाद के रूप में पास करें: 'पकड़ें (अपवाद पूर्व) {नया आवेदन अपवाद (पूर्व) फेंक दें; } ' –

उत्तर

47

आप ints में proc से शून्य मान परिवर्तित करने के लिए कोशिश कर रहा है नहीं किया जाना चाहिए - तो इससे पहले कि आप MovieGenre उदाहरण बनाने आप SqlDataReader.IsDBNull पद्धति का उपयोग करके नल क्षेत्रों जांच करने की आवश्यकता:

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.isdbnull.aspx

यह मानते हुए कि GenreID और MovieGenreID नल ints आप की तरह कुछ कर सकते हैं कर रहे हैं:

movieGenre.Add(new MovieGenre { 
    MovieID = reader.GetInt32(movieIDIndex), 
    MovieGenreID = reader.IsDBNull(movieGenreIDIndex) ? null : reader.GetInt32(movieGenreIDIndex), 
    GenreID = reader.IsDBNull(genreIDIndex) ? null : reader.GetInt32(genreIDIndex) 
}); 
+7

का उपयोग करता हूं, आपको कोडर को कोडर जोड़ने की आवश्यकता हो सकती है। आईएसडीएनबुल (movieGenreIDIndex)? (int?) शून्य: reader.GetInt32 (movieGenreIDIndex) – akd

5

संपादित अपने चुनिंदा बयान अशक्त मुद्दे को सुलझाने वाली इस प्रकार है।

SELECT ISNULL(m.MovieID,0) AS MovieID, 
     ISNULL(g.GenreID,0) AS GenreID, 
     ISNULL(mg.MovieGenreID,0) AS MovieGenreID, 
     ISNULL(g.Genre,'') AS Genre 
FROM --rest of your query... 
+0

उत्तर देने के लिए धन्यवाद। मैंने आपके कोड की कोशिश की लेकिन दुर्भाग्य से मुझे एक ही त्रुटि मिलती है:/ – holyredbeard

+0

मैंने केवल आपको दिखाने के लिए जेनरिड और जेनर कॉलम के लिए ISNULL का उपयोग किया था। आप इसे प्रत्येक कॉलम के लिए उपयोग कर सकते हैं ** सभी कॉलम शामिल करने के लिए अद्यतन ** – Kaf

2

सबसे आसान जवाब नल को गैर-शून्य मानों के साथ प्रतिस्थापित करना है। प्रयास करें:

ALTER PROCEDURE usp_GetMovieGenreByMovieID 
@MovieID int 
AS 
BEGIN 
    BEGIN TRY 
     SELECT m.MovieID, 
       coalesce(g.GenreID,0) GenreID, 
       coalesce(mg.MovieGenreID,0) MovieGenreID, 
       coalesce(g.Genre, 'Not Applicable') Genre 
     FROM Movie AS m 
     LEFT JOIN MovieGenre AS mg 
      ON m.MovieId = mg.MovieID 
     LEFT JOIN Genre AS g 
      ON mg.GenreID = g.GenreID 
     WHERE m.MovieID = @MovieID 
    END TRY 
    BEGIN CATCH 
     RAISERROR ('Error while trying to receive genre(s).',16,1) 
    END CATCH 
END 
+0

'coalesce' 'ISNULL' के लिए 1+ मेरे लिए काम नहीं करता है मैं MySQL – ygaradon

संबंधित मुद्दे