none
String para montar INSERT basico RRS feed

  • Pergunta

  • Boa tarde a todos, estou iniciando meus estudos em C#, pois, sempre trabalhei com Delphi.

    Gostaria de saber se a string do meu insert pode ser melhorada.

     

            public void Insert(int RegionID, string RegionDes)
            {
                StringBuilder sb = new StringBuilder();
                sb.Append("INSERT INTO Region (");
                sb.Append("  RegionID,");
                sb.Append("  RegionDescription)");
                sb.Append("VALUES(");
                sb.Append(RegionID.ToString() + ", ");
                sb.Append("'").Append(RegionDes.Trim()).Append("'").Append(")");
            }

    Obrigado!

    quarta-feira, 12 de outubro de 2011 20:49

Respostas

  • Entendi... bom, assim seu método Command está preso aos parâmetros, então seria mais prático executar o comando dentro do método insert..

    Uma possibilidade poderia ser a seguinte:

    Altere seu método Command:

     private int Command(string stSQL, params SqlParameter[] parametros)
            { 
                using(SqlConnection SqlCon = new SqlConnection(StringConexao))
                {
                    SqlCon.Open();
                    SqlCommand cmd = new SqlCommand(stSQL, SqlCon);
                    
                    cmd.Parameters.AddRange(parametros);
    
                    return cmd.ExecuteNonQuery();
                }            
            }
    


    E no seu método Insert, faça assim:

    public int Insert(int RegionID, string RegionDes)
            {
                StringBuilder sb = new StringBuilder();
                sb.Append("INSERT INTO Region (RegionID, RegionDescription)");
                sb.Append("VALUES(@RegionId,@RegionDescription)");
    
                SqlParameter regionID = new SqlParameter("@RegionID", 
    RegionID);
                SqlParameter regionDescription = new SqlParameter("@RegionDescription", RegionDescription);
    
                return this.Command(sb.ToString(), regionID, regionDescription);  
            }
    


     

    quarta-feira, 12 de outubro de 2011 22:52

Todas as Respostas

  • Rafael, 

     Que tal assim:

     

    StringBuilder sb = new StringBuilder();
    sb.Append("INSERT INTO Region (RegionID, RegionDescription)");
    sb.AppendFormat("VALUES({0},'{1}')", RegionID.ToString(), RegionDes.Trim());
    


     

    PS: Utilizando essa abordagem, tome cuidado com SqlInjection, já que você está adicionando os valores inseridos pelo usuário direto na query! Seria melhor utilizar um comando parametrizado, tipo assim:

     

    StringBuilder sb = new StringBuilder();
    sb.Append("INSERT INTO Region (RegionID, RegionDescription)");
    sb.Append("VALUES(@RegionId,@RegionDescription)");
    

     

    e na hora de executar, vc cria esses parâmetros no Command:

     

    SqlCommand cmd = new SqlCommand();
    cmd.Parameters.AddWithValue("@RegionID", RegionID);
    cmd.Parameters.AddWithValue("@RegionDescription", RegionDes.Trim());

     

    • Editado Diego Bim quarta-feira, 12 de outubro de 2011 20:59
    • Sugerido como Resposta Eder CostaModerator sexta-feira, 14 de outubro de 2011 12:42
    quarta-feira, 12 de outubro de 2011 20:55
  • Obrigado pelo help Diego,
    Então, para evitar o sqlinjection fiz conforme vc sugeriu, no meu teste na camada de interface o usuario chama o método insert e passa os parametros, na camada ADO eu criei uma função command, mas estou com dúvida em como modifica-la..
    Persistência:
        public class ADORegion
        {
            public readonly string StringConexao;
    
            public ADORegion()
            {
                this.StringConexao = "Data Source=PIMENTA-PC\\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True";
            }                     
    
    
            private int Command(string stSQL)
            { 
                using(SqlConnection SqlCon = new SqlConnection(StringConexao))
                {
                    SqlCon.Open();
                    SqlCommand cmd = new SqlCommand(stSQL, SqlCon);
                    cmd.Parameters.AddWithValue("@RegionID", RegionID);
                    cmd.Parameters.AddWithValue("@RegionDescription", RegionDes.Trim());
                    return cmd.ExecuteNonQuery();
                }            
            }
    
            public int Insert(int RegionID, string RegionDes)
            {
                StringBuilder sb = new StringBuilder();
                sb.Append("INSERT INTO Region (RegionID, RegionDescription)");
                sb.Append("VALUES(@RegionId,@RegionDescription)");
                return this.Command(sb.ToString());  
            }
    
        }
    
    Interface:
        public partial class Form1 : Form
        {
            private ADORegion adoReg;
            private DataTable RegionTable;
            
            public Form1()
            {
                adoReg = new ADORegion();
    
                InitializeComponent();
            }
    
            private void btnInsert_Click(object sender, EventArgs e)
            {
                adoReg.Insert(5, "Interior"); //Valores fixo para facilitar teste
                MessageBox.Show("Insert Realizado!");
            }	
         }
    


    quarta-feira, 12 de outubro de 2011 21:23
  • Eu deixei meu command da seguinte forma:

     

            private int Command(string stSQL, int RegionID, string RegionDes)
            { 
                using(SqlConnection SqlCon = new SqlConnection(StringConexao))
                {
                    SqlCon.Open();
                    SqlCommand cmd = new SqlCommand(stSQL, SqlCon);
                    cmd.Parameters.AddWithValue("@RegionID", RegionID);
                    cmd.Parameters.AddWithValue("@RegionDescription", RegionDes.Trim());
                    return cmd.ExecuteNonQuery();
                }            
            }

    E meu insert ficou assim:

            public int Insert(int RegionID, string RegionDes)
            {
                StringBuilder sb = new StringBuilder();
                sb.Append("INSERT INTO Region (RegionID, RegionDescription)");
                sb.Append("VALUES(@RegionId,@RegionDescription)");
                return this.Command(sb.ToString(), RegionID, RegionDes);  
            }
    Não sei se é o ideial...

    quarta-feira, 12 de outubro de 2011 21:30
  • Entendi... bom, assim seu método Command está preso aos parâmetros, então seria mais prático executar o comando dentro do método insert..

    Uma possibilidade poderia ser a seguinte:

    Altere seu método Command:

     private int Command(string stSQL, params SqlParameter[] parametros)
            { 
                using(SqlConnection SqlCon = new SqlConnection(StringConexao))
                {
                    SqlCon.Open();
                    SqlCommand cmd = new SqlCommand(stSQL, SqlCon);
                    
                    cmd.Parameters.AddRange(parametros);
    
                    return cmd.ExecuteNonQuery();
                }            
            }
    


    E no seu método Insert, faça assim:

    public int Insert(int RegionID, string RegionDes)
            {
                StringBuilder sb = new StringBuilder();
                sb.Append("INSERT INTO Region (RegionID, RegionDescription)");
                sb.Append("VALUES(@RegionId,@RegionDescription)");
    
                SqlParameter regionID = new SqlParameter("@RegionID", 
    RegionID);
                SqlParameter regionDescription = new SqlParameter("@RegionDescription", RegionDescription);
    
                return this.Command(sb.ToString(), regionID, regionDescription);  
            }
    


     

    quarta-feira, 12 de outubro de 2011 22:52