SQL-datatyper — val och mapping till C#
Praktiska regler för val av datatyper och hur de mappas till C#.
Vanliga datatyper (SQLite / SQL Server / C#):
- Integer: SQLite
INTEGER→ C# int/long; SQL ServerINT/BIGINT. - Text: SQLite
TEXT→ C# string; SQL ServerNVARCHAR. - Boolean: SQLite lagras ofta som
INTEGER(0/1) → C# bool; SQL ServerBIT. - DateTime: SQLite kan spara som
TEXT(ISO 8601) → C# DateTime; SQL ServerDATETIME2. - Decimal / Money: använd
DECIMAL(precision, scale)i DB ochdecimali C# för pengar (inte double/float). - Blob: binärdata → C# byte[] (bilder, filer).
Rekommendationer
- Pengar: använd
decimali C# ochDECIMAL(18,2)i DB eller lagra som heltal i cents (PriceInCents INTEGER). - Datum/tid: spara i ISO 8601 (
yyyy-MM-dd HH:mm:ss) om du använder TEXT, eller DB-native datetime. - Textlängder: ange maxlängd för sökbar text (NVARCHAR(100)) för index-effektivitet.
- NULL vs NOT NULL: välj NOT NULL för obligatoriska fält och använd nullable typer i C# för optionella fält (e.g. DateTime?).
Exempel:
CREATE TABLE Products (
ProductId INTEGER PRIMARY KEY AUTOINCREMENT,
Name TEXT NOT NULL,
PriceInCents INTEGER NOT NULL, -- 1999 = 19.99
CreatedAt TEXT NOT NULL DEFAULT (datetime('now')),
IsActive INTEGER DEFAULT 1
);
Mapping i C#:
public class Product {
public int ProductId { get; set; }
public string Name { get; set; } = "";
public decimal Price => PriceInCents / 100m;
public int PriceInCents { get; set; }
public DateTime CreatedAt { get; set; }
public bool IsActive { get; set; }
}
Vanliga fallgropar
- Använd inte
float/doubleför pengar. - Glöm inte timezone‑hantering om applikationen är distribuerad.
- SQLite typflexibilitet betyder att constraints och validering i applikationen är viktiga.