Jag upplever att denna kod ta "lång tid" att köra. Benni, Hej Andreas, och tack för svaret. Om du inte använder ditt dataset mer i koden så är den inte särskilt effektiv. För det första bör du se till att bara välja första posten i din sql-sats (om du nu inte redan gjort det, svarar på fel inläägg för att se det ;D ) Dessutom känns ett dataset lyxigt; använd en DataReader. Ex: Testa att ändra sql-satsen till följande: pelka: Oj, missade att det var en dataadapter du använde. Du får byta din dataadapter mot en Command-class istället. Dås ak det där fungera Onkelberg.Optimera kod
Databasen är Access, går det att göra denna snabbare/effektivare?
<codecharp>
if(comboBox1.SelectedIndex >0)
{
string sCountry = comboBox1.Text;
string fullName = Regex.Split(sCountry , "([_]+)")[2];
string shortName = sCountry.Substring(0,2).ToLower();
string Constring = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = "+"\"" + dataString + "\"" +"";
Form2.ActiveForm.Refresh();
string sql = "SELECT t_pageSidor.PageID, t_pageSidor.LangID, t_pageSidor.TextId, t_pageSidor.PageText, t_lang.shortLang " +
"FROM t_lang INNER JOIN t_pageSidor ON t_lang.lang_id = t_pageSidor.LangID " +
"WHERE t_pageSidor.PageID=" + iNyttsidNr +" AND t_pageSidor.TextId= " + iNyttMultiNr + " AND t_lang.shortLang = '" + shortName + "'";
con = new OleDbConnection(Constring);
da = new OleDbDataAdapter(sql,con);
ds = new DataSet("fromNTranslate");
con.Close();
con.Open();
da.Fill(ds,"fromNTranslate");
con.Close();
int a = 3;
richTextBox2.Text=(ds.Tables["fromNTranslate"].Rows[0][a].ToString());
nytt=false;
}
</code>
Vad som händer är att formen inte ritas ut medans "datorn tänker".Sv: Optimera kod
Nu börjar vi vandra in på lite svårare saker. Problemet är att du använder en enkeltrådad applikation vilket gör att när du kör kod som tar långtid så kan inte någon annan del av ditt program svar, och det är därför som ditt gränssnitt "dör" under tiden arbetet genomförs.
Lösningen på detta är att använda ytterligare en tråd för att köra arbetet i bakgrunden och på så sätt ge din huvudtråd (där ditt gränssnitt finns) möjlighet att vara levande undertide som arbetet körs. Det är inte helt enkelt att bli vän med trådning vid första ögonkast och det finns ett par olika sätt (skapa egen tråd, använda ThreadPool klassen etc) att lösa det.
Principen är, skapa en ny tråd, exekvera koden som tar lång tid i den, när den är klar så signalerar den resultatet till din huvudtråd. Om du vill signalera <b>events</b> mellan trådar så bör du läsa http://www.pellesoft.se/communicate/forum/view.aspx?msgid=118602&forumid=44&sum=0 där .Patrik behandlar ett "allvarligt" problem när man fösöker uppdatera ett gränssnitt från en annan tråd (kort: det är aldrig bra) samt presenterar en fungerande lösning med nerladdningsbar kod.
Ta en titt på <b>Thread</b> och <b>ThreadPool</b> klasserna samt läs på lite hur <b>Asynchrounous IO</b> fungerar.
Ditt problem är inget ovanligt, men det kräver lite studier för att du skall kunna lösa det. Trädning medför stort ansvar (diciplin) på dig som programmerare, speciellt om man skall använda resurser som delas mellan trådarna (men det borde inte du behöva).
//AndreasSv: Optimera kod
Jag tror att det är lite över min klass.
Möjligen att jag kommer tillbaka till denna tråden senare, jag bör nog ta en titt på allt det andra först.Sv: Optimera kod
//command är ditt command-objekt
System.Data.IDataReader dr;
dr = command.ExecuteReader(); //Retunerar en IDataReader,
//det är bra om du inte
//binder dig till OleDbDataReader eftersom att det då blir svårare
//att byta datakälla.
if(dr.Read()) //Säkerhet, kollar så att du retunerar något.
{
min_variabel = dr.GetString(0) //GetByte/GetInt32/GetBoolean etc.
}
else
{
//inget retunerat!
}
//stäng allt etc.
Den där koden retunerar den första raden (.Read()) och den första kolumnen (.GetString()) som antas vara en sträng.
Sv: Optimera kod
<CODE>
string sql = "SELECT iv2.PageID, iv2.LangID, iv2.TextId, iv2.PageText, iv1.shortLang FROM (SELECT shortLang, lang_id FROM t_lang WHERE shortLang = '" + shortName + "') iv1, (SELECT PageID, LangID, TextId, PageText FROM t_pageSidor WHERE PageID = " + iNyttsidNr + " AND TextId = " + iNyttMultiNr + ") iv2 WHERE iv1.lang_id = iv2.LangId";
</CODE>
Detta kan gå snabbare, men detta beror mycket på hurpass duktig databasmotorns optimerare är. Det är iallafall i sql server ofta möjligt att snabba upp vissa frågor med hjälp av inline views.
Lycka till!
/PKSv: Optimera kod
Menar du att jag skall ersätta mina tabelnamn med "iv1.PageID och iv2.PageID"?
Onkelberg
Jag förstår inte hur jag skall koppla
dr = command.ExecuteReader(); ?
För det är väll inte så att det kopplad likadant som adaptern?Sv: Optimera kod
Sv: Optimera kod
När jag kör så här:
<codesharp>
OleDbCommand Command = new OleDbCommand(sql,con);
System.Data.IDataReader dr;
con.Open();
dr = Command.ExecuteReader();
// if(dr.Read())
// {
while (dr.Read() )
{
richTextBox2.Text = dr.GetString (3);
}
// }
con.Close();
dr.Close();
</code>
...då fungerar allting helt suveränt, blir också avsevärt snabbare.
Men im jag lägger in din föreslagna if-sats, då läser den ingenting.
Mysko...