none
Não grava no BD - SQL Express RRS feed

  • Pergunta

  • mplementei uma classe de acesso ao BD, seguindo orientações do artigo http://www.projetando.net/Sections/ViewArticle.aspx?ArticleID=3 do Israel (DALHelper)

    Fiz tudo como demonstra o artigo, inclusive o banco de dados, em SQL 2005 Express.

    Quando cadastro um registro, ele atualiza o listbox, porém não grava no BD. Depois quando entro no sistema novamente, verifico que não salvou no BD. O que poderia estar acontecendo?

     

    'Código do Gravar

    Dim clsBd As New DB(strConexao, True)

    Dim iRegistrosAfetados As Integer = 0

    Dim strSql As New StringBuilder

    Try

    strSql.Append("INSERT INTO clientes (")

    strSql.Append("Nome,Email) ")

    strSql.Append("VALUES (")

    strSql.Append("@Nome,@Email)")

    Dim param() As SqlParameter = {clsBd.CriarParametro("@Nome", SqlDbType.VarChar, Me.txtNome.Text.Trim), _

    clsBd.CriarParametro("@Email", SqlDbType.VarChar, Me.txtEmail.Text.Trim)}

    iRegistrosAfetados = clsBd.ExecuteNonQuery(strSql.ToString, CommandType.Text, param)

    Dim str As String

    str = "INSERT INTO logs(Data) VALUES (GetDate())"

    clsBd.ExecuteNonQuery(str, CommandType.Text)

    Catch ex As Exception

    MessageBox.Show(ex.Message)

    Finally

    If iRegistrosAfetados = 1 Then

    Call Me.CarregaList()

    MessageBox.Show("Registro incluido com sucesso")

    Else

    MessageBox.Show("Ocorreu um erro ao tentar incluir o registro")

    End If

    End Try

     

    'Código para carregar o listbox

    Me.lstClientes.Items.Clear()

    Dim clsBd As New DB(strConexao, False)

    Dim Dr As SqlDataReader

    Dim strSql As String

    Try

    strSql = "SELECT * FROM clientes"

    Dr = clsBd.ExecuteReader(strSql.ToString, CommandType.Text)

    While Dr.Read

    Me.lstClientes.Items.Add(Dr("clienteid") & " - " & Dr("nome"))

    End While

    Catch ex As Exception

    MessageBox.Show(ex.Message)

    End Try

     

     

    quarta-feira, 20 de dezembro de 2006 17:31

Todas as Respostas

  • Verifique se não há abertura de uma transação sem q ela seja fechada...
    quarta-feira, 20 de dezembro de 2006 17:33
  • As unicas transcoes sao estas.

    E a DALHelper está montada da mesma forma demonstrada no artigo.

    O que poderia estar causando esse problema?

    quarta-feira, 20 de dezembro de 2006 17:37
  • Já aconteceu comigo, verifique se os parâmetros estão sendo passados corretamente para o DAL antes do insert.

    Se faltar algum parâmetro ou for enviado valor nulo que não seja permitido no banco isto pode acontecer, o certo seria o lançamento de uma exceção, mas percebi que nem sempre esta é corretamente lançada pelo framework.

    Será um bug???

    quarta-feira, 20 de dezembro de 2006 18:01
  • Dai John.

    Cara, eu to passando os parametros conforme mostra o codigo que passei no post. Nada demais.

    Você implementou o exemplo do artigo do Israel?

     

    quarta-feira, 20 de dezembro de 2006 18:15
  • Fala Igor,

    Não, estou fazendo um CMS para um cliente e estou usando o DAL porque facilita demais no desenvolvimento e percebi este "comportamento" do framework.

    Aconteceu em algumas tabelas e só fui descobrir o problema verificando os parâmetros que estava enviando para inserir itens no banco.

    Mas com tudo em cima funciona que é uma beleza e é ótimo pois não precisa ficar inserindo SQL em páginas aspx.

    quarta-feira, 20 de dezembro de 2006 18:23
  • Ola Igor,

    Em Values da sua primeira query não tem os nomes das colunas.
    quarta-feira, 20 de dezembro de 2006 18:24
  • Dai Israel.

    Não entendi sua resposta.

    strSql.Append("INSERT INTO clientes (Nome,Email) VALUES (@Nome,@Email)")

     

    Nome e Email são os nomes das colunas e depois @Nome e @Email são os parâmetros. Correto?

    Obrigado pela ajuda.

    quarta-feira, 20 de dezembro de 2006 18:29
  • Ola Igor,

    Mas no primeiro código não tem isso.
    quarta-feira, 20 de dezembro de 2006 18:35
  • Valeu pela ajuda Israel.

    No primeiro código tá assim:

    strSql.Append("INSERT INTO clientes (")

    strSql.Append("Nome,Email) ")

    strSql.Append("VALUES (")

    strSql.Append("@Nome,@Email)")

     

    Só mudei pra ficar mais fácil, mas no final das contas dá na mesma. E também alterando pra forma como passei por último, segue o mesmo problema.

    Não tenho idéia do que pode estar causando isso.

     

    quarta-feira, 20 de dezembro de 2006 18:39
  • Ola Igor,

    Qual a mensagem de erro?
    quinta-feira, 21 de dezembro de 2006 10:08
  • Dai Israel.

    Seguinte, quando criei as tabela clientes no BD, ja adicionei alguns registros. Agora deletei esses registros e tentei gravar no BD pelo sisteminha. Agora aparece esse erro:

    The SQLParameter is already contained by another SQLParameterCollection

     

    Fiz um debug e o erro ocorre no método CriarComando, que esta dessa forma:

    Public Function CriarComando(ByVal cmdText As String, ByVal cmdType As CommandType, ByVal ParamArray parameters() As SqlParameter) As SqlCommand

    Dim cmd As New SqlCommand(cmdText)

    cmd.CommandType = cmdType

    If Not (parameters Is Nothing) Then

    Dim param As SqlParameter

    For Each param In parameters

    cmd.Parameters.Add(param)

    Next param

    End If

    VerificarConexao(cmd)

    Return cmd

    End Function

     

    Eu copiei todo o conteúdo do seu artigo.

    quinta-feira, 21 de dezembro de 2006 14:00
  • Ola Igor,

    De certeza de que em algum momento você não está adicionando o mesmo parametro?
    quinta-feira, 21 de dezembro de 2006 14:15
  • Dai Isarel.

    Realmente eu estava chamando o mesmo método duas vezes. Corrigi esse problema, porém continua sem manter os dados no BD.

    Acredito que ele grave no BD, pois ele recarrega o ListBox com os dados gravados, mas não mantém esses dados, porque quando eu fecho e rodo novamente o aplicativo, os dados não estão lá.

    Já havia passado por isso antes?

    Obrigado pela atenção.

    quinta-feira, 21 de dezembro de 2006 15:03
  • Tive alguns problemas parecidos com o Sql Express e resolvi com um aconfiguração:

    Ao vincular o arquivo MDF do sql express ao seu projeto a propriedade "Copy to output directory" fica como "Copy always", e assim toda vez que vc compilar o seu projeto ele ira fazer uma copia nova do banco de dados para o diretorio da sua aplicação, mude esta propriedade "copy if newer" e apartir dai começa a manter a mesma cópia do banco de dados na pasta, deixando assim suas atualizações lá.

    Abraço

    quarta-feira, 3 de janeiro de 2007 17:56
  • Boa tarde, é isso aí. Caso tenha a opção "copy if newer" sempre que iniciar uma nova sessão do documento ele faz uma copia da base de dados e armazena ai os dados, não alterando na própria base de dados.


    Agora a minha pergunta é, e se eu quiser trabalhar directamente com a base de dados, sem fazer nenhuma cópia, tenho que alterar para "do not copy"? e como coloco na connectionString? Pk ao aceder à base de dados, caso tenha essa configuração dá a seguinte msg de erro:

    "An attempt to attach an auto-named database for file C:\Visual C#\\Manutenção Máquinas\bin\Debug\BDManutencao.mdf failed. A database with the same name exists, or specified file cannot be opened, or it is located on UNC share."

    Tentei tirar o campo atachdbfile=|Data Directory|\BDManutenção.mdf e coloquei apenas DataBase=BDManutencao.mdf, mas o problema é que agora dá erros de acesso. O que poderá ser? Alguma sugestão?

    Já agora e se não for abusar muito Smile alguém me sabe dizer como fazer para terminar o projecto, ou seja como criar o ficheiro final para utilizar em qualquer computador?

    Desde já obrigado
    sexta-feira, 14 de setembro de 2007 09:20
  • Olá.

    Será que ninguém me sabe responder à minha pergunta?

    Por favor pessoal, uma ajudinha.

    Obrigado
    terça-feira, 9 de outubro de 2007 17:01
  • Meu Caro,

     

    Estava com o mesmo problema que você porque também alterei a configuração "Copy to Output Directory" para "Do not copy" no meio do projeto.

    Pois bem, por definição quando você cria um Database ele espera que você deixe esta configuração em "Copy Always" e por isso se auto-configura pra isso pelo que entendi.

     

    Apanhei um pouco e descobri que no App.config do seu projeto você deve alterar a tag  <connectionStrings> na linha  connectionString altere a configuração  AttachDbFilename= com o caminho para a sua Database (C:.....database.Mdf).

     

    E só!!!

     

    Comigo resolveu!.

     

     

    Espero que te ajude.

     

    Abraço,

     

    Rafael

     

    sexta-feira, 4 de abril de 2008 16:45