webForumDet fria alternativet

Hämta data via klass

.NET

12 svar · 377 visningar · startad av Web-Tor

Medlem sedan nov. 200013 890 inlägg
Frågan#1

Jag har två celler i en vanlig HTML-tabell.

Varje cell innehåller en asp:label som ska fyllas med text.

Jag har en klass (Content) som hämtar texten via en annan klass (Database).

Just nu så hämtar jag en cell i taget med den här koden: (jag visar bara koden för att hämta den första cellen)
Aspx-sidan »

Content page = new Content();
Cell1Label.Text = page.Cell1("node");

Content.cs »

public class Content
{
	public string Cell1(String nodeID)
	{
		Database db = new Database();
		DataSet ContentDS = db.getDataSet("SELECT columnCell1 FROM tableContent WHERE columnID=" + nodeID + "");

		DataView Source = ContentDS.Tables[0].DefaultView;
		string text = Source[0][" columnCell1"].ToString();
		return text;
	}
}

Det måste finnas nåt sätt att hämta båda cellerna på en gång? Så att jag slipper ställa två frågor till databasen.

Jag skulle alltså vilja ha en funktion i Content-classen som heter Cell1_and_Cell2

Är ni med?

Medlem sedan juni 20011 732 inlägg
#2

Javisst, se till ditt object "page" innehåller en collection av något slag med de värden du behöver använda så behöver du bara göra en instans av objectet. Alltså, istället för att returnera en väldigt specifik sträng så kan du ju returnera hela ditt dataset (eller en arraylist eller vad du nu finner lämpligt).

Medlem sedan juni 20011 732 inlägg
#3

Tips, att använda ett helt dataset för en ynklig liten sträng är nog overkill va... ;)

Medlem sedan nov. 200013 890 inlägg
#4

Jag är med på tankesättet.
Jag har försökt att returnera ett dataset med får det inte att funka. :(
Men vad gäller C# så är jag tyvärr inte lika snabb i tangentbordet som jag är i huvudet. :l

/r En arraylist går snabbare eller?

Medlem sedan okt. 20005 273 inlägg
#5

JAg vet inte om dettta är rätt men jag har gjort följande vid liknande situationer.
Classen Content har en Construktor så när den initieras så hämtas värdena Cell1 och Cell2 mha en DataReader och dessa värden placeras i variabler, som sedan kan hämtas som vanligt, typ så här

[red]
Content page = new Content() //här initieras classen och värdena fylls på
Cell1Label.Text = page.Cell1;
Cell1Label.Text = page.Cell2;
[/red]

Kanske inte den bästa förklaringen......men....jag återkommer...

Medlem sedan juni 20011 732 inlägg
#6

Du returnerar ett dataset (om du nu ska ha det) på samma sätt, men sedan måste du naturligtvis också ta emot och använda objektet som ett dataset.

Medlem sedan okt. 20005 273 inlägg
#7

Men är jag helt fel ute om jag postar denna kod:

[red]
	public class Content
	{
		private string _cell1;
		public Content()
		{
			//Hämtar datat mha datareader
			_cell1 = datareader["C1"].ToString();
		}
		public string Cell1
		{
			get
			{
				return _cell1;
			}
		}
	}
[/red]

Mvh icaaq

Medlem sedan juni 20011 732 inlägg
#8

Nej, precis som icaaq visar här ovan så är det smidigast att du kan hämta dina variabler direkt i klassen, det är som sagt rejält onödigt att returnera ett helt dataset för två variabler!

Medlem sedan okt. 20005 273 inlägg
#9

weeee :)

Medlem sedan nov. 200013 890 inlägg
#10

Det är bra att ni är överens. :)
Jag får ta en titt på det här i helgen och hoppas att även jag fattar. :e

Grejen är ju att man använder det som man känner till. Av någon anledning så har jag snöat in på DataList:er och då blir det lätt så att man vill använda det till allt. Jag måste helt enkelt lära mig mer. :)

Icaaq »
1. Måste jag inte någon stans i Content-classen ta emot en variabel som berättar vilken rad ur databasen det är som jag ska hämta?

2. Var i din kod är det själva SQL-frågan ska in?

Medlem sedan nov. 200013 890 inlägg
#11

Nu har jag gjort så här:

aspx-sidan »

private void Page_Load(object sender, System.EventArgs e)
{
	int _node = Convert.ToInt16(Request.QueryString["node"]);

	string Cell1 = "";
	string Cell2 = "";

	Content page = new Content();
	OleDbDataReader myReader = page.Template1(_node);

	while(myReader.Read() == true)
	{
		Cell1 += myReader["colCell1"];
		Cell2 += myReader["colCell2"];
	}

	LabelCell1.Text = Cell1;
	LabelCell2.Text = Cell2;
}

Content.cs »

public class Content
{
	public OleDbDataReader Template1(int nodeID)
	{
		Database db = new Database();
		OleDbDataReader myReader = db.getReader("SELECT colCell1, colCell2 FROM tblContent WHERE colID=" + nodeID + "");
		return myReader;
	}
}

Database.cs »

public class Database
{
	OleDbConnection myConn;

	public Database() 
	{
		myConn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=c:/InetPub/wwwroot/Consolidate/bin/consolidate.mdb");
	}

	public OleDbDataReader getReader(String mySQL)
	{
		OleDbCommand myCmd = new OleDbCommand(mySQL, myConn);
		myConn.Open();
		OleDbDataReader myReader = myCmd.ExecuteReader(CommandBehavior.CloseConnection);
		return myReader;
	}
}

Det funkar men är det "rätt"?

Medlem sedan jan. 20012 204 inlägg
#12

Beror väl på lite hur pass avancerad applikationen är. Orkar du läsa så kolla på http://www.webforum.nu/showthread.php?s=&threadid=61076

Medlem sedan nov. 200013 890 inlägg
#13

Sidan är inte så avancerad (se den här tråden) men koden får gärna vara mer avancerad än vad som behövs. ;)

Jag har försökt att lösa det här på nåt annat sätt men jag lyckas inte:

	while(myReader.Read() == true)
	{
		Cell1 += myReader["colCell1"];
		Cell2 += myReader["colCell2"];
	}

Bara det här blir t.ex. fel:

Cell1 = myReader["colCell1"];
264 ms totalt · 4 externa anrop · v20260731065814-full.e96017d9
120 ms — deklarationer (db)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)
130 ms — ändringar (db)