Har klippt in följande textsträng från ett exempel mden textfältet var då string. i mitt exempel så vill jag ha heltat dvs int. int nr = (int)((TextBox)e.Item.Cells[1].Controls[0]).Text; eller: Tack för hjälpen, Provade först Johans (int), men fick felmedd att den inte kunde 'convert to int' igen förutom att underförstått var borttaget. Fel av mig: Hej, Det största problemet som jag ser det då. är varför jag måste göra en convert, när jag har i detta fall ett fält med numeriskt tal av typen heltal i db Access, och ett fält av typen text? Nej, Eh, läste precis Johans post nogrant. Jag plankade detta från Microsofts egna exempel Pets. Skillnaden är ju att detta är en datagrid fält mot ett textfält i db. <code> Gerten, Eftersom jag fortfarande får Typblandningsfel i villkorsuttryck, och i Pets exempel för INSERT INTO Ser ut som följer: du skall kunna använda vad som helst där, kontrollera i db:n vad du anget där.. kontrollera sedan av så att värderna som kommer till sql satsen är det du vill att dom skall vara... Linda och Gertan, Har provat med det som stod i orginalexemplet fr microsoft och det som Linda och du skrev, men får fortfarande typblandningsfel på rad 103: Skickar med min kod så kanske Ni kan lösa det för mig, tack på förhandHur ändrar jag till int?
Cannot implicity convert 'string' to 'int'
int nr = ((TextBox)e.Item.Cells[1].Controls[0]).Text;Sv: Hur ändrar jag till int?
eller:
int nr = Convert.ToInt32(((TextBox)e.Item.Cells[1].Controls[0]).Text);
Mvh JohanSv: Hur ändrar jag till int?
int nr = int.Parse(((TextBox)e.Item.Cells[1].Controls[0]).Text);Sv: Hur ändrar jag till int?
Men med int.Parse() så löste sig problemet. Testade även med Convert.ToInt32. Och det fungerade också.
Vad är egentligen skillnaden på dessa tre satser?Sv: Hur ändrar jag till int?
Det fungerade när jag körde debug. Men när jag sen körde sidan så fick jag följande fel:
[OleDbException (0x80040e07): Typblandningsfel i villkorsuttryck.]
System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(Int32 hr)
System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult)
System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult)
System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult)
System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)
System.Data.OleDb.OleDbCommand.ExecuteNonQuery()
berlingolf.NyKlubb.ExecuteNonQuery(String sql) in c:\inetpub\wwwroot\berlingolf\NyKund.aspx.cs:103
berlingolf.NyKlubb.btnAddKlubb_Click(Object sender, EventArgs e) in c:\inetpub\wwwroot\berlingolf\NyKund.aspx.cs:87
System.Web.UI.WebControls.Button.OnClick(EventArgs e)
System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)
System.Web.UI.Page.ProcessRequestMain()Sv: Hur ändrar jag till int?
Problemet med (int) är att du då gör en unboxing, det betyder egentligen att typen är en int i grunden eller kan göras om till en int. Detta kan du dock inte göra om typen är eller vart en string. Vilket text returnerar. Det är därför du måste göra en convert eller en parse. Convert använder sig av parse så det spelar ingen roll vilken av dem du använder, jag brukar använde den som ger bäst spårbarhet och förståelse för andra utvecklare eller sig själv. Alltså Convert.
Att jag tog upp unboxing saken (int) beror på att jag ville visa allternativ som kan fungera, hade text gett typen object som retur hade (int) kunnat fungera om det var ett tal där.
Du kan ju slå upp Boxing samt Unboxing så får du mer förståelse. Även Casting är ett intressant område. Casting har samma syntax som boxing samt unboxing. (MembershipUser)User
dår jag enligt koden kastar om min User till en MembershipUser, det kräver ju dock att MembershipUser är en User eller att en User är en MembershipUser... Lär om Casting så får du veta mera...
Ha en skön kväll.
Mvh JohanSv: Hur ändrar jag till int?
Kan man inte skriva på ett annat sätt när man skall ta ut värden?Sv: Hur ändrar jag till int?
eftersom du hämtar data från literära kontroller så kan du inte hämta något annat än en text.
Enda sättet att slippa konverteringen från databasen är att antingen använda en IDbDataReader (OleDbReader, SqlReader osv), eller ett typat dataset.
Vad gäller <b>int.Parse</b> och <b>System.Convert.ToInt32</b>, så är den senare vanligtvis att föredra. Det är rätt som Johan säger att <b>System.Convert.ToInt32</b> använder sig av Int.Parse, men den har även inbyggd <b>null</b> hantering. Det hjälper oss lite på vägen.Sv: Hur ändrar jag till int?
<b>(type)</b> är inte en syntax för boxing/unboxing. Det är syntaxen för <b>typkonvertering</b>, men om typkonverteringen lyckas och den sker till/från valuetype och referencetype, då kommer CLR'n att boxa eller unboxa din data.
Boxning sker om du konvertera från en value type till en reference type. Det vill säga om du tex tar en struct och konverterar den till ett interface eller tar en integer och konverterar den till ett System.Object.
Eftersom interface variabler och System.Object räknas som referensvariabler och dess data skall ligga på heapen så kommer CLR att kopierar datat från stacken till heapen för att kunna sätta en referens till det. Det är det här som kallas boxing.
Unboxing är processen omvänd.
Precis som Johan säger är det en mycket kostsam operation och bör undvikas, men ibland kommer man ju inte undan.Sv: Hur ändrar jag till int?
string name = ((TextBox)e.Item.Cells[1].Controls[0]).Text;
Så jag bytte bara ut <b> string name <b> mot int nr.
Kan du förklara vad raden betyder och om du vill hur ska det stå?
Tack på förhand och trevlig Pings
GertSv: Hur ändrar jag till int?
int id = Convert.ToInt32(((TextBox)e.Item.Cells[1].Controls[0]).Text);
</code>
vill du göra det mot db så brukar det se ut så här:
<code>
int id = Convert.ToInt32(dr["idField"]);
</code>
där DR antingen är en System.Data.DataRow eller en System.Data.IDataReader (ex SqlDataReader). Fast är det en DataReader så kan du också använda:
<code>
int id = dr.GetInt32(0);
</code>
Men då måste du känna till kolumn indexet och kan inte använda namnet.Sv: Hur ändrar jag till int?
Om vi börjar inne ifrån så har vi
e.Item.Cells[1].Controls[0]
Denna returnerar ett objekt av typen <b>Control</b> som är basklassen för alla WinForm kontroller. Basklassen innehåller bara metoder och properties som alla kontroller använder och när man ärvern en ny kontroll så lägger man oftast på egna sådana för den funktionalitet som kontrollen skall ha.
Ett sådant property är <b>Text</b> som inte finns på basklassen <b>Control</b> utan som i man lagt till på kontrollen i fråga - i ditt fall en <b>TextBox</b>. Så vad du behöver göra för att komma åt <b>Text</b> är att <b>typkonvertera Control</b> objektet till en <b>TextBox</b>.
((TextBox)e.Item.Cells[1].Controls[0])
Här har du konverterart objektet till rätt typ och du kan nu komma åt alla de extra saker som <b>TextBox</b> kontrollen erbjuder, så som <b>Text</b> propertiet som du nu kan läsa ut.
((TextBox)e.Item.Cells[1].Controls[0]).Text
<b>Text</b> propertiet returnerar en sträng och om du vet att det är ett numerisktvärde som vi vill ha till en numeriskvariabel får du konvertera denna med t.ex <b>Convert.ToInt32</b> metoden
int v = Convert.ToInt32(((TextBox)e.Item.Cells[1].Controls[0]).Text);
Det är vad som händer, och sen har .Patrik gett dig tips på hur du skriver.
Hoppas detta var till nytta =)
//Andreas
Sv: Hur ändrar jag till int?
string sql = "INSERT INTO Kund (GolfKlubb, KlubbNamn)"
+ " VALUES (\"new\", \"new\")";
Är det så att " VALUES (\"new\", \"new\")" fälten är för text?
I min test db har jag ett nummeriskt fält och ett textfält. Vad skall det då vara?
Trevlig PingstSv: Hur ändrar jag till int?
sen vet jag inte vad \"new\", skall betyda skriver iaf inte så i vb.net... kanske ngt i c#?!? =)
i vb.net och mot oledb databas brukar jag skriva så här:
insert into kund(golfklubbnr, klubbnamn) values (' & tal & ', '" & text & "')
där tal och text är en int samt en string variabel
vet inte om det e till ngn hjälp =DSv: Hur ändrar jag till int?
Det som Linda beskriver är ett korrekt exempel pår hur du skapar ett <b>insert</b> query med en numeriskparameter och en textparameter. Det som ser lite konstigt ut i Gertan:s exempel med <b>\"</b> är, som Linda mycket korrekt gissade, en C# sak.
I C# används \ för att ange en escape-kod. I detta fallet säger man att det som kommer direkt efter skall tolkas som en " .. hade man inte haft den hade man fått " VALUES "new","new)" vilket skulle ge en ofullständig sträng. Lösningen är att göra som i VB.NET nämligen att använda ' och " så vi får " VALUES ('new', 'new')".
//AndreasSv: Hur ändrar jag till int?
Gert
private void btnAddKlubb_Click(object sender, System.EventArgs e)
{
string sql = "INSERT INTO Kund (GolfKlubb, KlubbNamn)"
+ " VALUES ('new', 'new')";
ExecuteNonQuery(sql);
ReadRecords();
}
private void ExecuteNonQuery(string sql)
{
OleDbConnection conn = null;
try
{
conn = new OleDbConnection(
@"Provider=Microsoft.Jet.OLEDB.4.0; " +
@"Data Source=" + Server.MapPath("db/BerlinGolf.mdb"));
conn.Open();
OleDbCommand cmd = new OleDbCommand(sql, conn);
cmd.ExecuteNonQuery();
}
finally
{
if (conn != null) conn.Close();
}
}
private void datagrid_CancelCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
datagrid.EditItemIndex = -1;
ReadRecords();
}
private void datagrid_EditCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
datagrid.EditItemIndex = e.Item.ItemIndex;
ReadRecords();
}
private void datagrid_DeleteCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
int KundId = (int) datagrid.DataKeys[(int) e.Item.ItemIndex];
string sql = "DELETE FROM Kund WHERE KundId=" + ID;
ExecuteNonQuery(sql);
ReadRecords();
}
private void datagrid_UpdateCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
int KundId = (int) datagrid.DataKeys[(int) e.Item.ItemIndex];
int KlubbNr = int.Parse(((TextBox)e.Item.Cells[1].Controls[0]).Text);
string KlubbNamn = ((TextBox)e.Item.Cells[2].Controls[0]).Text;
string sql =
"UPDATE Kund SET Golfklubb=\"" + KlubbNr +
"\", KlubbNamn=\"" + KlubbNamn + "\"" +
" WHERE KundId=" + KundId;
ExecuteNonQuery(sql);
datagrid.EditItemIndex = -1;
ReadRecords();
}