Usuário com melhor resposta
Gravar dados no sqlexpress 2005

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 BDalguem pode me ajudar.
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 SnippetDECLARE
@ID_PESCADOR INTINSERT
INTO tb_pescador(Nome, Idade)VALUES
('José', 42)SELECT
@ID_PESCADOR = @@IDENTITYINSERT
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! ;-)
-
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 SnippetALTER
PROCEDURE PROC_EXEMPLO@NOME VARCHAR(10),
@IDADE
INT,@ID_EXEMPLO
INT OUTPUT -- PARÂMETRO DE SAÍDAAS
INSERT INTO TB_EXEMPLO(NOME, IDADE)
VALUES
(@NOME, @IDADE)SELECT
@ID_EXEMPLO = @@IDENTITYPara 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 Snippetprivate void button1_Click(object sender, EventArgs e){
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! ;-)
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 SnippetDECLARE
@ID_PESCADOR INTINSERT
INTO tb_pescador(Nome, Idade)VALUES
('José', 42)SELECT
@ID_PESCADOR = @@IDENTITYINSERT
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! ;-)
-
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.
-
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
-
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 conexaoconnteste.Open();
//executa o comando com os parametros que foram adicionados acimai = cmd.ExecuteNonQuery();
//fecha a conexaoconnteste.Close();
}
catch (SqlException ex) { this.showMessage(ex.Message); } catch (Exception ex) { this.showMessage(ex.Message); }}
//Limpar WebFormclearFields();
}
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." + " " ;}
-
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 SnippetALTER
PROCEDURE PROC_EXEMPLO@NOME VARCHAR(10),
@IDADE
INT,@ID_EXEMPLO
INT OUTPUT -- PARÂMETRO DE SAÍDAAS
INSERT INTO TB_EXEMPLO(NOME, IDADE)
VALUES
(@NOME, @IDADE)SELECT
@ID_EXEMPLO = @@IDENTITYPara 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 Snippetprivate void button1_Click(object sender, EventArgs e){
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! ;-)
-
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 SnippetALTER
PROCEDURE PROC_EXEMPLO@NOME VARCHAR(10),
@IDADE
INT,@ID_EXEMPLO
INT OUTPUT -- PARÂMETRO DE SAÍDAAS
INSERT INTO TB_EXEMPLO(NOME, IDADE)
VALUES
(@NOME, @IDADE)SELECT
@ID_EXEMPLO = @@IDENTITYPara 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 Snippetprivate void button1_Click(object sender, EventArgs e){
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! ;-)
-
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.
-
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://www.macoratti.net/vbn_3cm.htm
http://www.microsoft.com/brasil/msdn/Tecnologias/vsnet/CamadadeDados.mspx
Espero ter ajudado.
[]s