Ik wil een Csharp.net gastenboek bouwen in 15 minuutjes (Opgelost)
Martijn2008 - 14/11/2009 13:01 (laatste wijziging 14/11/2009 13:05)
PHP beginner
Dag allemaal,
Ik wil graag de kracht voelen van het .NET platform. Mijn bedoeling is zo snel en efficiënt mogelijk een Csharp.net gastenboek in elkaar te zetten. Graag hoor ik jullie ervaringen en tips over de aanpak.
Bedankt alvast voor jullie hulp!
Martijn.
P.s. Hoe voeg ik eigenlijk het IP-adres en timestamp toe aan de berichten??
Code die ik momenteel al heb is de volgende(Ik vraag me af hoe ik kan aantonen, dat de query gelukt is?):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
public partial class Guestbook : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
SqlConnection conn;
conn = new SqlConnection();
conn.ConnectionString = new DB().ConnectionString();
conn.Open();
SqlCommand insertMessage = new SqlCommand("INSERT INTO guestbook (name, email, message) VALUES ('" + txtName + "', '" + txtEmail + "', '" + txtMessage + "')", conn);
insertMessage.ExecuteNonQuery();
conn.Close();
}
}
using System ;
using System.Collections.Generic ;
using System.Linq ;
using System.Web ;
using System.Web.UI ;
using System.Web.UI.WebControls ;
using System.Data.SqlClient ;
public partial class Guestbook : System.Web .UI .Page
{
protected void Page_Load( object sender, EventArgs e)
{
}
protected void Button1_Click( object sender, EventArgs e)
{
SqlConnection conn;
conn
= new SqlConnection
( ) ; conn.
ConnectionString = new DB
( ) .
ConnectionString ( ) ;
conn.Open ( ) ;
SqlCommand insertMessage
= new SqlCommand
( "INSERT INTO guestbook (name, email, message) VALUES ('" + txtName
+ "', '" + txtEmail
+ "', '" + txtMessage
+ "')" , conn
) ; insertMessage.ExecuteNonQuery ( ) ;
conn.Close ( ) ;
}
}
15 antwoorden
Gesponsorde links
Abbas - 14/11/2009 13:10
Crew .NET
Die code zal sowieso niet werken. Ik ga er van uit dat txtName, txtEmail en txtMessage de tekstvakken zijn en geen variabelen (ik zie namelijk geen declaratie). Wel nu, je kan toch geen TextBox in een database stoppen, je moet de Text eruit halen en gebruiken. Even veranderen naar: txtName.Text ! Een ander punt is bijvoorbeeld om Server.HtmlEncode() te gebruiken, nu is je invoer helemaal niet beveiligd. Als laatste zou ik zeggen, gooi alles qua database - werk eens in try catch voor als er iets misgaat (dit heet Exception Handling ):
//Connection instellen
//String met query maken en dan..
try
{
//verbinding openen
//query uitvoeren
}
catch (Exception ex)
{
//fouten opvangen
}
finally
{
//verbinding sluiten
//finally wordt ALTIJD uitgevoerd
}
//Connection instellen
//String met query maken en dan..
try
{
//verbinding openen
//query uitvoeren
}
catch ( Exception ex)
{
//fouten opvangen
}
finally
{
//verbinding sluiten
//finally wordt ALTIJD uitgevoerd
}
Toch nog een puntje, ik bekijk deze regel:
conn.ConnectionString = new DB().ConnectionString();
conn.
ConnectionString = new DB
( ) .
ConnectionString ( ) ;
Zorg er eens voor dat je in je class DB de methode ConnectionString() statisch maakt zodat je kan doen:
conn.ConnectionString = DB.ConnectionString();
conn.ConnectionString = DB.ConnectionString ( ) ;
Veel succes in ieder geval, en anders bekijk je dit script maar eens: http://www.site...Gastenboek . Hou er wel rekening mee dat het wat verouderd is!
Martijn2008 - 14/11/2009 17:25 (laatste wijziging 14/11/2009 17:49)
PHP beginner
Ik heb nu een aantal wijzigingen aan de hand van Titjes advies gemaakt. Ik ben benieuwd wat jullie ervan vinden? Hoe voeg ik eigenlijk het IP-adres en timestamp toe? Hoe kan ik de gastenboek berichten het gemakkelijkst tonen met paging(Gridview of is een label toch handiger?)?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
public partial class Guestbook : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
SqlConnection conn;
conn = new SqlConnection();
conn.ConnectionString = new DB().ConnectionString();
try
{
conn.Open();
SqlCommand insertMessage = new SqlCommand("INSERT INTO guestbook (name, email, message) VALUES ('" + Server.HtmlEncode(txtName.Text) + "', '" + Server.HtmlEncode(txtEmail.Text) + "', '" + Server.HtmlEncode(txtMessage.Text) + "')", conn);
insertMessage.ExecuteNonQuery();
lblResult.Text = "Uw bericht is met succes toegevoegd";
}
catch (Exception ex)
{
lblResult.Text = "Er zijn onverwachts fouten opgetreden.";
}
finally
{
conn.Close();
}
}
}
using System ;
using System.Collections.Generic ;
using System.Linq ;
using System.Web ;
using System.Web.UI ;
using System.Web.UI.WebControls ;
using System.Data.SqlClient ;
public partial class Guestbook : System.Web .UI .Page
{
protected void Page_Load( object sender, EventArgs e)
{
}
protected void Button1_Click( object sender, EventArgs e)
{
SqlConnection conn;
conn
= new SqlConnection
( ) ; conn.
ConnectionString = new DB
( ) .
ConnectionString ( ) ;
try
{
conn.Open ( ) ;
SqlCommand insertMessage
= new SqlCommand
( "INSERT INTO guestbook (name, email, message) VALUES ('" + Server.
HtmlEncode ( txtName.
Text ) + "', '" + Server.
HtmlEncode ( txtEmail.
Text ) + "', '" + Server.
HtmlEncode ( txtMessage.
Text ) + "')" , conn
) ; insertMessage.ExecuteNonQuery ( ) ;
lblResult.Text = "Uw bericht is met succes toegevoegd" ;
}
catch ( Exception ex)
{
lblResult.Text = "Er zijn onverwachts fouten opgetreden." ;
}
finally
{
conn.Close ( ) ;
}
}
}
Abbas - 14/11/2009 18:12
Crew .NET
Je hebt je ConnectionString() nog niet statisch gemaakt!
Om de berichten van je gastenboek te tonen, kan je misschien best gebruik maken van de ASP Repeater Control.
Het IP adres haal je zo op:
HttpContext.Current.Request.UserHostAddress;
HttpContext.Current .Request .UserHostAddress ;
En een Timestamp haal je gewoon op via DateTime.
Martijn2008 - 15/11/2009 16:40 (laatste wijziging 15/11/2009 16:44)
PHP beginner
Misschien een hele arrogante vraag, maar hoe maak ik een connectionstring statisch ?
Ik heb nu trouwens een probleempje; de action die ik achter de submit button heb staan, wordt steeds gevangen in de catch. Ik krijg dus nu de error: Er zijn onverwachts fouten opgetreden.
Csharp code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
public partial class Guestbook : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (Request.QueryString["res"] != null)
{
lblResult.Text = "Uw bericht is met succes toegevoegd";
}
}
protected void Button1_Click(object sender, EventArgs e)
{
SqlConnection conn;
conn = new SqlConnection();
conn.ConnectionString = new DB().ConnectionString();
try
{
conn.Open();
SqlCommand insertMessage = new SqlCommand("INSERT INTO guestbook (name, email, message, ip) VALUES ('" + Server.HtmlEncode(txtName.Text) + "', '" + Server.HtmlEncode(txtEmail.Text) + "', '" + Server.HtmlEncode(txtMessage.Text) + "', '" + HttpContext.Current.Request.UserHostAddress + "')", conn);
insertMessage.ExecuteNonQuery();
txtName.Text = "";
txtEmail.Text = "";
txtMessage.Text = "";
Response.Redirect("Guestbook.aspx?res=1");
}
catch (Exception ex)
{
lblResult.Text = "Er zijn onverwachts fouten opgetreden.";
}
finally
{
conn.Close();
}
}
}
using System ;
using System.Collections.Generic ;
using System.Linq ;
using System.Web ;
using System.Web.UI ;
using System.Web.UI.WebControls ;
using System.Data.SqlClient ;
public partial class Guestbook : System.Web .UI .Page
{
protected void Page_Load( object sender, EventArgs e)
{
if ( Request.QueryString [ "res" ] != null )
{
lblResult.Text = "Uw bericht is met succes toegevoegd" ;
}
}
protected void Button1_Click( object sender, EventArgs e)
{
SqlConnection conn;
conn
= new SqlConnection
( ) ; conn.
ConnectionString = new DB
( ) .
ConnectionString ( ) ;
try
{
conn.Open ( ) ;
SqlCommand insertMessage
= new SqlCommand
( "INSERT INTO guestbook (name, email, message, ip) VALUES ('" + Server.
HtmlEncode ( txtName.
Text ) + "', '" + Server.
HtmlEncode ( txtEmail.
Text ) + "', '" + Server.
HtmlEncode ( txtMessage.
Text ) + "', '" + HttpContext.
Current .
Request .
UserHostAddress + "')" , conn
) ; insertMessage.ExecuteNonQuery ( ) ;
txtName.Text = "" ;
txtEmail.Text = "" ;
txtMessage.Text = "" ;
Response.Redirect ( "Guestbook.aspx?res=1" ) ;
}
catch ( Exception ex)
{
lblResult.Text = "Er zijn onverwachts fouten opgetreden." ;
}
finally
{
conn.Close ( ) ;
}
}
}
view:
<%@ Page Title="" Language="C#" MasterPageFile="~/Default.master" AutoEventWireup="true" CodeFile="Guestbook.aspx.cs" Inherits="Guestbook" %>
<asp:Content ID="Content1" ContentPlaceHolderID="Main" Runat="Server">
<h3>Guestbook</h3>
<asp:Repeater ID="Repeater1" runat="server"
DataSourceID="SqlDataSource1">
</asp:Repeater>
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:ConnectionString %>"
SelectCommand="SELECT [ip], [time], [message], [email], [name] FROM [guestbook]">
</asp:SqlDataSource>
<div class="box">
<table style="width: 100%">
<tr>
<td>
<asp:Label ID="Name" runat="server" Text="Name"></asp:Label>
</td>
<td>
<asp:TextBox ID="txtName" runat="server"></asp:TextBox>
</td>
<td>
<asp:RequiredFieldValidator ID="strNameReqValidator" runat="server"
ControlToValidate="txtName" ErrorMessage="Veld name is leeg">*</asp:RequiredFieldValidator>
</td>
</tr>
<tr>
<td>
<asp:Label ID="Email" runat="server" Text="E-mail"></asp:Label>
</td>
<td>
<asp:TextBox ID="txtEmail" runat="server"></asp:TextBox>
</td>
<td>
<asp:RequiredFieldValidator ID="RequiredFieldValidatorEmail" runat="server"
ControlToValidate="txtEmail" ErrorMessage="Veld e-mail is leeg">*</asp:RequiredFieldValidator>
<asp:RegularExpressionValidator ID="RegularExpressionValidatorEmail"
runat="server" ControlToValidate="txtEmail"
ErrorMessage="E-mailadres valideert niet"
ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*">*</asp:RegularExpressionValidator>
</td>
</tr>
<tr>
<td>
<asp:Label ID="Message" runat="server" Text="Message"></asp:Label>
</td>
<td>
<asp:TextBox ID="txtMessage" runat="server"></asp:TextBox>
</td>
<td>
<asp:RequiredFieldValidator ID="RequiredFieldValidatorMessage" runat="server"
ControlToValidate="txtMessage" ErrorMessage="*">*</asp:RequiredFieldValidator>
</td>
</tr>
<tr>
<td>
</td>
<td>
<asp:Button ID="Submit" runat="server" onclick="Button1_Click" Text="Submit" />
</td>
<td>
<asp:Label ID="lblResult" runat="server"></asp:Label>
</td>
</tr>
</table>
</div>
</asp:Content>
<% @ Page Title= "" Language= "C#" MasterPageFile= "~/Default.master" AutoEventWireup= "true" CodeFile= "Guestbook.aspx.cs" Inherits= "Guestbook" %>
<asp:Content ID="Content1" ContentPlaceHolderID="Main" Runat="Server">
<h3>Guestbook</h3>
<asp:Repeater ID="Repeater1" runat="server"
DataSourceID="SqlDataSource1">
</asp:Repeater>
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<% $ ConnectionStrings: ConnectionString %> "
SelectCommand="SELECT [ip], [time], [message], [email], [name] FROM [guestbook]">
</asp:SqlDataSource>
<div class="box">
<table style="width: 100%">
<tr>
<td>
<asp:Label ID="Name" runat="server" Text="Name"></asp:Label>
</td>
<td>
<asp:TextBox ID="txtName" runat="server"></asp:TextBox>
</td>
<td>
<asp:RequiredFieldValidator ID="strNameReqValidator" runat="server"
ControlToValidate="txtName" ErrorMessage="Veld name is leeg">*</asp:RequiredFieldValidator>
</td>
</tr>
<tr>
<td>
<asp:Label ID="Email" runat="server" Text="E-mail"></asp:Label>
</td>
<td>
<asp:TextBox ID="txtEmail" runat="server"></asp:TextBox>
</td>
<td>
<asp:RequiredFieldValidator ID="RequiredFieldValidatorEmail" runat="server"
ControlToValidate="txtEmail" ErrorMessage="Veld e-mail is leeg">*</asp:RequiredFieldValidator>
<asp:RegularExpressionValidator ID="RegularExpressionValidatorEmail"
runat="server" ControlToValidate="txtEmail"
ErrorMessage="E-mailadres valideert niet"
ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*">*</asp:RegularExpressionValidator>
</td>
</tr>
<tr>
<td>
<asp:Label ID="Message" runat="server" Text="Message"></asp:Label>
</td>
<td>
<asp:TextBox ID="txtMessage" runat="server"></asp:TextBox>
</td>
<td>
<asp:RequiredFieldValidator ID="RequiredFieldValidatorMessage" runat="server"
ControlToValidate="txtMessage" ErrorMessage="*">*</asp:RequiredFieldValidator>
</td>
</tr>
<tr>
<td>
</td>
<td>
<asp:Button ID="Submit" runat="server" onclick="Button1_Click" Text="Submit" />
</td>
<td>
<asp:Label ID="lblResult" runat="server"></asp:Label>
</td>
</tr>
</table>
</div>
</asp:Content>
Abbas - 15/11/2009 18:33
Crew .NET
Doe dan in de catch eens dit:
catch (Exception ex)
{
lblResult.Text = ex.Message;
}
catch ( Exception ex)
{
lblResult.Text = ex.Message ;
}
Stel je hebt volgende klasse:
public class DB
{
public static string GetConnectionString()
{
return "Uwe connectionstring";
}
}
//aanroep is dan
SqlConnection myConn = new SqlConnection();
myConn.ConnectionString = DB.GetConnectionString();
public class DB
{
public static string GetConnectionString( )
{
return "Uwe connectionstring" ;
}
}
//aanroep is dan
SqlConnection myConn
= new SqlConnection
( ) ; myConn.ConnectionString = DB.GetConnectionString ( ) ;
Waarom ga je na de submit naar de pagina Guestbook.aspx?res=1 ? Als ik er rechtsreeks naartoe ga krijg ik die melding terwijl er niets is toegevoegd.
Volgende code werkt beter:
if(insertMessage.ExecuteNonQuery() == 1)
{
//Bericht succesvol toegevoegd en weergeven
}
if ( insertMessage.ExecuteNonQuery ( ) == 1 )
{
//Bericht succesvol toegevoegd en weergeven
}
Martijn2008 - 15/11/2009 20:20 (laatste wijziging 15/11/2009 20:21)
PHP beginner
Textarea maken is gelukt, ThnX. Ik heb enkel nog steeds dat conversie probleem. Ik denk dat ik hetzelfde probleem heb wat betreft DateTime format. Mijn code behind ziet er nu zo uit:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
public partial class Guestbook : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
SqlConnection conn = new SqlConnection();
conn.ConnectionString = DB.ConnectionString();
try
{
conn.Open();
SqlCommand insertMessage = new SqlCommand("INSERT INTO guestbook (name, email, message, ip, time) VALUES ('" + Server.HtmlEncode(txtName.Text) + "', '" + Server.HtmlEncode(txtEmail.Text) + "', '" + Server.HtmlEncode(txtMessage.Text) + "', '" + HttpContext.Current.Request.UserHostAddress + "', '" + DateTime.Now + "')", conn);
if (insertMessage.ExecuteNonQuery() == 1)
{
txtName.Text = "";
txtEmail.Text = "";
txtMessage.Text = "";
lblResult.Text = "Uw bericht is met succes toegevoegd";
}
}
catch (Exception ex)
{
lblResult.Text = ex.Message;
}
finally
{
conn.Close();
}
}
}
using System ;
using System.Collections.Generic ;
using System.Linq ;
using System.Web ;
using System.Web.UI ;
using System.Web.UI.WebControls ;
using System.Data.SqlClient ;
public partial class Guestbook : System.Web .UI .Page
{
protected void Page_Load( object sender, EventArgs e)
{
}
protected void Button1_Click( object sender, EventArgs e)
{
SqlConnection conn
= new SqlConnection
( ) ; conn.ConnectionString = DB.ConnectionString ( ) ;
try
{
conn.Open ( ) ;
SqlCommand insertMessage
= new SqlCommand
( "INSERT INTO guestbook (name, email, message, ip, time) VALUES ('" + Server.
HtmlEncode ( txtName.
Text ) + "', '" + Server.
HtmlEncode ( txtEmail.
Text ) + "', '" + Server.
HtmlEncode ( txtMessage.
Text ) + "', '" + HttpContext.
Current .
Request .
UserHostAddress + "', '" + DateTime.
Now + "')" , conn
) ;
if ( insertMessage.ExecuteNonQuery ( ) == 1 )
{
txtName.Text = "" ;
txtEmail.Text = "" ;
txtMessage.Text = "" ;
lblResult.Text = "Uw bericht is met succes toegevoegd" ;
}
}
catch ( Exception ex)
{
lblResult.Text = ex.Message ;
}
finally
{
conn.Close ( ) ;
}
}
}
Abbas - 15/11/2009 21:26 (laatste wijziging 15/11/2009 23:25)
Crew .NET
Als je met MS SQL Server werkt zet dan het type van je datumveld eens op 'datetime', of staat het daar al op? Zo ja, let dan op de notatie zoals in de link staat die ik je gaf.
Edit:
Ik heb ook even een gastenboek in elkaar geknutseld. Ik heb dit gebruikt en dat werkt wel voor de datum (Databaseveld staat op 'datetime'):
DateTime.Now.Date.ToShortDateString()
DateTime.Now .Date .ToShortDateString ( )
Martijn2008 - 16/11/2009 00:08 (laatste wijziging 16/11/2009 00:21)
PHP beginner
Ik had het probleem zonet even opgelost door het datatype van de kolom in mijn database te veranderen naar een varchar(50). Heb ook even jouw oplossing getest. Heb dus kolom time weer terug gezet op datatype DATETIME en heb de wijziging in de code gemaakt die je hierboven als mogelijke oplossing geeft. Tot mijn grote teleurstelling krijg ik nog altijd dezelfde foutmelding met die configuratie.
Gesponsorde links
Dit onderwerp is gesloten .