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

Sir Pereira

[RESOLVIDO] Algoritmia com base de dados

24 mensagens neste tópico

Boas,

é assim, tenho uma base de dados de um jogo, e cada vez que crio um novo jogo, imaginemos que vou iniciar um novo jogo, em cima de outro previamente criado com o mesmo nome (logo, já tem as tabelas criadas).

E, vai dar-me erro porque as tabelas já existem, e eu gostaria de verificar se já existem ou não, mas não sei como o fazer em SQLite  :wallbash:

Cumprimentos

(jpaulino salvador também aguardo pela tua resposta  :cheesygrin:)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Então mas sempre que inicias o jogo crias as tabelas ? Porque não as limpas apenas no inicio de um novo jogo em vez de as criares ? Não tem muita lógica!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Deves criar a bd e as tabelas apenas durante a instalação.

Durante a desinstalação deves remover a bd.

Durante o desenvolvimento, se não queres estar a instalar e desinstalar cada vez que fazes o teste, basta verificares se a BD existe, se sim, fazes o que for necessário (limpar tabelas, criar informação base, etc.) de forma a teres um novo jogo "limpo".

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Esta parte ainda a cheguei a resolver ontem, fiz um try para verificar se o ficheiro da base de dados existisse, para o apagar e criar um novo com o nome que o outro tinha. Obrigado :)

Edit:

Ah, outra coisa, não me sabem dizer no SQLite.Net um objecto que dê para, por ex: verificar se uma tabela existe?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Esta parte ainda a cheguei a resolver ontem, fiz um try para verificar se o ficheiro da base de dados existisse, para o apagar e criar um novo com o nome que o outro tinha. Obrigado :)

Edit:

Ah, outra coisa, não me sabem dizer no SQLite.Net um objecto que dê para, por ex: verificar se uma tabela existe?

Mas porque não crias a tabela e só adicionas e apagas dados ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Porque o jogo vai ter vários saves, logo a informação de cada jogo vai estar guardada em cada um.

Jogo de gestão futebolística, dados individuais.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pensava eu que isto já estava resolvido  :wallbash:

Agora sem eu ter mexido no código dá-me o erro da exception  :dontgetit:

            Dim f As New SaveFileDialog
            f.Filter = "Ficheiros ProFoot (*.pfoot)|*.pfoot"
            f.InitialDirectory = Application.StartupPath & "/saves/"
            f.ShowDialog()
            'Criar Base de Dados
            Dim SQLconnect As New SQLite.SQLiteConnection()

            Try
                If My.Computer.FileSystem.FileExists(f.FileName) Then
                    My.Computer.FileSystem.DeleteFile(f.FileName)
                End If
            Catch ex As Exception
                MsgBox("Ocorreu um erro.")
            End Try

            'Database não existe, logo foi criada
            SQLconnect.ConnectionString = "Data Source=" & f.FileName & ";"
            SQLconnect.Open()
            Dim SQLcommand As New SQLite.SQLiteCommand
            SQLcommand = SQLconnect.CreateCommand

            SQLcommand.CommandText = "CREATE TABLE 'clube' ('id' INTEGER PRIMARY KEY AUTOINCREMENT, 'nome' TEXT, 'sigla' TEXT, 'ano_fundado' INT, 'finanças_receitas' INT, 'finanças_despesas' INT, 'localidade' TEXT, 'simbolo' TEXT, 'liga' TEXT, 'estadio' TEXT, 'estadio_imagem' TEXT, 'staff_treinador' TEXT, 'staff_treinadoradjunto' TEXT, 'staff_presidente' TEXT, 'staff_directordesportivo' TEXT, 'outros_maioresrivais' TEXT, 'outros_nrsocios' INT, 'outros_transferencias_maiorpaga' INT, 'outros_transferencias_maiorrecebida' INT, 'outros_cor' TEXT, 'finanças_balanço' INT)"
            SQLcommand.ExecuteNonQuery()
            SQLcommand.CommandText = "CREATE TABLE 'jogador' ('id' INTEGER PRIMARY KEY AUTOINCREMENT, 'nome' TEXT, 'posiçao' TEXT, 'clube' TEXT, 'anonascimento' INT, 'qualidade' INT, 'nacionalidade' TEXT)"
            SQLcommand.ExecuteNonQuery()

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Então mas tu apagas sempre a base de dados! Tens de fechar todas as ligações antes de a apagares.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Alterei para isto, porque assim acho que não há qualquer conflito! Então eu apenas estou a ver dos ficheiros, criar a base de dados e mexer nas ligações é só depois. Mas continua a dar o erro.

            Dim f As New SaveFileDialog
            f.Filter = "Ficheiros ProFoot (*.pfoot)|*.pfoot"
            f.InitialDirectory = Application.StartupPath & "/saves/"
            f.ShowDialog()


            Try
                If My.Computer.FileSystem.FileExists(f.FileName) Then
                    My.Computer.FileSystem.DeleteFile(f.FileName)
                End If
            Catch ex As Exception
                MsgBox("Ocorreu um erro.")
            End Try

            'Criar Base de Dados
            Dim SQLconnect As New SQLite.SQLiteConnection()

            'Database não existe, logo foi criada
            SQLconnect.ConnectionString = "Data Source=" & f.FileName & ";"
            SQLconnect.Open()
            Dim SQLcommand As New SQLite.SQLiteCommand
            SQLcommand = SQLconnect.CreateCommand

            SQLcommand.CommandText = "CREATE TABLE 'clube' ('id' INTEGER PRIMARY KEY AUTOINCREMENT, 'nome' TEXT, 'sigla' TEXT, 'ano_fundado' INT, 'finanças_receitas' INT, 'finanças_despesas' INT, 'localidade' TEXT, 'simbolo' TEXT, 'liga' TEXT, 'estadio' TEXT, 'estadio_imagem' TEXT, 'staff_treinador' TEXT, 'staff_treinadoradjunto' TEXT, 'staff_presidente' TEXT, 'staff_directordesportivo' TEXT, 'outros_maioresrivais' TEXT, 'outros_nrsocios' INT, 'outros_transferencias_maiorpaga' INT, 'outros_transferencias_maiorrecebida' INT, 'outros_cor' TEXT, 'finanças_balanço' INT)"
            SQLcommand.ExecuteNonQuery()
            SQLcommand.CommandText = "CREATE TABLE 'jogador' ('id' INTEGER PRIMARY KEY AUTOINCREMENT, 'nome' TEXT, 'posiçao' TEXT, 'clube' TEXT, 'anonascimento' INT, 'qualidade' INT, 'nacionalidade' TEXT)"
            SQLcommand.ExecuteNonQuery()

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Alterei para isto, porque assim acho que não há qualquer conflito! Então eu apenas estou a ver dos ficheiros, criar a base de dados e mexer nas ligações é só depois. Mas continua a dar o erro.

Estou a ver um SQLconnect.Open() e onde está o SQLconnect.Close()

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E? Esses é suposto não interferirem, pois aquilo já vai criar o novo ficheiro, fazendo logo o Connect, porque isto elimina o ficheiro antes, logo não pode haver qualquer tipo de interferência...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E não fazes mais nenhum connect antes disso que fique em aberto ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

De qualquer maneira se estás a apagar porque não limpas apenas ? O nome é o mesmo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nop. Tá aqui o código todo do form:

Public Class Dados2


   Private Sub botao_seguinte_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles botao_seguinte.Click
       If campotexto_password.Text <> campotexto_passwordconfirmacao.Text Then
           MsgBox("As passwords não coincidem, por favor volte a escrevê-las.", MsgBoxStyle.Information + MsgBoxStyle.OkOnly, "ProFoot - Volte a escrever a password")
       Else
           Dim f As New SaveFileDialog
           f.Filter = "Ficheiros ProFoot (*.pfoot)|*.pfoot"
           f.InitialDirectory = Application.StartupPath & "/saves/"
           f.ShowDialog()


           Try
               If My.Computer.FileSystem.FileExists(f.FileName) Then
                   My.Computer.FileSystem.DeleteFile(f.FileName)
               End If
           Catch ex As Exception
               MsgBox("Ocorreu um erro.")
           End Try

           'Criar Base de Dados
           Dim SQLconnect As New SQLite.SQLiteConnection()

           'Database não existe, logo foi criada
           SQLconnect.ConnectionString = "Data Source=" & f.FileName & ";"
           SQLconnect.Open()
           Dim SQLcommand As New SQLite.SQLiteCommand
           SQLcommand = SQLconnect.CreateCommand

           SQLcommand.CommandText = "CREATE TABLE 'clube' ('id' INTEGER PRIMARY KEY AUTOINCREMENT, 'nome' TEXT, 'sigla' TEXT, 'ano_fundado' INT, 'finanças_receitas' INT, 'finanças_despesas' INT, 'localidade' TEXT, 'simbolo' TEXT, 'liga' TEXT, 'estadio' TEXT, 'estadio_imagem' TEXT, 'staff_treinador' TEXT, 'staff_treinadoradjunto' TEXT, 'staff_presidente' TEXT, 'staff_directordesportivo' TEXT, 'outros_maioresrivais' TEXT, 'outros_nrsocios' INT, 'outros_transferencias_maiorpaga' INT, 'outros_transferencias_maiorrecebida' INT, 'outros_cor' TEXT, 'finanças_balanço' INT)"
           SQLcommand.ExecuteNonQuery()
           SQLcommand.CommandText = "CREATE TABLE 'jogador' ('id' INTEGER PRIMARY KEY AUTOINCREMENT, 'nome' TEXT, 'posiçao' TEXT, 'clube' TEXT, 'anonascimento' INT, 'qualidade' INT, 'nacionalidade' TEXT)"
           SQLcommand.ExecuteNonQuery()
           SQLcommand.CommandText = "CREATE TABLE 'jogadorhumano' ('id' INTEGER PRIMARY KEY AUTOINCREMENT, 'nome' TEXT, 'clube' TEXT, 'anonascimento' INT, 'password' TEXT, 'email' TEXT, 'data' DATE)"
           SQLcommand.ExecuteNonQuery()
           SQLcommand.CommandText = "INSERT INTO jogadorhumano (nome, anonascimento, password) VALUES ('" & Dados1.campotexto_nome.Text & "', '" & campotexto_anonascimento.Text & "', '" & campotexto_password.Text & "');"
           SQLcommand.ExecuteNonQuery()
           SQLcommand.CommandText = "INSERT INTO clube (nome, ano_fundado, finanças_balanço, outros_nrsocios, outros_cor, simbolo) VALUES ('Sporting Clube de Portugal, SAD', '1906', '5000000', '500000', 'green', '1')"
           SQLcommand.ExecuteNonQuery()
           SQLcommand.CommandText = "INSERT INTO clube (nome, ano_fundado, finanças_balanço, outros_nrsocios, outros_cor, simbolo) VALUES ('Futebol Clube do Porto, SAD', '1900', '15000000', '700000', 'blue', '3')"
           SQLcommand.ExecuteNonQuery()
           SQLcommand.CommandText = "INSERT INTO clube (nome, ano_fundado, finanças_balanço, outros_nrsocios, outros_cor, simbolo) VALUES ('Sport Lisboa e Benfica, SAD', '1901', '25000000', '1000000', 'red', '2')"
           SQLcommand.ExecuteNonQuery()
           SQLconnect.Close()
           Dados3.Show()
           Me.Hide()
           My.Settings.NomedaBD = f.FileName
           My.Settings.Save()
       End If

   End Sub
End Class

E em relação ao apagar: é por causa do sistema de saves, a não ser que saibas outra maneira de eu fazer os saves sem guardar a informação... :dontgetit:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E em relação ao apagar: é por causa do sistema de saves, a não ser que saibas outra maneira de eu fazer os saves sem guardar a informação... :dontgetit:

Explica lá melhor isto ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Explica lá melhor isto ?

Tipo, imagina que o jogador faz o jogo com o Sporting, fica na base de dados com o nome que ele escolhe toda a informação do jogo.

Imagina que, não querendo o jogador apagar o outro jogo, resolve começar outro.

Vai ter outra base de dados individual para o outro jogo. E sempre assim sucessivamente.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podes simplesmente criar um novo campo com o código do jogo. Por exemplo o "0001" é o jogo 1 e sempre que iniciar um novo jogo incrementas este número. Tudo o que gravaras utilizas esse código como identificador e depois é só filtrares pelo número do jogo.

Deste modo podes lista os jogos que o utilizador tem em aberto (com um simples GROUP BY), estatistica, etc.

Para apagar, e caso queiras, tenta renomear primeiro e depois, no arranque do programa apagas todos. (tipo *.old)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A ideia é boa, agora tenho é de perceber como a aplicar, o meu esquema de tabelas é este:

clube

|- id

|- nome

|- sigla

|- ano_fundado

|- finanças_receitas

|- finanças_despesas

|- localidade

|- simbolo

|- liga

|- estadio

|- estadio_imagem

|- staff_treinador

|- staff_treinadoradjunto

|- staff_presidente

|- staff_directordesportivo

|- outros_maioresrivais

|- outros_nrsocios

|- outros_transferencias_maiorpaga

|- outros_transferencias_maiorrecebida

|- finanças_balanço

|- outros_cor

jogador

|- id

|- nome

|- posiçao

|- clube

|- anonascimento

|- nacionalidade

|- qualidade

jogador_humano

|- id

|- nome

|- clube

|- anonascimento

|- password

|- email

Onde é que eu iria integrar isso?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Humm, tem deixa lá ver ... o jogador é o mesmo e o jogador_humano também, talvés apenas no clube. Não tens jogos, registos transferências, mais informação ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Humm, tem deixa lá ver ... o jogador é o mesmo e o jogador_humano também, talvés apenas no clube. Não tens jogos, registos transferências, mais informação ?

Queria integrar isso à medida que ia avançando no jogo.

E o jogador e jogador_humano não são os mesmos.

O jogador_humano é o utilizador que vai jogar.

O jogador é o elemento do clube.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Aii pah, pera ai que já tou confuso LOL

Mas assim como é que os dados 'vão perceber' se são de um jogo ou de outro?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

No clube tens o número do jogo, e nas próximas tabelas utilizas sempre esse número (ID). Enquanto estiveres nesse jogo tudo o que registares, registas com esse número e todas as pesquisas ou recolhas de informação filtras por ele.

Por exemplo:

Mostra dados do clube:

"SELECT * FROM clube WHERE IDJOGO = " & NumeroDoJogo

Mostra a localidade:

SELECT localidade FORM clube WHERE IDJOGO = " & NumeroDoJogo

etc

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Hmm obrigado pela explicação. Vou experimentar ;)

Mas tipo há SQL's em que eu já faço um WHERE, dá para fazer dois?

Tou a fazer assim, pode ser?:

            SQLcommand.CommandText = "CREATE TABLE 'clube' ('id' INTEGER PRIMARY KEY AUTOINCREMENT, 'codigo_jogo' INTEGER AUTOINCREMENT, 'nome' TEXT, 'sigla' TEXT, 'ano_fundado' INT, 'finanças_receitas' INT, 'finanças_despesas' INT, 'localidade' TEXT, 'simbolo' TEXT, 'liga' TEXT, 'estadio' TEXT, 'estadio_imagem' TEXT, 'staff_treinador' TEXT, 'staff_treinadoradjunto' TEXT, 'staff_presidente' TEXT, 'staff_directordesportivo' TEXT, 'outros_maioresrivais' TEXT, 'outros_nrsocios' INT, 'outros_transferencias_maiorpaga' INT, 'outros_transferencias_maiorrecebida' INT, 'outros_cor' TEXT, 'finanças_balanço' INT)"
            SQLcommand.ExecuteNonQuery()

e pela lógica que eu tou a seguir ficaria assim o INSERT?:

            SQLcommand.CommandText = "INSERT INTO clube (codigo_jogo, nome, ano_fundado, finanças_balanço, outros_nrsocios, outros_cor, simbolo) VALUES ('1', 'Sport Lisboa e Benfica, SAD', '1901', '25000000', '1000000', 'red', '2')"
            SQLcommand.ExecuteNonQuery()

e se meto o AUTOINCREMENT como é que ele vai saber em que número vai? é preciso tar sempre a ler da tabela?

outra questão, e se eu quiser por exemplo o nome do jogador_humano, como faço para fazer o WHERE e ir buscar o codigo_jogo à tabela clube, já que tou a trabalhar na tabela jogador_humano?

ai tanta dúvida :P

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