06. december 2006 - 10:39Der er
27 kommentarer og 1 løsning
Database crasher.
Hejsa Eksperter, jeg er ved at udvikle et multiplayer rollespil som fungerer over telnet som tekst .. Eller også det man kaldet et "MUD", det går nu udmærket, men er løbet ind i et problem ..
- Problemet er, at næsten alt hvad clienten foretager sig bliver skrevet eller loadet i database, f.eks. loader den Experience, Level, Position og en maaasse andre ting. Det fungere sådan her:
Startdatabase(); Skriv/Læs til database; Lukdatabasen;
Og det gør jeg hver gang jeg skal bruge information fra databasen, men problemet er at når flere logger på, så åbner databasen flere gange oven i hinanden og crasher, kan det problem løses?
kan du så ikke bare lave en class hvor du åbner DB'en og laver en function der skriver til den... så kan du bare kalde class'en en gang, så åbner forbindelsen og så hver gang du skal skrive til databasen bruger du bare functionen i din class...
er det fuldstændig uforståligt? for så må jeg jo prøve at omformulere mig ;)
nicklasw - Jeg har lavet en almindelig void funktion som ser sådan her ud:
void startdatabase() { // start database kode }
void skrivtildatabase() { // Skriv til database kode }
void lukdatabase() { // Luk database kode }
int main() { startdatabase(); skrivtildatabase(blabla); lukdatabase(); }
- Ville det virke bedre hvis man brugte en class? Problemet er jo at når flere bruger programmet så bliver de til sidst timet således at databasen står åben mens en anden prøver at åbne den ..
tror vi misforstår hinanden lidt... således jeg forstå på dig, er at når dit program skal skrive til databasen åbner du databasen, skriver, og lukker den... den måde jeg **prøvet** at vise det på var at, du kun åbner databasen en gang, så ledes at den bliver åbnet når programet starter, og lukker først når programmet slutter eller du dræber class'en...
Vil lige prøve at lege med det når jeg kommer hjem, men så vidt jeg ved kan man da ikke åbne databasen og lade den stå åben og ændre så meget man vil også derefter lukke den? Kan godt være jeg har misforstået princippet i en database, men som sagt, vil prøve at lege med det når jeg kommer hjem :)
Noo not really, har ikke forstand på classes så den siger fejl ved første del i klassen: #include <iostream> #include <string.h> #include <sstream> #include <windows.h> #include <conio.h> #include <sql.h> #include <sqlext.h> #include <time.h>
using namespace std;
// Variables for DATABASE SYS: int sl; int outconlen; // Length of returned connection string char outconstr[1024]; // Returned connection string char sqlstr[200]; // Insert char *constr = "Driver={Microsoft Access Driver (*.mdb)};Dbq=database.mdb;Uid=Admin;Pwd="; char s[5000]; SQLHENV Environment; //ODBC enviroment SQLHDBC DataBaseConnect; //ODBC Connection SQLHSTMT stmt; //ODBC Statement SQLRETURN stat; //ODBC Return status
class Database { Database { stat = SQLAllocEnv(&Environment); if((stat!=SQL_SUCCESS)&&(stat!=SQL_SUCCESS_WITH_INFO)) { printf("Error in AllocEnv\n"); } stat = SQLAllocConnect(Environment,&DataBaseConnect); if((stat!=SQL_SUCCESS)&&(stat!=SQL_SUCCESS_WITH_INFO)) { printf("Error in AllocConnect\n"); } stat = SQLDriverConnect(DataBaseConnect,NULL, (SQLCHAR *)constr,(SQLSMALLINT)strlen(constr), (SQLCHAR *)outconstr, (SQLSMALLINT)sizeof(outconstr), (SQLSMALLINT *)&outconlen,SQL_DRIVER_COMPLETE); if((stat!=SQL_SUCCESS)&&(stat!=SQL_SUCCESS_WITH_INFO)) { printf("Error in Connect\n"); } stat = SQLAllocStmt(DataBaseConnect,&stmt); if((stat!=SQL_SUCCESS)&&(stat!=SQL_SUCCESS_WITH_INFO)) { printf("Error in AllocStmt\n"); } }
Well .. Det ser ud til at virke, jeg lavede et loop som skrev 10.000 beskeder i databasen, den fuldførte det på et par sekunder .. Uden at brokke sig :) Så ser ud til at virke, men ser hvordan det kommer til at virke i mit spil :)
fordi det er mere overskueligt (min mening) Men det er ikke rigtig pointen, lige i den her sitiation. grunden til at din database crashede var fordi at når du skulle skrive til databasen så gjorde du sådan her.
programmet starter åben DB skriv DB luk DB
åben DB skriv DB luk DB
åben DB skriv DB luk DB osv.
programmet lukker
det belaster den ret meget, i steden for den måde du, nu, gør det på er.
programmet starter
opretter class
class'en lave en forbindelse til databasen
skriv db skriv db skriv db skriv db osv.
sletter den oprettet class det starter ~db functionen der lukker forbindelsen og så lukker programmet
du må lige sige til hvis du ikke forstår det... har nemlig lidt svært ved at forklare det, men vil da gerne prøve igen hvis det fuldstændigt ulæseligt ;)
Yeah I see .. Men har bare ikke forstået hvorfor en class kan holde databasen åben mens et void ikke kan .. Ved void skal man åbne og skrive og lukke .. Ved en class kan man åbne, skrive, skrive, skrive og lukke ..
det er objektiv programmering, prøv at læs lidt om det, det er et ekstremt stærkt værktøj.
men skal prøve at forklare det.
koden i main() der ser sådan ud Database DB; "kalder" den class du har skrevet, det vil sige den loader den ind i memory'en. automatisk når du kalder class'en starter den functionen Database() det åbner connection... nu har du et objekt der er loaded in i memoryen og tilgænglig indtil du lukker objektet igen, det kan du gøre med "kill" functionen, eller lukke programmet. det er det der gør forskellen...
men du kan tilføje mig på msn eller skype hvis det er... så skal jeg nok prøve at forklare det bedere
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.