2016-10-18 6 views
0

J'essaie d'insérer des données dans les tableaux principal et détaillé.ExecuteScalar ne lance pas d'exception

Mon principal Tableau req: Insert INTO tblMain();

Je suis en train de faire:

declare @OrderID as int; 
set @OrderID=scope_identity(); 
Update Orders SET OrderID=(LTRIM(RTRIM(OrderID))+ RIGHT('0000000'+CAST(@OrderID AS VARCHAR(7)),7)) WHERE [email protected]; 

SELECT @OrderID 

Je suis Insertion dans le tableau détaillé en utilisant la valeur de @OrderID comme Insert into tbl_Details(OrderID,SKU,amount) Values(@OrderID,NULL,20);

Si dans tbl_Details, SKU est Non null, je ne reçois pas d'exception si j'exécute toutes les requêtes dans ExecuteScalar à la fois et en passant SKU comme nulle.

Mon exécution funcion est:

public static double ExecuteScalarQuery(string SQL, ref string ErrMsg) 
{ 
    ErrMsg = ""; 
    using (SqlConnection conn = new SqlConnection(GetDBConn())) 
    { 
     SqlTransaction otrans = null; 
     double dblRetVa = 0; 
     try 
     { 
      conn.Open(); 
      otrans = conn.BeginTransaction(); 
      SqlCommand cmd = new SqlCommand(SQL, conn); 

      cmd.Transaction = otrans; 
      dblRetVa = double.Parse(cmd.ExecuteScalar().ToString()); 
      otrans.Commit(); 
      conn.Close(); 
     } 
     catch (Exception ex) 
     { 
      ErrMsg = ex.ToString().Trim(); 
      if (otrans != null) otrans.Rollback(); 
     } 
     return dblRetVa; 
    } 
} 

je la solution, mais pour que je vais devoir changer la signature de ma fonction comme ci-dessous:

public static double ExecuteNonQueryWithSelect(string SQL, string sQry2,string SelectColID , ref string ErrMsg) 
{ 
    ErrMsg = ""; 
    using (SqlConnection conn = new SqlConnection(GetDBConn())) 
    { 
     SqlTransaction otrans = null; 
     double dblRetVal = 0; 
     try 
     { 
      conn.Open(); 
      otrans = conn.BeginTransaction(); 

      SqlCommand cmd = new SqlCommand(SQL, conn); 

      cmd.Transaction = otrans; 
      dblRetVal = double.Parse(cmd.ExecuteScalar().ToString()); 

      SqlCommand cmd2 = new SqlCommand(sQry2.Replace(SelectColID.Trim(), dblRetVal.ToString()), conn); 

      cmd2.Transaction = otrans; 
      cmd2.ExecuteNonQuery(); 

      otrans.Commit(); 
      conn.Close(); 
     } 
     catch (Exception ex) 
     { 
      ErrMsg = ex.ToString().Trim(); 
      if (otrans != null) { otrans.Rollback(); dblRetVal = 0; } 
     } 
     return dblRetVal; 
    } 
} 

ce que je veux est de savoir si je peux faire une chose ant dans ma vieille fonction afin qu'elle lance une exception si un champ non nullable dans la table de détail est passé comme nul sans changer la signature de ma fonction.

Répondre

0

avez-vous essayé d'utiliser executenonquery()? Essayez d'utiliser DBNull au lieu de null dans votre validation, car vous comparez avec des nombres qui ne sont pas des chaînes.

+0

Je ne peux pas utiliser executenonquery puisque j'ai besoin de orderid en retour et aussi je concatène la requête principale et de détail dans une chaîne et en passant à la fonction. La même fonction est de travailler s'il y a une colonne incorrecte en détail mais ne fonctionne pas pour les champs non nullables lors de la transmission en tant que null. – ManojK

+0

Je ne veux pas changer la signature de la fonction ExecuteScalarQuery. – ManojK

+0

Essayez de changer 'if (otrans! = Null) otrans.Rollback();' à 'if (otrans! = DbNull.Value) otrans.Rollback();' – GNMercado