webForumDet fria alternativet

Koppla ifrån connection från oleDbdatareader

.NET

10 svar · 422 visningar · startad av Nöff

Medlem sedan nov. 2003569 inlägg
Frågan#1
		private OleDbDataReader SQL(string sqlstring) 
		{
			OleDbConnection objConnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Ole DB Services=-4; Data Source=databas.mdb");
			OleDbCommand objCommand=new OleDbCommand(sqlstring, objConnection);
			objConnection.Open();
			return objCommand.ExecuteReader(CommandBehavior.CloseConnection);
		}

OleDbDataReader testreader=SQL("SELECT * FROM personal");
testreader.Close();

Tyvärr så funkar inte denna särskilt bra, även fast jag anger Commandbehavior.CloseConnection dvs att den ska stänga connection objektet när jag stänger datareadern, så är den fortfarande öppen när jag testreader.Close();. vad beror detta på egentligen?, för att ställer jag cirka 30 frågor till databasen så får jag ett error. Och det är för att den inte stänger objektet.

Eller är det nåt annat fel jag gjort?.

Och tyvärr kan jag ju heller inte i funktionen stänga connection objektet direkt efter ExecuteReader() eftersom man kan ju inte läsa från en datareader när connection.Close() , tycker jag är lite underligt, därför undrar jag om det på nåt sätt går att lösgöra DataReadern helt och hållet från Connection objektet?. Eller på ett annat sätt få den att stängas när jag stänger min datareader?.

Medlem sedan okt. 20005 273 inlägg
#2

Jag tycker det ser ok ut.

Vad får du för felmess?

Mv icaaq

Medlem sedan maj 20012 812 inlägg
#3

Det borde fungera, precis som icaaq säger så ser koden rätt ut.

Jag skulle dock rekomendera dig att skicka tillbaka ett DataTable objekt istället. På detta sätt så blir din funktion helt oberoende av att något objekt måste stängas senare.

Eftersom en DataTable kan leva fast kopplingen är stängd. Du förlorar lite i prestanda på det om du endast använder din reader till att bindadirket till en repeater på en ASPX-sida. Men om du istället för en massa kontroller med din repeater så kan du öka din skalbarhet betydligt genom att skicka tillbaka en datatabell istället för en reader.

- M

Medlem sedan nov. 2003569 inlägg
#4
		private int SQLGETLASTID(string sqlquiz) 
		{		
                        OleDbCommand objCommand=new OleDbCommand();
			objCommand.Connection= new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Ole DB Services=-4; Data Source=databas.mdb");
			objCommand.Connection.Open(); <------felmeddelandet pekar på denna
			objCommand.CommandText=sqlquiz;
			objCommand.ExecuteNonQuery();
			objCommand.CommandText="SELECT @@IDENTITY AS butthole";
			int LASTID=int.Parse(objCommand.ExecuteScalar().ToString());
			objCommand.Connection.Close();
			objCommand.Connection.Dispose();
			objCommand.Dispose();
			return LASTID;
		}

Nej ursäkta, det var den här funktionen som ger ett "odefinierat fel" efter ungefär 30-40 anrop, har ett antal SQL-funktioner i min kod :) svårt att hålla reda på alla. Ibland händer felet, ibland händer det inte. jättekonstigt.

Medlem sedan nov. 2003569 inlägg
#5

aaaarrghhh!!.

Den här funktionen ballar också ur efter 30-40 anrop :(

		private void SQLPUT(string sqlquiz) 
		{
			OleDbCommand objCommand=new OleDbCommand();
			objCommand.Connection=new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Ole DB Services=-4; Data Source=databas.mdb");
			objCommand.Connection.Open();
			objCommand.CommandText=sqlquiz;
			objCommand.ExecuteNonQuery();
			objCommand.Connection.Close();
			objCommand.Connection.Dispose();
			objCommand.Dispose();
		}

Vad är det frågan om egentligen??!?!

Jag får samma fel hela tiden, "odefinierat fel" och så pekar den på objCommand.Connection.Open() metod anropet...

Odefinierat fel 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.Data.OleDb.OleDbException: Odefinierat fel

Source Error: 

Line 97: 			OleDbCommand objCommand=new OleDbCommand();
Line 98: 			objCommand.Connection=new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Ole DB Services=-4; Data Source=databas.mdb");
Line 99: 			objCommand.Connection.Open();
Line 100:			objCommand.CommandText=sqlquiz;
Line 101:			objCommand.ExecuteNonQuery();
 

Source File: c:\inetpub\wwwroot\asp.net\webform1.aspx.cs    Line: 99 

Stack Trace: 

[OleDbException (0x80004005): Odefinierat fel]
   System.Data.OleDb.OleDbConnection.ProcessResults(Int32 hr)
   System.Data.OleDb.OleDbConnection.InitializeProvider()
   System.Data.OleDb.OleDbConnection.Open()
   shell.WebForm1.SQLPUT(String sqlquiz) in c:\inetpub\wwwroot\asp.net\webform1.aspx.cs:99
   shell.WebForm1.BindPage(String soktkund) in c:\inetpub\wwwroot\asp.net\webform1.aspx.cs:197
   shell.WebForm1.Page_Load(Object sender, EventArgs e) in c:\inetpub\wwwroot\asp.net\webform1.aspx.cs:275
   System.Web.UI.Control.OnLoad(EventArgs e)
   System.Web.UI.Control.LoadRecursive()
   System.Web.UI.Page.ProcessRequestMain()

 

--------------------------------------------------------------------------------
Version Information: Microsoft .NET
Medlem sedan nov. 2003569 inlägg
#6

och en annan fråga.
för att vara på den säkra sidan vid datareaders

ska man för säkerhets skull göra en

reader.Close();
reader=null;

en null också?

Medlem sedan maj 20012 812 inlägg
#7

Du behöver inte sätta ett objekt till null, eftersom kompilator själv vet om du tänker använda objektet mer. Om du inte gör det så sätts det till null så fort det har använts sista gången.

Så nej du behöver inte sätta ditt objekt till Null.

- M

Medlem sedan mars 20023 561 inlägg
#8

Hur är det med .dispose(); då??

Medlem sedan maj 20012 812 inlägg
#9

.Dispose() är inget som måste göras, men något som bör göras :)

Det hela beror på hur GC (GarbageCollectorn) fungerar. Och enkelt förklarat så kan man säga så här.

När du skapar ett objekt som har en referens till typ en databas, så när GC körs så kontrollerar den om ditt objekt används mer, nej det gör den inte, då kontrollerar den om den har någon referens utanför .NET, typ en databas. Och det har den, då läggs detta objekt på en speciell lista.

Nästa gång GC körs så tar man bort objektet från denna speciella lista. Det betyder att du behöver 2 GC körningar för att bli av med detta objekt.

Om du däremot kör en Dispose() på objektet så tar man bort kopplingen till databasen, och när GC körs första gången så kan objektet tas bort direkt.

Så Nej du behöver aldrig kalla på Dispose() men rekomenderat är att så fort ett objekt har en dispose() method så skall man anropa den när man inte behöver objektet mer.

- M

Medlem sedan sep. 20026 425 inlägg
#10

Trevlig förklaring, Gladh! Mycket intressant med sådan här läsning! :bire

Medlem sedan mars 20023 561 inlägg
#11

Tackar Gladh för den utförliga beskrivningen. :bire

261 ms totalt · 4 externa anrop · v20260731065814-full.2f471f9e
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)
121 ms — ändringar (db)