Moin zusammen,
ich habe folgendes Problem beim Importieren von Daten mittels OLEDB:
Ich möchte innerhalb einer Webanwendung dem Benutzer das Importieren von Daten ermöglichen. Der Benutzer soll dabei eine Excel-Tabelle verwenden, in der die Daten enthalten sind. Folgende Klasse wird hierbei verwendet. Dabei möchte ich zuerst einmal nur die Daten aus der Excel-Tabelle auslesen und in eine ArrayList packen. Ich verwende hierbei VS 2003. Aufbau der Klasse:
using System;
using System.IO;
using System.Collections;
using System.Collections.Specialized;
using System.Text;
using System.Data.SqlClient;
using System.Data.OleDb;
using cnm.ausbildung.buecher.system;
namespace cnm.ausbildung.buecher.system
{
/// <summary>
/// Zusammenfassung für Importieren.
/// </summary>
public class Importieren: DatenbankFunktionen
{
public static string msConnString = "Data Source={0};Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0";
public OleDbConnection mConnection = new OleDbConnection((string.Format(msConnString, "D:\\Test\\importieren.txt")));
// Nur die Spalten in der Tabelle tabBuecher werden angegeben
public Importieren():base(new string[]{"ISBN_10", "ISBN_13", "Titel", "Erscheinungsdatum", "Verlag", "Sprache", "Rubrik", "Auflage", "Kaufpreis", "Bewertung", "Kommentar", "Seitenanzahl"}, "tabBuecher")
{
//
// TODO: Fügen Sie hier die Konstruktorlogik hinzu
//
}
public ArrayList SelectData (string lsFileName)
{
ArrayList lsaImportData = new ArrayList();
try
{
mConnection.Open();
System.Data.DataTable lTableNames = new System.Data.DataTable("Selektion");
lTableNames = mConnection.GetOleDbSchemaTable(Guid.NewGuid(), null);
string lsTabellenname = msTabellenname;
// AN WELCHER STELLE IN DER DATATABLE WERDEN DIE TABELLENNAMEN REINGESCHRIEBEN?
string lsSelect = "SELECT * FROM "+lTableNames;
OleDbCommand Prozedur = new OleDbCommand(lsSelect, mConnection);
OleDbDataReader lDataReader = Prozedur.ExecuteReader();
// Anweisung
while (lDataReader.Read())
{
lsaImportData.Add(lDataReader["ISBN_10"]);
lsaImportData.Add(lDataReader["ISBN_13"]);
lsaImportData.Add(lDataReader["Titel"]);
lsaImportData.Add(lDataReader["Erscheinungsdatum"]);
lsaImportData.Add(lDataReader["Verlag"]);
lsaImportData.Add(lDataReader["Sprache"]);
lsaImportData.Add(lDataReader["Rubrik"]);
lsaImportData.Add(lDataReader["Auflage"]);
lsaImportData.Add(lDataReader["Kaufpreis"]);
lsaImportData.Add(lDataReader["Bewertung"]);
lsaImportData.Add(lDataReader["Kommentar"]);
lsaImportData.Add(lDataReader["Seitenanzahl"]);
lsaImportData.Add(lDataReader["Autor"]);
}
}
catch (Exception ex)
{
mConnection.Close();
}
mConnection.Close();
return lsaImportData;
}
Aufruf der Klasse in der Webanwendung:
if (Request.Files != null && Request.Files.Count > 0)
{
HttpPostedFile lPostedFile = Request.Files[0];
if (lPostedFile.ContentType.Equals("application/vnd.ms-excel"))
{
// So soll die Datei später heißen
string lsFileName = "D:\\Test\\importieren.txt";
// Byte-Array, welches in die Datei geschrieben werden soll
byte[] lbFileData = new byte[lPostedFile.ContentLength];
// Schreiben des Byte-Arrays
lPostedFile.InputStream.Read(lbFileData,0,lPostedFile.ContentLength);
// FileStream erstellen, um die Datei schreiben zu können
FileStream lFileStream = new FileStream(lsFileName, FileMode.Create);
//Byte-Array in die Datei schreiben
lFileStream.Write(lbFileData,0,lbFileData.Length);
//FileStream freigeben und löschen
lFileStream.Flush();
lFileStream.Close();
Importieren lImportieren= new Importieren();
ArrayList lsImport = new ArrayList();
lsImport = lImportieren.SelectData(lsFileName);
lImportieren.InsertBuch(lsImport);
lImportieren.InsertAutor(lsImport);
MessageBox.Show("Ihre Daten wurden erfolgreich in die Datenbank eingefügt");}
}
Der User importiert die Daten also über einem FileUpload.
Anschließend erscheint mir folgende Fehlermeldung: GetOleDbSchemaTable wird von OLEDB 4.0 nicht unterstützt.
Weil ich trotz Internet- und Forenrecherche nicht weitergekommen bin, wende ich mich an euch.
Liegt an dem Connection-String, oder woran?
Um eine Antwort wäre ich euch sehr dankbar.
Gruß
Fenixx
An welcher Stelle genau kommt denn die Fehlermeldung?
Mir haben damals diese Codebeispiele geholfen:
http://msdn2.microsoft.com/en-us/library/ms971514.aspx
H.
Es lag am Aufbau des GetOleDbSchemaTable, dieser muss wie folgt lauten:
lTableNames = mConnection. GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[]{null, null, null, "TABLE"});