theviceMedlem sedan dec. 2005198 inlägg Hej!
Jag skulle lägga upp min hemsida på mitt webbhotell för att kolla så allt fungerade. Jag körde innan med MySQL databasen på min dator. Men ska använda databasen på mitt webbhotell.
Problemet ligger i när man ska använda databasen då får jag detta felmeddelande:
System.ObjectDisposedException: Cannot access a closed Stream.
Kod:
protected void MemberLogin_Click(object sender, EventArgs e)
{
if (Page.IsValid)
{
using (MySqlConnection objConnection = new MySqlConnection(ConfigurationManager.ConnectionStrings["ConnString"].ConnectionString))
{
objConnection.Open();
using (MySqlCommand objCommand = new MySqlCommand("", objConnection))
{
objCommand.CommandText = "SELECT intID, strRole, intBanned FROM tblMembers WHERE strUsername = ?strUsername AND strPassword = ?strPassword";
objCommand.Parameters.Add(new MySqlParameter("?strUsername", tbUsername.Text));
objCommand.Parameters.Add(new MySqlParameter("?strPassword", tbPassword.Text));
//Fixar lite saker
}
objConnection.Close();
}
}
}
Vad gör jag för fel? Kan tillägga att på mitt webbhotell så har de MySQL 4.0.18 och hemma på datorn har jag den nyaste.
Hur löser jag detta?
/ Timmie
Vilken rad kommer felet på?
Det hade varit intressant att veta vad som händer på fixar lite saker.
theviceMedlem sedan dec. 2005198 inlägg Denna rad kommer felet på:
objConnection.Open();
vet inte om det här kan vara till hjälp:
[ObjectDisposedException: Cannot access a closed Stream.]
System.IO.__Error.StreamIsClosed() +56
System.IO.BufferedStream.WriteByte(Byte value) +16
MySql.Data.MySqlClient.MySqlStream.WriteHeader() +103
MySql.Data.MySqlClient.MySqlStream.Write(Byte[] buffer, Int32 offset, Int32 count) +223
MySql.Data.MySqlClient.NativeDriver.ExecuteCommand(DBCmd cmd, Byte[] bytes, Int32 length) +80
MySql.Data.MySqlClient.NativeDriver.SetDatabase(String dbName) +29
MySql.Data.MySqlClient.MySqlConnection.ChangeDatabase(String database) +68
MySql.Data.MySqlClient.MySqlConnection.Open() +323
LinkopingLife._Default.MemberLogin_Click(Object sender, EventArgs e) in c:\webs\talkactive\wse64971\tmpurl.booring.se\Default.aspx.cs:42
System.Web.UI.WebControls.Button.OnClick(EventArgs e) +105
System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +107
System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +7
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +11
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +33
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +5102
ZaimanMedlem sedan dec. 20014 239 inlägg Vet inte om det är det som är felet men jag har upptäckt att vid användning av using uppstår problem ibland. Iaf när jag som du kör lokalt har det fungerat med inte på hotellet.
Har då gjort om det till try/catch/finally vilket motsvarar using å vips så fungerar det.
Prova ifall det fungerar för dig...
Det är förmodligen något annat fel men det skadar inte att prova.
Lycka till
theviceMedlem sedan dec. 2005198 inlägg Icke sa nicke, när jag kör med try/catch så kommer felmeddelandet fortfarande fast sidan visas allt som är innan kodenraden objConnection.Open(); kommer. Felmeddelandet kommer högst upp på sidan är ser ut typ så här:
Cannot access a closed Stream.: at System.IO.__Error.StreamIsClosed() at System.IO.BufferedStream.WriteByte(Byte value) at MySql.Data.MySqlClient.MySqlStream.WriteHeader() at MySql.Data.MySqlClient.MySqlStream.Write(Byte[] buffer, Int32 offset, Int32 count) at MySql.Data.MySqlClient.NativeDriver.ExecuteCommand(DBCmd cmd, Byte[] bytes, Int32 length) at MySql.Data.MySqlClient.NativeDriver.SetDatabase(String dbName) at MySql.Data.MySqlClient.MySqlConnection.ChangeDatabase(String database) at MySql.Data.MySqlClient.MySqlConnection.Open() at LinkopingLife._Loggout.Page_Load(Object sender, EventArgs e) in c:\Documents and Settings\Micke\Mina dokument\Visual Studio 2005\WebSites\LL\Loggout.aspx.cs:line 31
Det kan även vara jag som har fattat det fel med try/catch har aldrig använt det förut. Jag gjorde så här:
try{
//all kod som vanligt med using.
}
catch (Exception ex)
{
Response.Write(ex.Message + ": " + ex.StackTrace);
}
ordellMedlem sedan sep. 200278 inlägg Hm, nu har jag inte jobbat med en MySql-server, så jag vet inte vilka fel meddelanden det kan ge specifikt. Men har du kollat så du har rätt connectionstring för anslutningen?
Ett tips är även att helt skippa using () och instansiera objektet "som vanligt".
theviceMedlem sedan dec. 2005198 inlägg Connectionstringen är rätt!
Varför ska s´jag skippa using () helt? Jag tycker att det är betydligt sexigare när man har så men jag kanske har fel. Vad gör det för skillnad? Nu har jag enbart så för det är skönare för ögonen.
ZaimanMedlem sedan dec. 20014 239 inlägg Ändra:
using (MySqlConnection objConnection = new MySqlConnection(ConfigurationManager.ConnectionStrings["ConnString"].ConnectionString))
Till:
using (MySqlConnection objConnection = new MySqlConnection(ConfigurationManager.ConnectionStrings["ConnString"].ToString()))
Den koden fungerar för mig iaf.
ordellMedlem sedan sep. 200278 inlägg using är ju bra på det sättet att Dispose automatiskt anropas efter att koden i using-blocket har exekverat klart.
Med tanke på att felet du får är ObjectDisposedException så misstänker jag att det har något med det att göra.
Vad händer i "// fixar lite saker"?
ordellMedlem sedan sep. 200278 inlägg Hur löste du problemet? :)
theviceMedlem sedan dec. 2005198 inlägg Eller det fungerade inte alls, om jag körde med min server och webbhotellets databas så funkade det. körde jag bara med webbhotellet så funkade det ej. :(
Detta händer i "// fixar lite":
using (MySqlDataReader objDataReader = objCommand.ExecuteReader())
{
if (!objDataReader.HasRows)
{
lblError.Visible = true;
}
else
{
objDataReader.Read();
if (Convert.ToInt32(objDataReader["intBanned"]) == 0)
{
Session.Add("intID", Convert.ToInt32(objDataReader["intID"]));
Session.Add("strRole", Convert.ToString(objDataReader["strRole"]));
Session.Timeout = 60;
}
else
{
Session.Add("intBanned", "1");
Response.Redirect("banned.aspx");
}
}
}
ZaimanMedlem sedan dec. 20014 239 inlägg Vad får du för fel på hotellet då?
theviceMedlem sedan dec. 2005198 inlägg Samma som vanligt:
System.ObjectDisposedException: Cannot access a closed Stream.
ZaimanMedlem sedan dec. 20014 239 inlägg Eftersom du läser upp strängen från web.config, kan du prova med att hårdkoda in anslutningssträngen på hotellet? Bara för att se att den öppnar anslutningen till databasen.
Det verkar i alla fall som om anslutningssträngen inte är korrekt på hotellet.
theviceMedlem sedan dec. 2005198 inlägg Nu så fungerar det inte hemma heller. Testade att hårdkoda in anslutningssträngen men ingen effekt.
ZaimanMedlem sedan dec. 20014 239 inlägg Kan du visa koden? Byt lösenord och användarnamn.
theviceMedlem sedan dec. 2005198 inlägg La Connstring i AppSettings i web.config istället och ändrade till onfigurationManager.AppSettings["DatabaseConnection"] så löste det sig ;)
Tack för all hjälp!
ZaimanMedlem sedan dec. 20014 239 inlägg Jahapp :OO
Markera tråden som löst också ;)