Inquiridor
Não grava no BD - SQL Express

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 TrystrSql.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 Stringstr =
"INSERT INTO logs(Data) VALUES (GetDate())"clsBd.ExecuteNonQuery(str, CommandType.Text)
Catch ex As ExceptionMessageBox.Show(ex.Message)
Finally If iRegistrosAfetados = 1 Then Call Me.CarregaList()MessageBox.Show(
"Registro incluido com sucesso") ElseMessageBox.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 TrystrSql =
"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 ExceptionMessageBox.Show(ex.Message)
End Try
Todas as Respostas
-
-
-
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???
-
-
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.
-
-
-
-
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.
-
-
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 parameterscmd.Parameters.Add(param)
Next param End IfVerificarConexao(cmd)
Return cmd End FunctionEu copiei todo o conteúdo do seu artigo.
-
-
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.
-
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
-
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 muitoalgué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 -
-
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