Zine.net online

Witaj na Zine.net online Zaloguj się | Rejestracja | Pomoc
w Szukaj

ucel.net

Dostęp do danych Excela za pomocą ODBC

Często zdarza się, że potrzebujemy zapisać bądź odczytać dane z pliku Excela (a przynajmniej mi się ostatnio często zdarzało). Niestety „standardowy" sposób wymiany danych, czyli OLE Automation jest koszmarnie wolny. Nie wspominam tu już o problemie, jaki powstaje, gdy na systemie operacyjnym we wersji językowej A zainstalujemy MS Office w wersji językowej B…

Z drugiej strony dane, na których operuję mają dość często strukturę tabeli: wiersz nagłówka a za nim wiersze danych. I dzięki tej strukturze znalazłem remedium na swoje problemy: pliki Excela można obrabiać interfejsem ODBC.

Pierwszym problemem, na jaki się napotykamy, jest definicja łańcucha połączenia. Próbując tego dokonać za pomocą Visual Studio (Data Connections à Add Connection) trzeba utworzyć najpierw plik za pomocą Excela, ale w końcu osiągamy efekt, czyli gotowy łańcuch do skopiowania z Server Explorera:

Dsn=Excel-Dateien;dbq=C:\Temp\test.xls;defaultdir=C:\Temp;driverid=790; maxbuffersize=2048;pagetimeout=5

Niestety tu powstaje kolejny problem, trudno się bowiem spodziewać, żeby na każdym komputerze z zainstalowanym Excelem zdefiniowane było źródło danych Excel-Dateien. Na szczęście można i ten problem obejść i zamiast DSN-a zdefiniować sterownik ODBC:

driver={Microsoft Excel Driver (*.xls)};dsn='';dbq=C:\temp\test.xls; defaultdir=c:\temp;maxbuffersize=2048;pagetimeout=5;readonly=false

Ten powinien już być ogólnie dostępny. Niestety nie da się powyższego skrócić do parametru driverid, w łańcuchu musi być zdefiniowany parametr driver lub dsn. Istotne jest też to, żeby dodać parametr readonly=false, gdyż domyślnie plik otwierany jest tylko do odczytu (także jeśli jest tworzony!).

 Sam zapis do pliku jest bajecznie prosty:


OdbcConnection cnn = new OdbcConnection(cnnString);
cnn.Open();

OdbcCommand cmd = new OdbcCommand("CREATE TABLE [Test] ([id] NUMBER, [v] TEXT)");
cmd.Connection = cnn;
cmd.ExecuteNonQuery();
cmd.CommandText = "INSERT INTO Test (id, v) VALUES (1, 'aaa')";
cmd.ExecuteNonQuery();

cmd.CommandText = "INSERT INTO Test VALUES (2, 'bbb')";
cmd.ExecuteNonQuery();


Odczyt danych odbywa się analogicznie za pomocą instrukcji SELECT. Można też używać parametrów:



cmd.CommandText = "INSERT INTO Test VALUES (?, ?)";
OdbcParameter p1 = cmd.Parameters.Add("@id", OdbcType.Int);
p1.Value = 3;

OdbcParameter p2 = cmd.Parameters.Add("@value", OdbcType.Text);
p2.Value = "ccc";

cmd.ExecuteNonQuery();

Tutaj mała uwaga: ODBC nie obsługuje parametrów nazwanych. Wszystkie parametry muszą zostać podane w postaci znaków zapytania, a następnie w odpowiedniej kolejności dodane do kolekcji parametrów. Stąd też próba uruchomienia poniższego kodu zakończy się komunikatem, że została wprowadzona niewłaściwa liczba parametrów:



cmd.CommandText = "INSERT INTO Test VALUES (@id, @value)";
cmd.Parameters.Add("@id", OdbcType.Int);
cmd.Parameters.Add("@value", OdbcType.Text);

cmd.Parameters[0].Value = 5;
cmd.Parameters[1].Value = "eee";

cmd.ExecuteNonQuery();

Opublikowane 14 maja 2007 14:28 przez ucel
Filed under: , ,

Powiadamianie o komentarzach

Jeżeli chciałbyś otrzymywać email gdy ta wypowiedź zostanie zaktualizowana, to zarejestruj się tutaj

Subskrybuj komentarze za pomocą RSS

Komentarze:

 

ucel.net said:

Często zdarza się, że potrzebujemy zapisać bądź odczytać dane z pliku Excela (a przynajmniej mi się ostatnio często zdarzało). Niestety „standardowy" sposób wymiany danych, czyli OLE Automation jest koszmarnie wolny.

maja 14, 2007 14:43
 

mof said:

Niestety zarówno powyższy sposób jak i używanie OLEDB ma jędną podstawową wadę wynikającą z samej natury "bazy danych" jaką jest Excel, mianowicie nie można na usunąć rekordów przy pomocy polecenia "DELETE" :(

maja 21, 2007 11:20
 

ucel said:

Zalezy co tak naprawde potrzebujesz od pliku.

Typowe zadania dla Excela to:

* wczytanie zawartosci arkusza (SELECT)

* strworzenie arkusza z danymi (CREATE + INSERT)

* zmiana danych w arkuszu (UPDATE)

Mozna "skasowac" rekord w ten sposob, ze wykonamy

UPDATE [Table] SET [id]=NULL, ... WHERE [id]=id_do_skasowania

ale nie polecam tej metody, bo narusza ona integralnosc arkusza (zostaje pusty wiersz). Cale szczescie, ze zostala mozliwosc usuniecia arkusza za pomoca DROP TABLE, tak wiec zawsze mozna dane po przetworzeniu wstawic do "nowej" tabeli.

Jedno jest faktem: plik excela to nie baza danych - od tego MS proponuje Accessa lub SQL Express. Metoda, ktora opisalem pozwala na szybki export / import zestrukturyzowanych danych pomiedzy aplikacja a Excelem - bez uzycia wolnej automatyzacji.

maja 21, 2007 17:11
 

epikus said:

Doświadczenia z importem danych z plików Excel opisałem tu:

http://kropanet.blogspot.com/2006/11/import-danych-z-plikw-excel.html

maja 25, 2007 12:39
 

arkadiusz.wasniewski said:

Jakiś czas temu Sławek pisał o dostępie poprzez sterowniki ODBC do tabel w formacie Excel. W podobny

czerwca 12, 2007 15:02
 

obrzymek i jego blog said:

Jakiś czas temu Sławek pisał o dostępie poprzez sterowniki ODBC do tabel w formacie Excel. W podobny

czerwca 12, 2007 15:13

Co o tym myślisz?

(wymagane) 
(opcjonalne)
(wymagane) 

  
Wprowadź kod: (wymagane)
Wyślij
W oparciu o Community Server (Personal Edition), Telligent Systems