none
Gravar dados no sqlexpress 2005 RRS feed

  • Pergunta

  • Ola pessoal sou iniciante em programção de paginas asp net e  C# .

     

    Estou com uma duvida, gostaria de saber como faço para inserir dados em uma tabela gerada de um relacionamento de n para n.
    Tenho uma tabela de pescadores e uma de apetrechos relacionadas de n para n gerendo uma outra tabela chamada aptpesc.
    Nessa tabela são gravados o cod do pescador e o codigo do apetrecho. Bem o que eu quero e pegar os codigos dos apetrecho que estão em  um listbox e a matricula do registro do pescador e gravar nessa tabela. o usuário pode selecionar mais de um apetrecho por pescador. Desejo fazer isso na hora que o usuario esta gravando o registro do pescador se possivel.
     
    Ex: o pescador pode pescar com arpão e tarrafa.
    OBS: o código do pescador é gerado automaticamente no BD
     
    alguem pode me ajudar.
    terça-feira, 19 de fevereiro de 2008 15:47

Respostas

  • Olá Stevens,

     

    Quando você for gravar o registro do pescador, faz primeiro o insert dele, e logo em seguida captura o id que acabou de ser inserido usando o SELECT @@IDENTITY, se estiver usando uma procedure, cria uma variável para armazenar o valor do identity cadastrado.

     

    Veja um exemplo:

     

    Code Snippet
     

    DECLARE @ID_PESCADOR INT

     

    INSERT INTO tb_pescador(Nome, Idade)

    VALUES('José', 42)

    SELECT @ID_PESCADOR = @@IDENTITY

     

    INSERT INTO tb_pescador_apetrecho(id_pescador, apetrecho)

    VALUES(@ID_PESCADOR, 'isca')

     

     

    Espero ter ajudado.

     

    []s

     

    PS: Se o post for útil, marque-o como resposta! ;-)

    terça-feira, 19 de fevereiro de 2008 17:29
  •  Carlos Monteiro wrote:

    Olá Stevens,

     

    Então cara, seguindo o seu exemplo, vc vai ter que criar um parâmetro de saída, no seu código e na procedure, e depois que vc executa, vc consegue capturar o valor que foi inserido. Vou colocar um exemplo aqui, para vc se basear.

     

    Veja a procedure como fica:

     

    Code Snippet

     

    ALTER PROCEDURE PROC_EXEMPLO

     

    @NOME VARCHAR(10),

    @IDADE INT,

    @ID_EXEMPLO INT OUTPUT -- PARÂMETRO DE SAÍDA

     

    AS

    INSERT INTO TB_EXEMPLO(NOME, IDADE)

    VALUES(@NOME, @IDADE)

    SELECT @ID_EXEMPLO = @@IDENTITY

     

    Para lhe mostrar um exemplo, eu criei um projeto novo, e coloquei no form um botão e um label, dentro do botão fiz assim:

     

    Code Snippet

    private void button1_Click(object sender, EventArgs e)

    {

    SqlConnection conn = new SqlConnection(@"SUA STRING DE CONEXAO AQUI");

     

    SqlCommand cmd = new SqlCommand("PROC_EXEMPLO", conn);

    cmd.CommandType = CommandType.StoredProcedure;

     

    cmd.Parameters.AddRange(new SqlParameter[]

    {

    new SqlParameter("@NOME",SqlDbType.VarChar),

    new SqlParameter("@IDADE",SqlDbType.Int),

    new SqlParameter("ID_EXEMPLO", SqlDbType.Int)

    });

     

    cmd.Parameters[0].Value = "FULANO DA SILVA";

    cmd.Parameters[1].Value = 27;

     

    //Configuro o parâmetro como de saída

    cmd.Parameters[2].Direction = ParameterDirection.Output;

     

    conn.Open();

     

    cmd.ExecuteNonQuery();

     

    //Atribui ao label do formulário o valor do parâmetro, que no caso é o id que acabou de ser inserido

    label1.Text = cmd.Parameters[2].Value.ToString();

     

    conn.Close();

    }

     

     

    Usei a mesma sintaxe de criação de parametros que vc colocou no seu código.

     

    Espero ter ajudado.

     

    []s

     

    PS: Se o post foi útil, marque-o como resposta! ;-)

    sexta-feira, 22 de fevereiro de 2008 11:23

Todas as Respostas

  • Olá Stevens,

     

    Quando você for gravar o registro do pescador, faz primeiro o insert dele, e logo em seguida captura o id que acabou de ser inserido usando o SELECT @@IDENTITY, se estiver usando uma procedure, cria uma variável para armazenar o valor do identity cadastrado.

     

    Veja um exemplo:

     

    Code Snippet
     

    DECLARE @ID_PESCADOR INT

     

    INSERT INTO tb_pescador(Nome, Idade)

    VALUES('José', 42)

    SELECT @ID_PESCADOR = @@IDENTITY

     

    INSERT INTO tb_pescador_apetrecho(id_pescador, apetrecho)

    VALUES(@ID_PESCADOR, 'isca')

     

     

    Espero ter ajudado.

     

    []s

     

    PS: Se o post for útil, marque-o como resposta! ;-)

    terça-feira, 19 de fevereiro de 2008 17:29
  • Carlos valeu pela dica. Mas me tira um dúvida como faço para gravar mais de um apetrecho por pescador.

    Na minha aplicação  eu tenho um cheboxlist usando um datsource para a tabela de apetrechos.

    Quero gravar na tabela tb_pescador_apetrecho a matricula do pescador e os codigos dos apetrechos marcado no checkboxlist.

     

    terça-feira, 19 de fevereiro de 2008 19:13
  • Olá novamente Stevens,

     

    Então, você terá que pegar o id do pescador com o @@IDENTITY e fazer um loop para percorrer todos os dados do datalist, ai dentro do loop vc faz o insert com os dados desejados.

     

    Qualquer coisa, posta seu código, a gente ja trabalha em cima dele.

     

    Espero ter ajudado.

     

    []s

    terça-feira, 19 de fevereiro de 2008 20:51
  •  

    Ola Carlos, tentei fazer mas não consegui guardar o id do pescador em uma variavel para depois poder inserir na outra tabela este Id.

    Este é o código do metodo onde eu gravo o registro do pescador ;

    E logo abaixo tem o codigo onde eu guardo os valores do listbox que contem os apetrechos de pesca 

     

     

    private void save()

    {

    //definição da string de conexão

    using (SqlConnection connteste = new SqlConnection(this.stringConnection))

    {

    string cpfAuxinput = TextBoxCPF.Text;

    cpfAuxinput = cpfAuxinput.Trim();

    cpfAuxinput = cpfAuxinput.Replace(".", "").Replace("-", "");

    //Cria um objeto do tipo comando passando como parametro o comando sql e a string de conexão

    SqlCommand cmd = new SqlCommand("usp_pescador_insert", connteste);

    cmd.CommandType = CommandType.StoredProcedure;

    cmd.Parameters.AddRange(new SqlParameter[] {

    new SqlParameter("@pes_id",SqlDbType.Int),

    new SqlParameter("@nome",SqlDbType.VarChar),

    new SqlParameter("@rg",SqlDbType.VarChar),

    new SqlParameter("SSP",SqlDbType.VarChar),

    new SqlParameter("@cpf",SqlDbType.VarChar),

    new SqlParameter("@apelido",SqlDbType.VarChar),

    new SqlParameter("@dtnasc",SqlDbType.DateTime),

    new SqlParameter("@tel",SqlDbType.VarChar),

    new SqlParameter("@cel",SqlDbType.VarChar),

    new SqlParameter("@endereco",SqlDbType.VarChar),

    new SqlParameter("@bairro",SqlDbType.VarChar),

    new SqlParameter("@cep",SqlDbType.VarChar),

    new SqlParameter("@sexo",SqlDbType.VarChar),

    new SqlParameter("@num",SqlDbType.NVarChar),

    new SqlParameter("@compl",SqlDbType.VarChar),

    new SqlParameter("@munic",SqlDbType.VarChar),

    new SqlParameter("@col_id",SqlDbType.Int),

    new SqlParameter("@res_cod",SqlDbType.Int),

    new SqlParameter("@categoria",SqlDbType.VarChar),

    new SqlParameter("@dtcad",SqlDbType.DateTime),

    new SqlParameter("@dtvalidade",SqlDbType.DateTime),

    new SqlParameter("@situacao",SqlDbType.VarChar),

    new SqlParameter("@viacarteira",SqlDbType.Int)

    });

    cmd.Parameters[0].Direction = ParameterDirection.InputOutput;

    cmd.Parameters[0].Value = this.id;

    cmd.Parameters[1].Value = this.TextBoxNome.Text;

    cmd.Parameters[2].Value = this.TextBoxRG.Text;

    cmd.Parameters[3].Value = this.TextBoxSSP.Text;

    cmd.Parameters[4].Value = cpfAuxinput;

    cmd.Parameters[5].Value = this.TextBoxApelido.Text;

    cmd.Parameters[6].Value = Convert.ToDateTime(this.TextBoxNasc.Text);

    cmd.Parameters[7].Value = this.TextBoxTel.Text;

    cmd.Parameters[8].Value = this.TextBoxcelular.Text;

    cmd.Parameters[9].Value = this.TextBoxEndereco.Text;

    cmd.Parameters[10].Value = this.TextBoxbairro.Text;

    cmd.Parameters[11].Value = this.TextBoxCEP.Text;

    cmd.Parameters[12].Value = this.RadioButtonListsexo.SelectedValue;

    cmd.Parameters[13].Value = this.TextBoxnum.Text;

    cmd.Parameters[14].Value = this.TextBoxComplemento.Text;

    cmd.Parameters[15].Value = this.TextBoxMunicipio.Text;

    cmd.Parameters[16].Value = this.DropDownListColonias.SelectedValue;

    cmd.Parameters[17].Value = this.DropDownListAcudes.SelectedValue;

    cmd.Parameters[18].Value = this.RadioButtonListCategoria.SelectedValue;

    cmd.Parameters[19].Value = Convert.ToDateTime(this.TextBoxDtCadastro.Text);

    cmd.Parameters[20].Value = Convert.ToDateTime(this.TextBoxValidade.Text);

    cmd.Parameters[21].Value = this.RadioButtonListSituacao.SelectedValue;

    cmd.Parameters[22].Value = 1;

    try

    {

    //abre a conexao

    connteste.Open();

    //executa o comando com os parametros que foram adicionados acima

    i = cmd.ExecuteNonQuery();

    //fecha a conexao

    connteste.Close();

    }

    catch (SqlException ex) { this.showMessage(ex.Message); }

    catch (Exception ex) { this.showMessage(ex.Message); }

    }

    //Limpar WebForm

    clearFields();

    }

     

    exemplo de  código para capturar o código do apetrecho;

    string msg ="";

    foreach (ListItem cbl in Listbox1.Items)

    {

    if (cbl.Selected == true)

    {

      msg += cbl.Value + " is selected." + " " ;

    }

     

    Gostaria de saber se da pra fazer com um tableadapter, criando essa tabela adicionando as linhas com os valores do @@IDENTITY e  os valores do listbox e depois gravando no BD. Se vc poder me enviar um exemplo ficarei grato.
    quarta-feira, 20 de fevereiro de 2008 19:32
  • Olá Stevens,

     

    Então cara, seguindo o seu exemplo, vc vai ter que criar um parâmetro de saída, no seu código e na procedure, e depois que vc executa, vc consegue capturar o valor que foi inserido. Vou colocar um exemplo aqui, para vc se basear.

     

    Veja a procedure como fica:

     

    Code Snippet

     

    ALTER PROCEDURE PROC_EXEMPLO

     

    @NOME VARCHAR(10),

    @IDADE INT,

    @ID_EXEMPLO INT OUTPUT -- PARÂMETRO DE SAÍDA

     

    AS

    INSERT INTO TB_EXEMPLO(NOME, IDADE)

    VALUES(@NOME, @IDADE)

    SELECT @ID_EXEMPLO = @@IDENTITY

     

    Para lhe mostrar um exemplo, eu criei um projeto novo, e coloquei no form um botão e um label, dentro do botão fiz assim:

     

    Code Snippet

    private void button1_Click(object sender, EventArgs e)

    {

    SqlConnection conn = new SqlConnection(@"SUA STRING DE CONEXAO AQUI");

     

    SqlCommand cmd = new SqlCommand("PROC_EXEMPLO", conn);

    cmd.CommandType = CommandType.StoredProcedure;

     

    cmd.Parameters.AddRange(new SqlParameter[]

    {

    new SqlParameter("@NOME",SqlDbType.VarChar),

    new SqlParameter("@IDADE",SqlDbType.Int),

    new SqlParameter("ID_EXEMPLO", SqlDbType.Int)

    });

     

    cmd.Parameters[0].Value = "FULANO DA SILVA";

    cmd.Parameters[1].Value = 27;

     

    //Configuro o parâmetro como de saída

    cmd.Parameters[2].Direction = ParameterDirection.Output;

     

    conn.Open();

     

    cmd.ExecuteNonQuery();

     

    //Atribui ao label do formulário o valor do parâmetro, que no caso é o id que acabou de ser inserido

    label1.Text = cmd.Parameters[2].Value.ToString();

     

    conn.Close();

    }

     

     

    Usei a mesma sintaxe de criação de parametros que vc colocou no seu código.

     

    Espero ter ajudado.

     

    []s

     

    PS: Se o post foi útil, marque-o como resposta! ;-)

    quarta-feira, 20 de fevereiro de 2008 20:53
  •  Carlos Monteiro wrote:

    Olá Stevens,

     

    Então cara, seguindo o seu exemplo, vc vai ter que criar um parâmetro de saída, no seu código e na procedure, e depois que vc executa, vc consegue capturar o valor que foi inserido. Vou colocar um exemplo aqui, para vc se basear.

     

    Veja a procedure como fica:

     

    Code Snippet

     

    ALTER PROCEDURE PROC_EXEMPLO

     

    @NOME VARCHAR(10),

    @IDADE INT,

    @ID_EXEMPLO INT OUTPUT -- PARÂMETRO DE SAÍDA

     

    AS

    INSERT INTO TB_EXEMPLO(NOME, IDADE)

    VALUES(@NOME, @IDADE)

    SELECT @ID_EXEMPLO = @@IDENTITY

     

    Para lhe mostrar um exemplo, eu criei um projeto novo, e coloquei no form um botão e um label, dentro do botão fiz assim:

     

    Code Snippet

    private void button1_Click(object sender, EventArgs e)

    {

    SqlConnection conn = new SqlConnection(@"SUA STRING DE CONEXAO AQUI");

     

    SqlCommand cmd = new SqlCommand("PROC_EXEMPLO", conn);

    cmd.CommandType = CommandType.StoredProcedure;

     

    cmd.Parameters.AddRange(new SqlParameter[]

    {

    new SqlParameter("@NOME",SqlDbType.VarChar),

    new SqlParameter("@IDADE",SqlDbType.Int),

    new SqlParameter("ID_EXEMPLO", SqlDbType.Int)

    });

     

    cmd.Parameters[0].Value = "FULANO DA SILVA";

    cmd.Parameters[1].Value = 27;

     

    //Configuro o parâmetro como de saída

    cmd.Parameters[2].Direction = ParameterDirection.Output;

     

    conn.Open();

     

    cmd.ExecuteNonQuery();

     

    //Atribui ao label do formulário o valor do parâmetro, que no caso é o id que acabou de ser inserido

    label1.Text = cmd.Parameters[2].Value.ToString();

     

    conn.Close();

    }

     

     

    Usei a mesma sintaxe de criação de parametros que vc colocou no seu código.

     

    Espero ter ajudado.

     

    []s

     

    PS: Se o post foi útil, marque-o como resposta! ;-)

    sexta-feira, 22 de fevereiro de 2008 11:23
  • Carlos valeu mesmo funcionou direitinho. Eu não estava entendo era como juntar as duas partes, o código do pescador e a lista de apetrechos. Valeu obrigado.

     

    Minha tira só umas duvidas;

    Na minha página asps tenho uns componentes databound(listbox, e dropdownlists) e tenho para cada um o seu respectivo data source. Quero saber se é uma forma correta de se trabalhar com páginas aps net ou é e melhor fazer, da seguinte forma criar uma conexão, depois um adapter, um dataset, um datview e depois fazer um databinding dos controles citados, sei que dessa forma fica desconectado do banco. Minha duvida é se com os datasources que falei estou trabalhando de modo desconectado.

     

    Tambem quero saber se voce pode me indicar um site onde eu consiga material para trabalhar com aplicações em n camadas, pq no meu aplicativo uso apenas codbehind e coloco os metodos para executar as funçoes de banco e tudo mais para cada página. Não acho que seja a forma correta mas com estou aprendendo.

     

     

    Mais uma vez Obrigado pela dica.

    sexta-feira, 22 de fevereiro de 2008 11:34
  •  

    Ola Stevens,

     

    Então, na verdade cara, o DataSet é um objeto custoso para aplicações web, eu aconselho você a utilizá-lo somente se for necessário, do contrário, a performance será melhor se vc preencher seus controles percorrendo um datareader, que é conectado, porém ele permanecerá conectado somente até preencher os controles, depois disso, você fecha a conexão e destroi o objeto.

     

    Quanto ao desenvolvimento em camadas, da uma olhada nesses, são muito bons:

     

    http://www.macoratti.net/07/11/aspn_cds.htm

    http://imasters.uol.com.br/artigo/3763/dotnet/arquitetura_net_-_camada_de_componentes_de_acesso_a_dados/

    http://www.macoratti.net/vbn_3cm.htm

    http://www.microsoft.com/brasil/msdn/Tecnologias/vsnet/CamadadeDados.mspx

     

    Espero ter ajudado.

     

    []s

     

    sexta-feira, 22 de fevereiro de 2008 12:43