29 juli 2007

Fra Sql til C# object - del 2


Så er ferien ved at være ovre - og jeg har fået lagt sidste hånd på første version af min kodegenerator, som automatisk kan wrappe en .Net klasse rundt om en Sql-tabel.

Jeg har i mangel af bedre navn kaldt den CodeMagic - Sql 2 Object.

Under arbejdet vælger man en database og herefter en tabel. Tabellens felter kan man så vælge at omdøbe i klasse, ændre typer på, ændre skrivebeskyttelse og "null-barhed". Herefter generes cs kode og lidt sql-proc/view.

Undervejs bruges nogle lister over konvertering mellem sql-typer og .net typer. Desuden omdøbes sql-feltnavne automatisk, hvis de f.eks. hedder [Tabel].[Sælger nr.] - som f.eks. Navision synes at det er rart at kalde et sql-felt.

Jeg mangler dog en måde at kunne gemme undervejs i dette forløb og starte igen senere. Jeg leger lidt med tanken om bare at serialisere det objekt, som håndterer arbejdet i en xml-fil, så kan hentes senere. Det skulle vel kunne lade sig gøre...

Etiketter: ,

11 juli 2007

Fra Sql til C# object


Noget jeg ofte føler som drøjsomt arbejde er at lave en klasse som wrapper en sql-tabel (f.eks. Customers i Northwind), så klassen kan loade og save samt har de rette properties i forhold til tabellens kolonner.

Jeg har ikke haft held med at finde noget, som kan gøre det for mig, hvilket jeg synes er mærkeligt, da det da må være et gængs behov.

Men derfor er jeg så småt begyndt at brygge på en funktion som man kan pege ind på en tabel i en sql-database - og hvor den så returnerer en klasse, som wrapper tabellen.

Etiketter: ,

07 juli 2007

Fra DBNulls til almindelige nulls

Jeg har længe døjet med slidsom kodning, når jeg hev data fra en database til et .Net objekt:
Hvis feltet er null, så returneres værdien System.DBNull.Value - og den kan ikke castes til f.eks. en streng.

Dvs.
IDataReader dr;
(...)
string s = (string)dr["Felt_Streng"];

vil fejle hvis værdien i "Felt_Streng" er null i databasen.

Derfor har jeg lavet denne lille konverter:

static T ConvertDBNull<t>(object o)
{
if (o == System.DBNull.Value)
return default(T);
return (T)o;
}


Nu kan jeg skrive

IDataReader dr;
(...)
string s = ConvertDBNull<string>(dr["Felt_Streng"]);

Og eftersom der returneres default-værdien, så virker det også på objekter, som ikke kan være null (f.eks. int).

Etiketter: ,