Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #57 da revista programar. Faz já o download aqui!

Sir Pereira

[RESOLVIDO] Algoritmia com base de dados

Mensagens Recomendadas

Sir Pereira    3
Sir Pereira

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:)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
jpaulino    106
jpaulino

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!

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
M6    72
M6

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".

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Sir Pereira    3
Sir Pereira

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?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
jpaulino    106
jpaulino

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 ?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Sir Pereira    3
Sir Pereira

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Sir Pereira    3
Sir Pereira

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()

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Sir Pereira    3
Sir Pereira

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()

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
jpaulino    106
jpaulino

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()

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Sir Pereira    3
Sir Pereira

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...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Sir Pereira    3
Sir Pereira

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:

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
jpaulino    106
jpaulino

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 ?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Sir Pereira    3
Sir Pereira

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
jpaulino    106
jpaulino

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)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Sir Pereira    3
Sir Pereira

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?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
jpaulino    106
jpaulino

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 ?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Sir Pereira    3
Sir Pereira

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
jpaulino    106
jpaulino

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Sir Pereira    3
Sir Pereira

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

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


×

Aviso Sobre Cookies

Ao usar este site você aceita a nossa Política de Privacidade