2017-02-06 1 views
1
SELECT 
    B.ID, R.COUNTRY_ID, R.LOOK_UP, R.VALUE 
FROM 
    BUSINESS_TABLE B 
INNER JOIN 
    MASTER_TABLE1 M1 on M1.MASTER_ID = B.B_ID 
LEFT JOIN 
    MASTER_TABLE2 M2 on M2.MASTER_ID = B.B_ID 
LEFT JOIN 
    ANOTHER_TABLE OT on OT.ID = M2.MASTER_ID 
LEFT JOIN 
    [dbo].[TEST_REFERENCE]R ON M2.C_ID = R.LOOK_UP 
WHERE 
    OT.ACTIVE = 1 

Dans les tableaux ci-dessus toutes les ID colonnes sont int sauf TEST_REFERENCE table ci-dessous« La conversion a échoué » erreur n'est pas capturé lors de l'exécution en C# ou procédure stockée

select * from [TEST_REFERENCE] 

ID   REF_CODE(varchar 200) LOOK_UP(varchar 200) VALUE(varchar 200) 
----  ---------    -----------    ------------ 
1   COUNTRY     1      FRANCE 
2   COUNTRY     2      GERMANY 
3   USER     POWER_USER    ADMIN 
4   USER     POWER_USER    MASTER 

La requête exemple ci-dessus (entrée par les utilisateurs) que je valide en utilisant C# et en l'insérant dans DB (si passé) à d'autres fins.

Et ci-dessous est l'erreur que je reçois lors de l'exécution de la requête dans SSMS directement.

Msg 245, niveau 16, état 1, ligne 10
La conversion a échoué lors de la conversion de la valeur varchar 'de POWER_USER' au type de données int.

Mais il n'y a pas d'erreur lors de l'exécution de la même requête en utilisant cmd.ExecuteNonQuery() ni dans la procédure stockée. Dans la procédure stockée, j'ai la requête seule dans une procédure stockée et l'exécution de la procédure dans C#/SSMS.

Apprécié dans n'importe qui donne des solution (s). Je sais que c'est à cause de la comparaison de varchar à int et j'ai une solution de contournement en coulant les valeurs. Mon exigence est de valider un type similaire de requêtes en utilisant C# (en tapant DB) et d'insérer dans DB seulement s'il passe en éliminant les requêtes erronées.

REMARQUE: cela fonctionne bien en C# (exception soulevée) lorsque nous avons seulement deux tables avec des conditions de jointure

+0

Eh bien, il semble 'MASTER_TABLE2.C_ID' est de type' int' ... – Pikoh

+0

ANOTHER_TABLE n'est pas LEFT JOIN-ed ici. Déplacez la condition WHERE à la clause ON pour obtenir le résultat réel LEFT JOIN. – jarlh

+0

Aucune gestion des erreurs dans storedproc ni dans ExecuteNonQuery(). Vous ne récupérez aucune information du succès de la commande. Essayez de l'ajouter. – PeterRing

Répondre

0

essayer cette

SELECT B.ID,R.COUNTRY_ID,Convert(Varchar,R.LOOK_UP) as LookUp,R.VALUE FROM BUSINESS_TABLE B 
INNER JOIN MASTER_TABLE1 M1 on M1.MASTER_ID = B.B_ID 
INNER JOIN MASTER_TABLE2 M2 on M2.MASTER_ID = B.B_ID 
LEFT JOIN ANOTHER_TABLE OT on OT.ID = M2.MASTER_ID 
LEFT JOIN [dbo].[TEST_REFERENCE]R ON M2.C_ID = R.LOOK_UP 
WHERE OT.ACTIVE = 1 
+0

Merci. J'ai ceci comme une solution de contournement mais c'est un de l'exemple et cela peut varier. Pouvez-vous me dire comment capturer des types d'erreurs similaires en C#? –

0

L'erreur est parce que vous essayez de comparer votre M2.C_ID qui est un entier qui est à R.LOOK_UPvarchar(200)

LEFT JOIN 
    [dbo].[TEST_REFERENCE]R ON M2.C_ID = R.LOOK_UP 
+0

Merci. J'ai un travail autour de cela en le moulant. Est-il possible de capturer ces erreurs en C# pour cette requête? –

+0

@SanjeevKumarR: vous pouvez utiliser try catch dans la procédure stockée –

0

accordin g à MSDN Documentation événement SqlConnection.InfoMessage se produit lorsque SQL Server renvoie un message d'avertissement ou d'information messageL

Clients qui veulent traiter des avertissements ou des messages d'information envoyés par le serveur devrait créer un délégué SqlInfoMessageEventHandler d'écouter cet événement. L'événement InfoMessage se produit lorsqu'un message avec une gravité de 10 ou moins est renvoyé par SQL Server. Les messages dont la gravité est comprise entre 11 et 20 génèrent une erreur et les messages dont la gravité est supérieure à 20 provoquent la fermeture de la connexion.

Pourriez-vous essayer et de vérifier les messages:

//SqlConnection connection = ...; 
connection.InfoMessage += new SqlInfoMessageEventHandler(OnInfoMessage); 

// ... create a SqlCommand from this connection and run cmd.ExecuteNonQuery() ... 

void OnInfoMessage(object sender, SqlInfoMessageEventArgs args) 
{ 
    foreach (SqlError err in args.Errors) 
    { 
     //Console.WriteLine 
     MessageBox.Show("The " + err.Source + " has received a severity " + err.Class + ", state " + err.State + "\n" + 
     "on line " + err.LineNumber + ":\n" + err.Message); 
    } 
} 
+0

avez-vous testé cela? Quel est votre avis? –

+0

Merci pour votre réponse. J'ai testé comme mentionné ci-dessus en utilisant 'InfoMessage' mais la méthode n'est pas exécutée pour la requête échouée. Aussi j'ai fait le réglage FireInfoMessageEventOnUserErrors = true manuellement même cela ne fonctionnait pas. –