2016-08-17 2 views
0

J'ai créé Maintenance du code membre dans lequel je récupérer l'ID membres, Nom et toutes les choses de base Mon code est le suivant:Essayer de récupérer la valeur du paramètre d'une autre bibliothèque de classes

private void Mem_Maintenance_Load(object sender, EventArgs e) 
{ 
    try 
    { 
     txt_mem_id.Text = Generate_no.gen_no("MEM").ToString(); 
    } 
    catch(Exception Ex) 
    { 
     MessageBox.Show("Error\n\n"+Ex.ToString()); 
    } 
} 

I ont créé une bibliothèque nommée ClassLibrary code dont se présente comme suit

namespace LIBRARY 
{ 
public class Generate_no 
{ 
    public static int gen_no(string P_PRM_TYPE) 
    { OleDbConnection connection = new OleDbConnection(); 
     connection.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=E:\arekh\MS Access\soc_data.accdb;Persist Security Info=False;"; 
     connection.Open(); 
     int v_last_no = 0; 
     OleDbCommand command = new OleDbCommand(); 
     command.Connection = connection; 
     string query = @"select PARM_VALUE from soc_parm_mast where PARM_TYPE = '" + P_PRM_TYPE + "';"; 
     command.CommandText = query; 
     OleDbDataReader reader = command.ExecuteReader(); 
     reader.Read(); 
     v_last_no = Int32.Parse(reader["PARM_VALUE"].ToString()) + 1; 
     reader.Close(); 
     command.CommandText = @"update soc_parm_mast set PARM_VALUE = PARM_VALUE+1 where PARM_TYPE = " + P_PRM_TYPE + ";"; 
     command.ExecuteNonQuery(); 
     connection.Close(); 
     return v_last_no; 
    } 
} 
} 

Mais lors de l'exécution d'une erreur est à venir

System.FormatException: La chaîne d'entrée n'était pas un format incorrect à LIBRARY.Generate_no.gen_no (String P_PRM_TYPE)

+0

Pas une réponse mais - Veuillez ne pas utiliser la concaténation de chaîne pour créer des requêtes sql. Il est sensible aux injections de Sql. Utilisez [Requêtes paramétrées] (https://msdn.microsoft.com/en-us/library/bb738521 (v = vs.100) .aspx) –

+0

Je l'ai essayé dans d'autres programmes.Il fonctionne correctement.quel est le problème en utilisant la concaténation. –

+0

Ya il va bien sûr fonctionner mais comme je viens de le dire ... injections Sql - le chercher –

Répondre

0
command.CommandText = @"update soc_parm_mast set PARM_VALUE = PARM_VALUE+1 where PARM_TYPE = '" + P_PRM_TYPE + "';"; 

Vous étiez absent des guillemets simples dans la déclaration de mise à jour

+0

Je ne pense pas que cela provoquera 'System.FormatException' –

+0

Rien n'est changé dans l'erreur. –

0

La ligne v_last_no = Int32.Parse(reader["PARM_VALUE"].ToString()) + 1; provoquant l'erreur spécifiée, le Int32.Parse lancera FormatException si l'entrée n'est pas convertible. Donc, je vous conseille fortement d'utiliser Int32.TryParse(). Ensuite, le code sera comme suit:

public static int gen_no(string P_PRM_TYPE) 
{ 
    using (OleDbConnection connection = new OleDbConnection(@"Connection string here")) 
    { 
     connection.Open(); 
     int v_last_no = 0; 
     using (OleDbCommand command = new OleDbCommand()) 
     { 
      command.Connection = connection; 
      string query = @"select PARM_VALUE from soc_parm_mast where PARM_TYPE = @P_PRM_TYPE"; 
      command.CommandText = query; 
      command.Parameters.AddWithValue("@P_PRM_TYPE", P_PRM_TYPE); 
      OleDbDataReader reader = command.ExecuteReader(); 
      reader.Read(); 
      if (!Int32.TryParse(reader["PARM_VALUE"].ToString(), out v_last_no)) 
      { 
       // Conversion failed, Show message if needed  
       // v_last_no will be 0 
      } 
      reader.Close(); 
     } 
     using (OleDbCommand command = new OleDbCommand()) 
     { 
      command.CommandText = @"update soc_parm_mast set PARM_VALUE = PARM_VALUE+1 where PARM_TYPE [email protected]_PRM_TYPE"; 
      command.Parameters.AddWithValue("@P_PRM_TYPE", P_PRM_TYPE); 
      command.ExecuteNonQuery(); 
     } 
    } 

    return v_last_no; 
} 

Un autre conseil pour vous: méfiez-vous d'injection SQL en utilisant la chaîne concaténée sous forme de requêtes. Utilisez plutôt des requêtes paramétrées.

+0

Désolé monsieur Je ne suis pas capable de comprendre ce que vous dites .. Je suis un débutant. –

+0

'if (! Int32.TryParse (lecteur [" PARM_VALUE "]. ToString(), sort v_last_no)) { MessageBox.Show (" Erreur \ n \ n "+ Ex.ToString()); v_last_no = 999; } v_last_no = v_last_no + 1; ' –

+0

@ A.Tiwari: jetez un oeil dans les mises à jour –