Avatar billede sandrasmurf Nybegynder
25. februar 2010 - 14:58 Der er 3 kommentarer og
1 løsning

Et spørgmål om at skrive tomme Integer felter gennem OleDB

Hej eksperter

Jeg arbejder på et CSV til mdb modul. Modulet bruger StreamReader, String.Split og OleDb til opgaven. Der er 10 kolonner og tusindvis af rækker.

Min udfordring drejer sig om at skrive et tomt heltalsfelt til databasen. Det sker jævnligt, at den 4 kolonne for en række ikke har nogen værdi. Kolonnen er ikke obligatorisk og feltet skal altså blot være tomt = uden standardværdi.

string insertQuery = string.Format("INSERT INTO {0} ", tableName);
insertQuery += "(routeID, posInRoute, type, orderID, placeID, lon, lat, startTime, endTime, loadAfter) ";
insertQuery += "VALUES (?,?,?,?,?,?,?,?,?,?);";

OleDbCommand insertCmd = new OleDbCommand(insertQuery, conn);

foreach (string[] splitLine in ReadCsv(csvFilePath))
{
...
  insertCmd.Parameters.Add("@oId", OleDbType.Integer).Value = Int32.Parse(splitLine[3]);
...
}

Jeg ønsker stadig at skrive de 9 andre kolonner, men kolonne 4 skal være tom. Hvordan klarer jeg det?

string.isNullOrEmpty(splitLine[3]) kan fortælle mig om feltet skal være tomt, men jeg ved ikke hvordan man sætter værdien på en Integer Parameter til ingenting.

if(string.isNullOrEmpty(splitLine[3]))
  insertCmd.Parameters.Add("@oId", OleDbType.Integer).Value = ???;
else
  insertCmd.Parameters.Add("@oId", OleDbType.Integer).Value = Int32.Parse(splitLine[3]);

Kan nogen hjælpe?
Avatar billede keysersoze Guru
25. februar 2010 - 15:18 #1
DBNull.Value
Avatar billede sandrasmurf Nybegynder
25. februar 2010 - 16:49 #2
Niceness. DBNull.Value er vejen frem til tomme Integer felter. Smid et svar.

Lige nu klarer jeg mig med følgende:

if(string.isNullOrEmpty(splitLine[3]))
  insertCmd.Parameters.Add("@oId", OleDbType.Integer).Value = DBNull.Value;
else
  insertCmd.Parameters.Add("@oId", OleDbType.Integer).Value = Int32.Parse(splitLine[3]);

Men det bliver godt nok klumpet kode, når man skal skrive en if-else for hvert af de 10 tal-felter.

Jeg har forsøgt med en one-liner baseret på ? a la

nsertCmd.Parameters.Add("@oId", OleDbType.Integer).Value = string.isNullOrEmpty(splitLine[3]) ? DBNull.Value : Int32.Parse(splitLine[3]);

Men det compiler ikke, da den ikke kan konvertere DBNull.Value til int. Kan man gøre det smartere?
Avatar billede keysersoze Guru
25. februar 2010 - 18:30 #3
(int)DBNull.Value hvis du er heldig - ellers har jeg ikke lige noget forslag.
Avatar billede arne_v Ekspert
26. februar 2010 - 17:16 #4
(int)DBNull.Value virker naeppe

proev:

insertCmd.Parameters.Add("@oId", OleDbType.Integer).Value = string.isNullOrEmpty(splitLine[3]) ? (object)DBNull.Value : (object)Int32.Parse(splitLine[3]);
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester



IT-JOB

Udviklings- og Forenklingsstyrelsen

Business Analysts til samfundsvigtige it-projekter

Udviklings- og Forenklingsstyrelsen

Generalister til PMO og strategiimplementering

Udviklings- og Forenklingsstyrelsen

ITSM-koordinator