Jump to content

Consertar dbExec failed; (1) SQL logic error


Recommended Posts

Ao iniciar o resource essa mensagem é exibida
spacer.png
esse é o código que está dando erro, sinceramente não sei oque é pois não sei mexer nem um pouco em banco de dados

marker = {}
proposta = {}
vehicle = {}
dadosVenda = {}
dados = {}
blip_create = { }

addEventHandler("onResourceStart", resourceRoot,
function()
    db = dbConnect("sqlite", "dados.sqlite")
    dbExec(db, "CREATE TABLE IF NOT EXISTS Estoque(ID, Quantia)")
    dbExec(db, "CREATE TABLE IF NOT EXISTS Carros(ID INTEGER PRIMARY KEY AUTOINCREMENT, account, idCar, state, placa, imposto, seguro, dataCar, dataTuning)")
    dbExec(db, "CREATE TABLE IF NOT EXISTS Slots(account, quantia)")
    if config["Mensagem Start"] then
        outputDebugString("["..getResourceName(getThisResource()).."] Startado com sucesso!")
    end
    for i, v in ipairs(config["Markers"]) do
        marker[i] = createMarker(v[1], v[2], v[3]-1, "cylinder", 1.1, 139, 0, 255, 90)
        blip_create[i] = createBlipAttachedTo(marker[i], v[4] == "conce" and 55 or v[4] == "garagem" and 53 or 24)
        addEventHandler("onMarkerHit", marker[i],
        function(player, dim)
            if getElementType(player) == "player" then
                if dim then
                    sendData(player, v[4])
                    triggerClientEvent(player, "JOAO.openConce", player, v[4], i)
                end
            end
        end)
    end
    setTimer(function()
        for i, v in ipairs(config["IDs Veículos"]) do
            local result = dbPoll(dbQuery(db, "SELECT * FROM Estoque WHERE ID = ?", v), -1)
            if #result == 0 then
                dbExec(db, "INSERT INTO Estoque(ID, Quantia) VALUES(?,?)", v, 30)
            end
        end
    end, 3000, 1)
    for i, v in ipairs(getElementsByType("player")) do
        local result = dbPoll(dbQuery(db, "SELECT * FROM Slots WHERE account = ?", puxarConta(v)), -1)
        if #result == 0 then
            dbExec(db, "INSERT INTO Slots(account, quantia) VALUES(?,?)", puxarConta(v), verifySlot(v))
        end
    end
    dbExec(db, "UPDATE Carros SET state = ? WHERE state = ?", "Guardado", "Spawnado")
end)

Por fim aqui está o banco de dados, já chequei cada coluna e parece que tá tudo ai...
spacer.png

Link to comment
  • Other Languages Moderators
Posted (edited)

Suas imagens são inacessíveis. Coloque o erro em texto em vez de imagem.

Edited by Lord Henry
Link to comment
Posted (edited)
On 20/05/2024 at 13:56, Lord Henry said:

Suas imagens são inacessíveis. Coloque o erro em texto em vez de imagem.

O erro que tá no debug é: dbExec failed; (1) SQL logic error
Porém eu queria também mostrar como tá o db, vou tentar mandar o link da imagem upada pelo imgur:

BzMmlcw.png

Edited by Lord Henry
Link convertido em imagem.
Link to comment
  • Other Languages Moderators

E aí, @Doongogar — beleza?

Provavelmente o erro ocorre pois você não tá definindo o tipo de dado das colunas. Veja que aqui:

dbExec(db, "CREATE TABLE IF NOT EXISTS Estoque(ID, Quantia)")
dbExec(db, "CREATE TABLE IF NOT EXISTS Carros(ID INTEGER PRIMARY KEY AUTOINCREMENT, account, idCar, state, placa, imposto, seguro, dataCar, dataTuning)")
dbExec(db, "CREATE TABLE IF NOT EXISTS Slots(account, quantia)")

Somente o "ID" da tabela "Carros" possui um tipo de dado, que é o INTEGER. Já as outras colunas não possuem nenhuma informação sobre o que vão armazenar. Sugiro que você leia meu tutorial sobre banco de dados para entender e aprender como usar. Também existe muito conteúdo no canal do Discord, onde os usuários e eu mesmo respondo as dúvidas do pessoal.

De qualquer forma, irei explicar, em poucos detalhes, sobre como você deveria seguir daqui pra frente na criação de tabelas em banco de dados. O mais importante é que você entenda: toda coluna em uma tabela precisa de um tipo de dado, pois assim o MySQL — ou outra engine — saberá o que está sendo armazenado e, uma vez que uma busca ocorre, os dados retornarão de maneira correta.

Outra coisa importante é utilizar crases (`) em volta das palavras. Isso evita quaisquer possíveis erros de palavras reservadas de um banco de dados. Existem algumas, mas citarei uma, que é, por exemplo, a palavra reservada select. Se você tentar criar essa coluna no banco de dados, dará um erro, pois essa (palavra) é reservada para o banco de dados, tanto é que nós a usamos para buscar dados. Entretanto, se mesmo assim você quiser usar como nome de uma coluna, basta aplicar a crase, desta maneira: `select`.

Um ponto interessante, também, é organizar melhor a criação da tabela. Perceba que tudo está in-line, deixando uma linha loooooooonga no seu código. Escreverei abaixo como você deveria criar suas tabelas de agora em diante.

dbExec( db, [[
    CREATE TABLE IF NOT EXISTS `Estoque` (
        `ID` INT(11) NOT NULL,
        `Quantia` INT(11) NOT NULL,
    );
]] );

dbExec( db, [[
    CREATE TABLE IF NOT EXISTS `Carros` (
        `ID` INT(11) NOT NULL AUTO_INCREMENT,
        `account` VARCHAR(64) NOT NULL,
        `idCar` INT(11) NOT NULL,
        `state` VARCHAR(16) NOT NULL,
        `placa` VARCHAR(16) NOT NULL,
        `imposto` INT(11) NOT NULL,
        `seguro` TINYINT(1) NOT NULL,
        `dataCar` JSON NOT NULL,
        `dataTuning` JSON NOT NULL,
    );
]] );

dbExec( db, [[
    CREATE TABLE IF NOT EXISTS `Slots` (
        `account` VARCHAR(64) NOT NULL,
        `quantia` INT(11) NOT NULL,
    );
]] );

Pode parecer muito mais complicado, mas não é. Tudo que está aí faz parte da criação de uma tabela no banco de dados, independente da sua aplicação. Nós devemos montar a estrutura para que tudo ocorra bem durante o processo de manipulação de dados.

Provavelmente não usei os tipos corretos, pois "chutei" o que cada coluna poderia ser, vai de você adaptar, já que o sistema é de sua criação. Aqui tem uma mensagem minha em nosso canal do Discord que explico mais sobre uma tabela ruim, e como ela deveria ser escrita.

Perceba que também existe uma coluna com o tipo de dado JSON, porém, não recomendo. Eu poderia explicar aqui também o porquê, mas minhas respostas no canal do Discord já respondem esses porquês.

Sobre os possíveis tipos de dados, confia todos aqui. Recomendo que, quando você tiver tempo livre, leia atentamente como eles funcionam, quantos bytes eles consomem. É importante entender cada um deles — ou somente os mais usados, caso prefira.

Link to comment
1 hour ago, androksi said:

E aí, @Doongogar — beleza?

Então, eu fui em busca de mais informações e perguntei a algumas pessoas, eles disseram que isso pode estar ocorrendo por causa da minha hospedagem, e realmente ao tentar colocar outros mods que utilizam banco de dados a grande maioria dá esse mesmo erro. Há a possibilidade de realmente a hospedagem estar ligada a este problema, se sim, como eu poderia resolver?

Link to comment
Posted (edited)

Descobri que quando eu boto um mod e ele dá esse erro de sql logic error, desligo e reinicio o servidor e então ligo o mod ele funciona perfeitamente, porém ainda sim é um contra-tempo a cada mod novo que utilize db ter que reiniciar o servidor então ainda preciso de ajuda. Apenas essa informação adicional...

Edited by Doongogar
Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...