Permalänk

Skapa hemsida med databas

Kusen Databashantering är nu snart över, och jag har ett slutprojekt kvar som jag måste sätta ett MVG på för att lyckas med ett MVG i kursen.

Jag ska bygga en hemsida som riktar sig till öl-smakare.

I nuläget har jag en Index.cshtml sida där jag har olika öl som jag har lagt till i en databas (tblÖl). Index sidan spottar sedan upp infon som finns i denna databas på ett snyggt sätt. Varje öl har en liten box där det står lite snabbinfo om ölen och en länk för att komma till "mer info".

Väl inne i Mer info (ölinfo.cshtml) hittar vi lite information som även detta finns i tblÖl, inget svårt än så länge. Nu vill jag att man ska kunna lägga till kommentarer om just den ölen man är inne och läser mer om. Dessa vill jag ska kunna presenteras under boxen där all info om ölen finns.

Nu måste jag skapa en till tabell, kalla den tblkommentar. Frågan är hur ska jag koppla denna till tblÖl? Och vad ska jag använda mig av för kodning för att få detta att fungera?

http://www.4shared.com/rar/x33dExSb/Empty_Site1.html?
Använder WebMatrix, så om någon skulle vilja hjälpa mig, hade det varit super för mig!

Permalänk
Medlem

Koppla kommentaren till IDn på tblÖl och varchar borde duga!

Alltså ID, IDOl, comment, author borde väl räcka?

Jag tycker också att du ska försöka lösa dina uppgifter själv!

Visa signatur

~. Citera så jag hittar tillbaka .~

Permalänk
Skrivet av KeVVa:

Koppla kommentaren till IDn på tblÖl och varchar borde duga!

Alltså ID, IDOl, comment, author borde väl räcka?

Jag tycker också att du ska försöka lösa dina uppgifter själv!

Den är kopplad så, och in min tblKommentar finns den infon som du skrev ovan.
Nu är problemet att jag måste ha lite kod för att få upp det på min olinfo.cshtml. Jag har faktiskt försökt i många timmar, men jag vet inte vad jag gör för fel, antingen har jag hjärnsläpp eller så vet jag inte vad.
Jag måste hämta ID för en specifik öl, och sedan lägga in data i tblKommentar. Min lärare gav mig denna koden och sa att det skulle fungera, men icke!

Citat:

@{
var db = Database.Open("Munskänkarna");

var ÖlID = UrlData[0];
if (ÖlID.IsEmpty()) {
Response.Redirect(@Href("~/indexC"));
}

var selectQueryString = "SELECT * FROM tblöl ,tblbryggeri where "
+"tblÖl.fBryggeriID=tblBryggeri.BryggeriID and ÖlID = @0";

var row = db.QuerySingle(selectQueryString, ÖlID);

var bilden= "/img/"+ row.bild;

// Deklarera vilka varibler jag vill använda

var kommentar ="";

//Om sidan är postad till sig själv
if (IsPost)
{

kommentar = Request["kommentar"];

var insertQuery = "INSERT INTO tblkommentar (kommentar) " +
"VALUES (@0)";

db.Execute(insertQuery, kommentar);
// Display the page that lists products.
Response.Redirect(@Href("~/IndexC"));

}}

och för kommentarsruta + Submitknapp:

Citat:

</div>
<form method="post" action="" enctype="multipart/form-data">
<fieldset>
<div>

<form>
<label>Beskrivning:</label>
<br>
<TEXTAREA NAME="beskrivning" type="text" value="@Kommentar"
ROWS="5" COLS="78">
</TEXTAREA>
</FORM>
</div>

<div>
<label> </label>
<input type="submit" value="Lägg Till" class="submit" />
</div>
</fieldset>

</form>

</div>

Permalänk
Medlem
Skrivet av hbengtsson:

Den är kopplad så, och in min tblKommentar finns den infon som du skrev ovan.
Nu är problemet att jag måste ha lite kod för att få upp det på min olinfo.cshtml. Jag har faktiskt försökt i många timmar, men jag vet inte vad jag gör för fel, antingen har jag hjärnsläpp eller så vet jag inte vad.
Jag måste hämta ID för en specifik öl, och sedan lägga in data i tblKommentar. Min lärare gav mig denna koden och sa att det skulle fungera, men icke!

och för kommentarsruta + Submitknapp:

Du har glömt att sätta ett name-attribut på din textarea. För att fungera så ska den i detta fall ha namnet "kommentar".

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
Skrivet av Leedow:

Du har glömt att sätta ett name-attribut på din textarea. För att fungera så ska den i detta fall ha namnet "kommentar".

Samma sak när jag ändrar det. Får samma meddelande som innan
"System.Data.SqlServerCe.SqlCeException: The column cannot contain null values. [ Column name = fÖlID,Table name = tblkommentar ]"

Permalänk
Medlem

felmeddelandet säger det mesta;
du försöker att lägga till en rad i tabellen tblkommentar, men du har inte angett ett värde för kolumnen fÖlID, som då skulle bli null, vilket inte är tillåtet enligt kolumndefinitionen.

man skulle kunna förklara det lite mer "otekniskt" genom att säga att databasen inte kan gissa vilket öl du kommenterar, utan du måste explicit berätta det för den.

exempel på hur man skickar med flera parametrar till databasen: http://msdn.microsoft.com/en-us/library/webmatrix.data.databa...

Visa signatur

as far as we can tell, the massacre went well...

Permalänk
Avstängd

Hungarian notation hör till 1970, sluta med det!

Visa signatur
Permalänk
Skrivet av jovnas:

felmeddelandet säger det mesta;
du försöker att lägga till en rad i tabellen tblkommentar, men du har inte angett ett värde för kolumnen fÖlID, som då skulle bli null, vilket inte är tillåtet enligt kolumndefinitionen.

man skulle kunna förklara det lite mer "otekniskt" genom att säga att databasen inte kan gissa vilket öl du kommenterar, utan du måste explicit berätta det för den.

exempel på hur man skickar med flera parametrar till databasen: http://msdn.microsoft.com/en-us/library/webmatrix.data.databa...

Kan det ha med relationen mellan tabellerna att göra? eller är det denna som är fel?

Citat:

var selectQueryStringg = "SELECT * FROM tblöl ,tblkommentar where "
+"tblÖl.fKommentarID=tblKommentar.KommentarID and ÖlID = @0";

Permalänk
Medlem
Skrivet av hbengtsson:

Kan det ha med relationen mellan tabellerna att göra? eller är det denna som är fel?

Felet ligger i din insert. Du berättar inte för databasen vilket öl din kommentar gäller. För exempel på hur man anger flera kolumner, se länken jag postade i mitt förra inlägg.

Visa signatur

as far as we can tell, the massacre went well...

Permalänk
Skrivet av jovnas:

Felet ligger i din insert. Du berättar inte för databasen vilket öl din kommentar gäller. För exempel på hur man anger flera kolumner, se länken jag postade i mitt förra inlägg.

Ahh, nu börjar jag förstå! "
var insertQuery = "INSERT INTO tblkommentar (Kommentar) " + "VALUES (@0)";

I den måste jag alltså lägga in fÖlID? Isåfall går det att göra så att sidan själv hämtar det ID:et den är inne på? När jag går från index till info, plockar den automatiskt det ID som ligger i en viss box. Säg att jag ska in i tredje boxens Info, kommer jag att hamna på localhost/olinfo/3. Alltså är det ID nummer 3 jag vill använda i min insertQuery nu, men om jag går in i 5 är det ID 5 jag vill använda ju.

Permalänk
Medlem
Skrivet av hbengtsson:

Ahh, nu börjar jag förstå! "
var insertQuery = "INSERT INTO tblkommentar (Kommentar) " + "VALUES (@0)";

I den måste jag alltså lägga in fÖlID? Isåfall går det att göra så att sidan själv hämtar det ID:et den är inne på? När jag går från index till info, plockar den automatiskt det ID som ligger i en viss box. Säg att jag ska in i tredje boxens Info, kommer jag att hamna på localhost/olinfo/3. Alltså är det ID nummer 3 jag vill använda i min insertQuery nu, men om jag går in i 5 är det ID 5 jag vill använda ju.

japp. du måste ange fÖlID. databasen kan som sagt inte gissa detta, då den är helt frikopplad från din sida.
variabeln ÖlID verkar ju innehålla aktuellt id, så den borde du kunna använda. (med reservation, då jag inte använt mig av WebMatrix för sånt här och inte riktigt känner till hur den hanterar saker och ting mellan requests.)

Visa signatur

as far as we can tell, the massacre went well...

Permalänk
Skrivet av jovnas:

japp. du måste ange fÖlID. databasen kan som sagt inte gissa detta, då den är helt frikopplad från din sida.
variabeln ÖlID verkar ju innehålla aktuellt id, så den borde du kunna använda. (med reservation, då jag inte använt mig av WebMatrix för sånt här och inte riktigt känner till hur den hanterar saker och ting mellan requests.)

Man tackar för svaren! Detta är till stor hjälp. ÖlID innehåller aktuellt ID ja, ska testa mig fram och se hur jag ska lösa det.

Permalänk
Skrivet av CyberVillain:

Hungarian notation hör till 1970, sluta med det!

Det är detta vi lär oss i skolan. Kanske inte det bästa men.

Permalänk
Avstängd

Fan sjukt att de lär ut en sådan grej, vill de att ni skriver

strName och intCount också?

Visa signatur
Permalänk
Medlem

Om det är C# ni kommer använda av er framöver så rekommenderar jag att försöka följa C# namn standarden och inte intvingad standard från andra språk. Det sagt det finns olika kulturer överallt så man måste anpassa sig.

Hungarian notation åt andra sidan är otroligt ovanligt inom C#, har dock stött på det men et av typ 100 tals projekt, Varför det är ovanligt är för att Visual Studio i sig självt gör syftet med Hungarian Notation totalt onödigt. Samma gäller vanliga namnstander i SQL. T.ex. fråga dig det här, hjälper det dig att veta att din tabel är en tbl för varje tabel? Det förstör lite av syftet.

Det sagt jag skulle också rekommendera att inte använda åäö i kod nu stödjer förvisso C# stödjer detta men jag skulle rekommendera dig att du avvänjer dig att använda det, något som inte är poppis där ute i arbetslivet. Förvisso som sagt va smaksak.

Visa signatur

Speldator: Ryzen 7800X3D, 64GB DDR5, RTX 3070
Server: i7-8700k, 32GB DDR4, RTX2080
Steam deck + de fiesta konsoller.

Permalänk
Avstängd

finns det nått värre än kod på svenska, med eller utan åäö

Jag fick i uppgift att porta ett hyffsat nytt web.forms projekt till MVC4 / SPA
De hade inte Hungarian notation i C# koden men i vyerna var det det mao

<asp:TextBox id="tbName" />

Det gör ju att codebehindfilerna (Web.forms svar på modellen eller controllern i moderna apier) får en hårdare koppling till vyn rent semantiskt, mycket fult.

Visa signatur
Permalänk
Medlem

Ni MVC:are är för roliga, "moderna api:er", sörja in massa razor i sidorna i ren spaghetti eller tvinga vartenda problem i ett MVC mönster skulle vara "modernt" ?

Ibland får man känslan att ni behöver detta mönster tänkande för att kunna programmera alls, det blir för fritt på något sätt när man kan göra som man vill.

Comments

Permalänk
Medlem
Skrivet av tyzx:

Ni MVC:are är för roliga, "moderna api:er", sörja in massa razor i sidorna i ren spaghetti eller tvinga vartenda problem i ett MVC mönster skulle vara "modernt" ?

Ibland får man känslan att ni behöver detta mönster tänkande för att kunna programmera alls, det blir för fritt på något sätt när man kan göra som man vill.

Comments

Vi MVC'are vad? Min fråga är vad du vill ha istället? MVC som används rätt fungerar riktigt bra, vyerna är precis vad de är vyer, de ska innehålla noll logik förutom hantering av just hur sidan er ut, rätt information på rätt plats, skriver du logik här så kommer du självklart att få problem.

Men vist föredrar du gamla hederliga ASP syntaxen så kan du använda dig av <% %> också men i praktiken inte någon skillnad i huvud taget förutom mer kod.

Du får som sagt va gärna förklara och ge tips på saker som är bättre.

Visa signatur

Speldator: Ryzen 7800X3D, 64GB DDR5, RTX 3070
Server: i7-8700k, 32GB DDR4, RTX2080
Steam deck + de fiesta konsoller.

Permalänk
Medlem

Jag har inget emot hungarian notation på markup och inte heller på tabellnamn - Om man kör lat mans Entity Framework är det ganska trevligt om objektet heter "tblBeer" så jag vet att jag jobbar med just den tabellen - Visst, det är ju inte direkt abstraktion, men för just tabeller har jag absolut inget emot det, annat än principskäl, och principskäl ger jag inte mycket för. Jag gillar även när foreign keys är prefixade med fk - tycker det är tydligt och lättförståeligt.

När det gäller ID på markup gillar jag också hungarian notation - Det är rätt ofta värdefult att veta att cbSaveAs är en checkbox och tbSaveAs är en textbox - IDEn kan ju i de här fallen inte hjälpa mig att hålla reda på dem.

Ser jag $("#cbSaveAs) vet jag ju att det här är en checkbox och då kan jag göra si eller så, men hade det varit en divSaveAs eller tbSaveAs hade det ju varit helt andra saker.

Lite samma som att vissa prefixar jquery object med $ så att man skall vet att det är ett jq-objekt - Om inte IDE vet det, måste man ju på nåt sätt veta det, eftersom Javascript inte direkt är hårt typat. - Inte för att jag skulle gör en "var intNumber", men ibland vill man ju faktiskt ha "Number" som en sträng, då kan det ju vara helt OK att döpa variablen till "numberAsString" eller "stringNumber" etc.

Principregler är till för att brytas, man skall skriva tydlig kod som är lättläst och fungerar och förhoppningsvis är lätt att underhålla.

Permalänk

Nu har jag fått kommentarerna att lägga sig under rätt fÖlID, dvs ölen Singha har ÖlID 4 i tabellen tblÖl. Om jag skriver en kommentar om Singha, kommer det att läggas en kommentar i tblKommentar i kolumnen Kommentar, denna specifika kommentar får då samma ID (fÖlID) som Singa dvs 4.

Nu ska jag visa kommentarerna i en annan ruta. Då använder jag ju bara var selectQuery= "SELECT * FROM tblkommentar"; för att hämta data från den tabellen. Men hur ska jag gå till väga för att ALLA kommentarer med ex. fÖLID 4 ska visas?
Svårt att förklara, men alla ni som har svarat låter sjukt duktiga på detta, så jag hoppas att ni förstår

Kan tillägga att den div-boxen där kommentarerna ska ligga ser ut såhär i nuläget:

Citat:

<div class="commentbox">
@foreach(var ros in db.Query(selectQuery, fÖlID))
{
<div class="comments">

@ros.kommentar

</div>
}
</div>

Permalänk
Medlem

Vet inte hur avancerat man måste gå. Men du kan ju göra en relationstabel mellan en tabell med namn på massa maträtter/typer och ölsorterna. När man man visar mer info om ölen ser man vilka rätter den passar till i en lista.

Har själv bara läst databasadministration, vilket mest berör de tekniska bitarna runt omkring och inte då programeringen. Men något mer avancerat än att hämta och skriva till en databas borde krävas för mvg? Typ en join av något slag, fast det blir det kanske inte av det här.

Permalänk
Medlem
Skrivet av hbengtsson:

Nu har jag fått kommentarerna att lägga sig under rätt fÖlID, dvs ölen Singha har ÖlID 4 i tabellen tblÖl. Om jag skriver en kommentar om Singha, kommer det att läggas en kommentar i tblKommentar i kolumnen Kommentar, denna specifika kommentar får då samma ID (fÖlID) som Singa dvs 4.

Nu ska jag visa kommentarerna i en annan ruta. Då använder jag ju bara var selectQuery= "SELECT * FROM tblkommentar"; för att hämta data från den tabellen. Men hur ska jag gå till väga för att ALLA kommentarer med ex. fÖLID 4 ska visas?
Svårt att förklara, men alla ni som har svarat låter sjukt duktiga på detta, så jag hoppas att ni förstår

du ser ut att ha gjort helt korrekt i koden genom att ange fÖlID som parameter till selectQuery. dock saknar selectQuery en WHERE-sats, vilket gör att frågan returnerar alla rader i tabellen.

Visa signatur

as far as we can tell, the massacre went well...

Permalänk
Skrivet av jovnas:

du ser ut att ha gjort helt korrekt i koden genom att ange fÖlID som parameter till selectQuery. dock saknar selectQuery en WHERE-sats, vilket gör att frågan returnerar alla rader i tabellen.

Ja precis, jag skulle vilja ha en sql sats som ser ut ungefär såhär:
"SELECT * FROM tblkommentar WHERE fÖlID="någonting"";

Frågan är bara vad jag ska skriva istället "någonting". Jag kan inte skriva in något ID, då jag endast skulle få alla kommentarer för Singha, på min Calrsberg då också. Säg att Singha har fÖlID 3, och min sql-sats skulle varit "SELECT * FROM tblkommentar WHERE fÖlID=3", skulle info-pagen hämtat Singhas kommentarer på vilken öl jag än går in på.
Vet du vad jag kan använda istället?

Permalänk
Medlem
Skrivet av hbengtsson:

Ja precis, jag skulle vilja ha en sql sats som ser ut ungefär såhär:
"SELECT * FROM tblkommentar WHERE fÖlID="någonting"";

Frågan är bara vad jag ska skriva istället "någonting". Jag kan inte skriva in något ID, då jag endast skulle få alla kommentarer för Singha, på min Calrsberg då också. Säg att Singha har fÖlID 3, och min sql-sats skulle varit "SELECT * FROM tblkommentar WHERE fÖlID=3", skulle info-pagen hämtat Singhas kommentarer på vilken öl jag än går in på.
Vet du vad jag kan använda istället?

du använder samma syntax som du gör när du hämtar informationen om en specifik ölsort.

Visa signatur

as far as we can tell, the massacre went well...

Permalänk
Medlem
Skrivet av hbengtsson:

Ja precis, jag skulle vilja ha en sql sats som ser ut ungefär såhär:
"SELECT * FROM tblkommentar WHERE fÖlID="någonting"";

Frågan är bara vad jag ska skriva istället "någonting". Jag kan inte skriva in något ID, då jag endast skulle få alla kommentarer för Singha, på min Calrsberg då också. Säg att Singha har fÖlID 3, och min sql-sats skulle varit "SELECT * FROM tblkommentar WHERE fÖlID=3", skulle info-pagen hämtat Singhas kommentarer på vilken öl jag än går in på.
Vet du vad jag kan använda istället?

Nånting ska självklart vara det ID som motsvarande öl har. Vid skapande av hemsidan (då den ritas upp på skärmen) ska du byta ut nånting mot samma ID som rutan för ölen.

Visa signatur

5700x3D | RTX 2060 Super | 2 TB M.2 | 32 GB RAM | Gigabyte DS3H| 750 WATT

Permalänk
Skrivet av jovnas:

du använder samma syntax som du gör när du hämtar informationen om en specifik ölsort.

Skrivet av FX9:

Nånting ska självklart vara det ID som motsvarande öl har. Vid skapande av hemsidan (då den ritas upp på skärmen) ska du byta ut nånting mot samma ID som rutan för ölen.

Sähär ser min kodning ut, vet inte hur jag ska skriva satsen för att det ska funka, känns som att jag har testat allt.

Citat:

@{
var db = Database.Open("Munskänkarna");
var selectQuery= "SELECT * FROM tblkommentar";

var ÖlID = UrlData[0];
if (ÖlID.IsEmpty()) {
Response.Redirect(@Href("~/indexC"));
}

var selectQueryString = "SELECT * FROM tblöl ,tblbryggeri where "
+"tblÖl.fBryggeriID=tblBryggeri.BryggeriID and ÖlID = @0";

var row = db.QuerySingle(selectQueryString, ÖlID);

var bilden= "/img/"+ row.bild;

var Kommentar ="";
var fÖlID ="";
var fNamn ="";

//Om sidan är postad till sig själv
if (IsPost)
{
Kommentar = Request["Kommentar"];
fÖlID = Request["fÖlID"];
fNamn = Request["fNamn"];

// Define the insert query. The values to assign to the
// columns in the Product table are defined as parameters
// with the VALUES keyword.

var insertQuery = "INSERT INTO tblkommentar (Kommentar, fÖlID, fNamn) " +
"VALUES (@0,@1,@2)";

db.Execute(insertQuery, Kommentar, fÖlID, fNamn);
// Display the page that lists products.
Response.Redirect(@Href("~/IndexC"));

}

}

Permalänk
Medlem

här är din kod för att hämta information om ett specifikt öl.

var selectQueryString = "SELECT * FROM tblöl ,tblbryggeri where " +"tblÖl.fBryggeriID=tblBryggeri.BryggeriID and ÖlID = @0"; var row = db.QuerySingle(selectQueryString, ÖlID);

fundera på hur du berättar för databasen att det bara är information om ölet som har id 3 du vill ha tillbaka... where vadå?

(ledsen om jag verkar dryg, men då det är en skoluppgift, så vill jag inte bara skriva "rätt svar". jag vill hellre få dig att tänka efter och förstå hur det fungerar.)

Visa signatur

as far as we can tell, the massacre went well...

Permalänk
Skrivet av jovnas:

här är din kod för att hämta information om ett specifikt öl.

var selectQueryString = "SELECT * FROM tblöl ,tblbryggeri where " +"tblÖl.fBryggeriID=tblBryggeri.BryggeriID and ÖlID = @0"; var row = db.QuerySingle(selectQueryString, ÖlID);

fundera på hur du berättar för databasen att det bara är information om ölet som har id 3 du vill ha tillbaka... where vadå?

(ledsen om jag verkar dryg, men då det är en skoluppgift, så vill jag inte bara skriva "rätt svar". jag vill hellre få dig att tänka efter och förstå hur det fungerar.)

Ahh, jag fick det att funka! Faktiskt innan jag fick detta svaret. Använde denna satsen, sen funkade det:
"SELECT * FROM tblkommentar, tblöl where tblkommentar.fÖlID=tblÖl.ÖlID and fÖlID =@0";

Kan säga att jag har lärt mig mer genom att starta denna tråd, än vad jag har gjort på en hel termin..

Permalänk
Medlem

Se bara till att du inte sätter så att kommentarens ID blir samma som ölens ID - Kommentaren ska ha ett eget ID, sen en annan kolumn som innehåller ID:t på ölen

Typ, kolumn namn:

tblComments id fkBeerId dateAdded commentText fkUserId (eller userName eller dylikt)

Sen kör du, typ:

SELECT b.*, c.id AS commentId, c.dateAdded, c.commentText, c.userName FROM tblBeer b JOIN tblComment c ON c.fkBeerId = b.id WHERE b.id = 123123