Avatar billede sandrasmurf Nybegynder
11. februar 2009 - 14:55 Der er 9 kommentarer og
1 løsning

OleDB CreateTable

Hej eksperter

Jeg mangler hjælp til 2 forhåbentlig simple Ole DB queries mod en database i form af dbf filer.

1)
Nedenstående Make Table Query opretter en dbf fil/table med de ønskede felter. Men ID feltet ender som et double felt. Hvordan opretter man feltet som Integer og hvor ser man hvilke navne, der er til rådighed, hvis man skulle få brug for at lave Date, Text etc.

var con = new OleDbConnection(connectionString);
con.Open();

OleDbCommand create = con.CreateCommand();
create.CommandText = "CREATE TABLE " + filename + ".dbf (ID INTEGER, Field1 DOUBLE, Field2 DOUBLE, Field3 DOUBLE, Field4 DOUBLE);";
create.ExecuteNonQuery();

2)
Jeg vil kun kalde ovenstående metode, såfremt der ikke findes en dbf fil med samme navn i rod mappen. Findes der en SQL kommando, der kan spørge om en tabel/fil eksisterer. Min connectionstring er gemt i app.config.
Avatar billede sandrasmurf Nybegynder
11. februar 2009 - 15:04 #1
Det er dBase III filer jeg arbejder med, hvis det gør en forskel.

Desuden kan jeg se i mine input filer, at ID feltet i disse er specificeret som Long Integer. Så måske spørgsmål 1 skal ændres til, hvordan man opnår at ID feltet er Long Integer.
Avatar billede arne_v Ekspert
11. februar 2009 - 15:18 #2
OleDbConnection har en GetOleDbSchemaTable metode som kan bruges til at lede efter tabeller med.
Avatar billede arne_v Ekspert
11. februar 2009 - 15:21 #3
Integer burde vaere rigtig.
Avatar billede sandrasmurf Nybegynder
11. februar 2009 - 15:41 #4
Hmmmm, What to do?

ArcGis, Excel, samt Notepad inspektion fortæller mig, at ID feltet i dBase filen er en double.

Kan det have betydning at jeg forsøger at skrive 7-cifrede Integers, eksempelvis 1002897 (listes som 1002897.00000 i Notepad)

Kan man forsøge at lave kolonnen om til Long Integer?

int id;
double field1Val, field2Val, field3Val, field4Val;

..... Assign values to fields

command.CommandText = string.Format("INSERT INTO {0}(ID, Field1, Field2, Field3, Field4) VALUES({1}, {2}, {3}, {4}, {5})", fileName, id, field1Val, field2Val, field3Val, field4Val);
Avatar billede sandrasmurf Nybegynder
11. februar 2009 - 23:42 #5
Jeg har prøvet at isolere logikken i følgende TestKlasse. Jeg ender stadig op med et ID felt af typen double og er løbet tør for idéer. Hvad kan man gøre?

class Program
{
  static void Main(string[] args)
  {
      const string tableName = "MiniTest";
      const string folder = @"C:\Output";
      string connectionString = string.Format(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=dBASE III;", folder);

      OleDbConnection con = new OleDbConnection(connectionString);

      try
      {
          con.Open();

          OleDbCommand create = con.CreateCommand();
          create.CommandText = "CREATE TABLE " + tableName + ".dbf (ID INTEGER, Field1 DOUBLE, Field2 DOUBLE, Field3 DOUBLE, Field4 DOUBLE);";
          create.ExecuteNonQuery();

          const int id = 1002897;
          const double field1Val = 12d;
          const double field2Val = 23d;
          const double field3Val = 34d;
          const double field4Val = 45d;

          OleDbCommand insertCmd = con.CreateCommand();
          insertCmd.CommandText = string.Format("INSERT INTO {0}(ID, Field1, Field2, Field3, Field4) VALUES({1}, {2}, {3}, {4}, {5})", tableName, id, field1Val, field2Val, field3Val, field4Val);

          insertCmd.ExecuteNonQuery();
      }
      finally
      {
          // Close connection.
          con.Close();
      }
  }
}
Avatar billede arne_v Ekspert
12. februar 2009 - 02:36 #6
Nu har jeg lige checket min gamle DBF kode (C kode).

Og det giver måske lidt mening. Fordi - DBase III DBF har ikke integer data type overhovedet - den har kun DECIMAL og FLOAT.

Prøv og definer id til at være f.eks. DECIMAL(10,0) og se om ikke den så "ligner" en integer.

Ellers må du nok bare leve med det.
Avatar billede sandrasmurf Nybegynder
12. februar 2009 - 13:37 #7
Hej Arne

Tak for hjælpen. Smid et svar, så er der point.

Jeg er nok nødt til at sluge double feltet indtil videre, for jeg kan ikke finde en vej uden om problemet.

Jeg arbejder med Esri Shapefiles, hvor dbf filer er en del af den overordnede filtype.

Gennem Esri ArcGIS kan man oprette DBF filer og der er det faktisk muligt at specificere både Integer og Long Integer datatypen.

Jeg har læst mig til, at Shapefiles skulle være baseret på dbf IV filer, men at det er bedst at benytte dbase III for backward compatibillity.

Så vidt jeg kan lure understøtter dBase IV heller ikke et Integer felt, så noget stemmer ikke helt overens.
http://www.clicketyclick.dk/databases/xbase/format/data_types.html

Jeg tror, at løsningen bliver at gemme en tom sketch version af dbf filen oprettet gennem ArcGIS og så kopiere filen inden skrivning. Har dog ikke tjekket om OLEDB vil være med på den fremgangsmåde.

Der er som sådan ikke noget problem i, at ID feltet er double, udover at fil størrelsen bliver større pga af de 5 overflødige ".00000" i hver række.
Avatar billede arne_v Ekspert
13. februar 2009 - 01:32 #8
Du kunne ikke slippe af med decimalerne ved at bruge DECIMAL(10,0) ?
Avatar billede arne_v Ekspert
13. februar 2009 - 01:32 #9
Og et svar.
Avatar billede sandrasmurf Nybegynder
14. februar 2009 - 19:45 #10
Hej Arne

Det gjorde ikke umiddelbart nogen forskel med Decimal(10,0). Der er stadig kommaer i ID kolonnen. Men GetOleDbSchemaTable er en super funktion. Meget brugbar.

Desuden er jeg også lige løbet imod en mur, da jeg forsøgte at databinde til en dbf fil, så jeg er pænt træt af ESRI Shapefile formatet, der altså inkluderer .dbf.

Derfor har jeg lige konverteret alle mine eksterne input filer til ESRI's GeoDatabase format(.mdb) og det har gjort tingene meget nemmere.
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