• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Dkid

C# e SQL Insert (SQLSERVER)

20 mensagens neste tópico

boas pessoal,

Eu estou a tentar fazer um insert, o qual já testei e consegui enviar os dados para a base de dados

        public bool NovoCliente(string nome, string morada, int nif, string contacto, string outrocontacto)
        {
            return (ligacao.SqlString("insert into tblcliente values('0','" + nome + "','" + morada + "','" + nif + "','" + contacto + "','" + outrocontacto + "');"));
        }

Problema:

Dado que a base de dados tem um autoincrement na identificacao, pensei que ao colocar um Zero no lugar da identificacao a base de dados depois "corrigi-se" para o id acima do ultimo.

Isso não acontece, e assim só vejo como solução ser eu a defenir o id na aplicacao, o que gostava de evitar.

Que solução tenho ?

Já li acerca do @@Identity e do Scope_Identity mas não percebo como os imbutir no meu código.

Obrigado pela vossa atenção

Dkid

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não precisas de fazer nada disso basta não coloque nada na inserção. Por exemplo tens os campos ID, nome e morada, na inserção utilizas apenas o nome e a morada, omitindo o ID

O @@Identity é para retornar o número inserido através de um ExecuteScalar(), para saberes qual o ID innserido.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não precisas de fazer nada disso basta não coloque nada na inserção. Por exemplo tens os campos ID, nome e morada, na inserção utilizas apenas o nome e a morada, omitindo o ID

O @@Identity é para retornar o número inserido através de um ExecuteScalar(), para saberes qual o ID innserido.

Boas, eu ja tinha tentado isso que disses-te, ficando assim:

            return (ligacao.SqlString("insert into tblcliente values('" + nome + "','" + morada + "','" + nif + "','" + contacto + "','" + outrocontacto + "');"));

E retorna-me um erro : Insert Error: "Column name or number of supplied values does not match table definition."

E assim volto ao mesmo....

Obrigado pela atenção

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas, eu ja tinha tentado isso que disses-te, ficando assim:

            return (ligacao.SqlString("insert into tblcliente values('" + nome + "','" + morada + "','" + nif + "','" 
+ contacto + "','" + outrocontacto + "');"));

E retorna-me um erro : Insert Error: "Column name or number of supplied values does not match table definition."

E assim volto ao mesmo....

Obrigado pela atenção

Sim, como estás a passar menos parâmetros do que colunas a tabela tem ele não consegue adivinhar onde queres que meta os dados. Na query tens que dizer em que colunas é que queres meter os dados, tipo:

INSERT INTO tblcliente (nome , morada , nif )

VALUES ('José', 'Rua das Couves',123123123)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Seguindo o que dizes vitortomaz, o resultado é:

"Cannot insert the value NULL into column 'id_cliente', table 'base.mdf.dbo.TblCliente'; column does not allow nulls. INSERT fails."

Desculpa o atraso na resposta, mas andei a tentar várias formas de por isto a funcionar, mas não consegui...

cumps

Obrigado pela atenção

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Seguindo o que dizes vitortomaz, o resultado é:

"Cannot insert the value NULL into column 'id_cliente', table 'base.mdf.dbo.TblCliente'; column does not allow nulls. INSERT fails."

Desculpa o atraso na resposta, mas andei a tentar várias formas de por isto a funcionar, mas não consegui...

cumps

Obrigado pela atenção

Mostra lá o que tens e o campo 'id_cliente' é chave primária, autoincrement ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas, por agora é só o que tenho para testar o inserir com o Cliente... dando num dá no resto....

    class BaseDados
    {
        private Ligacao ligacao;
        public BaseDados()
        {
            ligacao = new Ligacao("Provider=SQLOLEDB;Server=.\\SQLExpress;AttachDbFilename=C:\\Program Files\\Microsoft SQL Server\\MSSQL.1\\MSSQL\\Data\\base.mdf;Database=gppbase.mdf; Trusted_Connection=Yes;");
        }

        #region Cliente

        public bool NovoCliente(string nome, string morada, int nif, string contacto, string outrocontacto)
        {
            return (ligacao.SqlString("insert into tblcliente(nome,morada,nif,telefone,outro_contacto) values('" + nome + "','" + morada + "','" + nif + "','" + contacto + "','" + outrocontacto + "');"));
        }
#endregion

Agora na base de dados, que foi criada com o "SQL Server Management Studio Express" eu declarei o id_cliente como chave primaria.... não fiz mais nada, pois disseram-me que automaticamente a chave primaria seria autoincrement.... talvez o problema esteja ai....

Como sei se está como autoincrement ?

Obrigado pela atenção e pela paciência

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Por defeito nunca é autoincrement  ;)

Seleccionas o campo e defines no "Identify Specification" o campo "Is Identity" como "yes". Ele automáticamente coloca o increment e a seed = 1.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas, obrigado pela resposta, ainda me custou a encontrar o que me dizias para fazer, mas obrigado, é isso mesmo e já está a funcionar correctamente ;)

Muito obrigado

Uma ultima pergunta, como estou a testar a aplicacao-base dados, quando terminar e a base de dados posso resetar os campos todos para voltarem a ser preenchidos do zero ?

Obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Uma ultima pergunta, como estou a testar a aplicacao-base dados, quando terminar e a base de dados posso resetar os campos todos para voltarem a ser preenchidos do zero ?

Obrigado

Queres a maneira simples ou complicada  ;) estou a brincar.

Há quem faça de várias maneira, e todas são eficazes:

1 - Renomeias o teu campo (por exemplo para cliente_id1) e crias um novo com o nome que querer (para cliente_id). Apagas o cliente_id1 e defines o cliente_id como chave primária e como "Is Identity";

2 - Crias um stored procedure, apagas tudo e utilizas o seguinte código:

           DBCC CHECKIDENT (tblcliente, RESEED, 0);

Seleccionas esta linha, clicas com o botão direito do rato e seleccionas "Run Selection". Já está!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Uma ultima pergunta, como estou a testar a aplicacao-base dados, quando terminar e a base de dados posso resetar os campos todos para voltarem a ser preenchidos do zero ?

Eu crio sempre as base de dados através de script, sempre que prentendo fazer alterações ou reset na base de dados é muito mais fácil. Outra facilidade é, se quiseres levar essa bd para outro computador, só tens q levar o script e não a base de dados toda. (Em desenvolvimento em equipa isto é muito útil)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu crio sempre as base de dados através de script, sempre que prentendo fazer alterações ou reset na base de dados é muito mais fácil. Outra facilidade é, se quiseres levar essa bd para outro computador, só tens q levar o script e não a base de dados toda. (Em desenvolvimento em equipa isto é muito útil)

Boas, pois se fosse mysql também seria tudo feito à mão, mas é SqlServer, e praticamente não me adaptei à forma como as coisas são tratadas

Muito obrigado a todos por terem disponibilizado um pouco da vossa paciencia e tempo

Obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas, pois se fosse mysql também seria tudo feito à mão, mas é SqlServer

Eu uso SQLServer, sempre usei :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu uso SQLServer, sempre usei :thumbsup:

Mas não usas através do Visual Studio, pois não ?

Eu como uso diferentes versões de SQL não posso usar os scripts para criar as tabelas. :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas não usas através do Visual Studio, pois não ?

Eu como uso diferentes versões de SQL não posso usar os scripts para criar as tabelas. :)

Uso o Visual Studio como IDE mas para mexer na base de dados uso o Management Studio.

EDIT: Mas também dá para criar tabelas com script no VS, fazes uma query e em vez de select... metes lá o script de criação  :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

EDIT: Mas também dá para criar tabelas com script no VS, fazes uma query e em vez de select... metes lá o script de criação  :)

Não se for uma versão antiga do SQL (versão 7). Na 2005 dá e acho que a 2000 também dá.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não se for uma versão antiga do SQL (versão 7). Na 2005 dá e acho que a 2000 também dá.

Ok, eu como só uso a partir da 2005 não sabia a retrocompatibilidade  :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ok, eu como só uso a partir da 2005 não sabia a retrocompatibilidade  :)

Outra das vantagens do DBCC CHECKIDENT é que quando fazes testes na máquina final (inseres e depois apagas registos) existem números que se “perdem”. Usando esta função é reposta a numeração, não ficando a tabela com números saltados.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas, eu uso o SQL Server Management Studio Express, mas só me disseram: vais usar isto e isto e faz-se assim (drag and drop)

Não que esteja a gostar muito.... mas pronto..

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas, eu uso o SQL Server Management Studio Express, mas só me disseram: vais usar isto e isto e faz-se assim (drag and drop)

Não que esteja a gostar muito.... mas pronto..

Isso é quase anti-programação  :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora