Får följande felmeddelande när jag kör mitt program. Kodraden som ger upphov till felmeddelandet är: Har du provat med detta? Har du övervägt att använda typade datasets? Då slipper du den här typen av problem. Det kan också vara så att värdet är null och då kan du inte casta det till en float Nej, det är inte null, jag kollar det innan tilldelning. Det fungerar med hjälp av Convert.ToDecimal(... Men jag kan fortfarande inte förstå varför det inte går att casta direkt. Kan jag förlora precision när jag använder Convert.ToDecimal? Har tyvärr inga bra länkar om typade dataset, men det är ganska enkelt. Patrik: Så om jag ändrar datatypen för attributet i SQL-server till real istället för float så kommer jag att kunna casta? Till mitt användningsområde är inte precisionen av SÅ stor betydelse..Net och SQL-server datatyper
(float)myDr["payed"]
Attributet "payed" är av typen Float i SQL-server. Vilken datatyp skall jag casta den till om inte float, har försökt med double också, men det fungerar inte heller.
Felmeddelande:
An unhandled exception of type 'System.InvalidCastException' occurred in addfdadf.exe
Additional information: Specified cast is not valid.Sv: .Net och SQL-server datatyper
<code>
Convert.ToDecimal(myDr["payed"]);
</code>
mvh
/JonasSv: .Net och SQL-server datatyper
Annars (om inte Jonas förslag med Convert-klassen fungerar) så kan du ju alltid skriva :
float.Parse(myDR["payed"].ToString())
Lite omständigt dock, att först konvertera till en sträng och sedan parsa den. Men det fungerar...
Sv: .Net och SQL-server datatyper
<code>
float floatVariabel = 0;
if(myDr["payed"] != System.DBNull.Value)
{
floatVariabel = (float)myDr["payed"];
}
</code>Sv: .Net och SQL-server datatyper
Har aldrig tittat på typade datasets, låter intressant. Något bra tips på god läsning?Sv: .Net och SQL-server datatyper
1. Gå till Project-menyn och välj Add New Item (eller ctrl+shift+a) och välj ett nytt dataset. Ge filen ett vettigt namn.
2. Du får nu upp en designer för datasetet. Öppna server explorern (Menyn View/Server explorer eller Ctrl + Alt + S). Skapa en anslutning till din databas
3. Dra och släpp din tabell från Server Explorern till designern. Nu genereras en hel massa saker i bakgrunden. Om du döpta datasetet till t ex DataCustomer och din tabell heter Customer, så kommer det att skapas :
* En klass som heter DataCustomer som ärver från DataSet
* En klass som heter CustomerTable som ärver från DataTable
* En klass som heter CustomerRow som ärver från DataRow
* För varje fält i tabellen Customer kommer en typad property att skapas i CustomerRow (Ex string Name, long CustomerNumber, ...)
* För primärnyckeln skapas en metod som heter t ex FindByID (om primärnyckeln heter ID) som returnerar CustomerRow (ej DataRow, själklar är denna typad). Jag är osäker på om det skapas en liknande metod för varje index i databasen, men för primärnyckeln gör det definitivt det.
* För varje fält i tabellen som accepterar null får du två metoder för att hantera nullvärden. Exempelvis om du har en kolumn som heter Comment som tar null så får du funktionerna SetCommentNull och IsCommentNull.
* ...
Du kan nu loopa igenom dina kunder med koden :
DataCustomer dataCustomer=GetCustomers(); // Hämta från databasen
foreach (DataCustomer.CustomerRow customer in dataCustomer.Customer)
{
Console.WriteLine(customer.Name); // ToString behövs ej eftersom Name redan är av typen string.
}
Du kan med fördel lägga flera tabeller i samma designer, eftersom du då även kan skapa relationer mellan dina tabeller. Exempelvis om du lägger till en tabell Order med en relation mellan Customer.ID och Order.CustomerID så får du nu en metod som heter GetOrdersByID som returnerar alla ordrar för en en specifik kund (CustomerID). Återigen, denna returnerar en array av OrderRow och inte DataRow.
Observera att om du lägger in relationer i ditt typade dataset så sätter det restriktioner (på gott och ont) för i vilken ordning du kan fylla på tabellerna. Du kan t ex inte fylla på tabellen Order före Customer. Du kan heller inte ta bort en kund utan att först ha tagit bort dess ordrar o s v. Samma krav gäller i det typade datasetet som det gör i databasen om du har en relation där. Tror även att dataseten stödjer Cascading Deletes o s v men jag är lite osäker där.
Hoppas att det var tillräckligt för att hjälpa dig igång med typade dataset.
Sv: .Net och SQL-server datatyper
Det finns ingen typ i C# som riktigt motsvarar Float storlek i SQL. Double är mest lik C# float, men det beror på Precision.
C#:
Type Approximate range Precision
float ±1.5 × 10-45 to ±3.4 × 1038 7 digits
double ±5.0 × 10-324 to ±1.7 × 10308 15-16 digits
SQL:
Real/Float(24) –3.40E + 38 till 3.40E + 38 7 digits
Float(53) - 1.79E + 308 till 1.79E + 308 15 digits
I C# 3.0 kommer MS se om de kan hitta en lösning på datatyper, så utvecklare inte behöver bry sig om typ mappning etc.
/Fredrik Normén NSQUARED2
http://fredrik.nsquared2.comSv: .Net och SQL-server datatyper