Benutzer mit den meisten Antworten
Excel- Datei in SQL-Server importieren.

Frage
-
Hallo Zusammen,
Ich möchte mit VS 2012 (C#) eine Excel-Datei auslesen und die Datensätze in sql-Tabelle importieren.
Ich habe folgende beispiel code probiert.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Data.OleDb; using System.Data.SqlClient; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace ImportExcelDatei { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { SaveFileToDatabase("C:\\Projekte\\NCCworkshop\\Employee.xlsx"); } private void SaveFileToDatabase(string filePath) { try { String strConnection = "Data Source=.\\NB-GM;AttachDbFilename='C:\\Users\\Hemant\\documents\\visual studio 2010\\Projects\\CRMdata\\CRMdata\\App_Data\\Database1.mdf';Integrated Security=True;User Instance=True"; String excelConnString = String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=\"Excel 12.0 Xml\"; HDR=YES;IMEX=1", filePath); //Create Connection to Excel work book using (OleDbConnection excelConnection = new OleDbConnection(excelConnString)) { //Create OleDbCommand to fetch data from Excel using (OleDbCommand cmd = new OleDbCommand("select id, Name, City, Address,Designation from [Employee$]", excelConnection)) { excelConnection.Open(); using (OleDbDataReader dReader = cmd.ExecuteReader()) { using (SqlBulkCopy sqlBulk = new SqlBulkCopy(strConnection)) { //Give your Destination table name sqlBulk.DestinationTableName = "Employee"; sqlBulk.WriteToServer(dReader); } } } } } catch (Exception ex) { MessageBox.Show(ex.Message); } } } }
Die connection kann nicht geöffnet werden. Ich bekomme diese FehlermeldungInstallierbares ISAM nicht gefunden.
Ich benutze Microsoft SQL Server 2014, Excel 2013, Visual Studio 2013, x64.bit system
ich führe den code unten Zielplattform x86
Ich habe schon viele Lösungen im Internet und auch hier im Foren gelesen.
Aber ich komme nicht weiter. Kann jemand mir helfen.
Danke im vorraus
Antworten
-
Hi,
Kerl, natürlich kannst Du das so nicht schreiben. Das, was ich gezeigt hatte, war das benötigte Ergebnis aus dem ConnectionString. Da Du nicht mit @ vor dem String arbeitest, musst Du natürlich auch die Anführungszeichen mit \" maskieren. Oder halt eben @"...", dann aber die Anführungszeichen verdoppeln.
String excelConnString = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Projekte\\NCCworkshop\\Employee.xlsx;Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=1\"");
oder eben:
String excelConnString = String.Format( @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Projekte\NCCworkshop\Employee.xlsx;Extended Properties=""Excel 12.0 Xml;HDR=YES;IMEX=1""" );
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community- Als Antwort markiert Matsak Freitag, 29. April 2016 14:41
-
Hi,
ich denke, Du vermischst hier viele Sachen miteinander.
Das von dir gezeigte SQL Statement ist vom SQL Server. Du willst aber die Exceldatei abfragen. Das geht aber so, wie Du es willst, nicht, da es die genannten Objekte (Datenbankname, Schema, Tabellenname und wahrscheinlich auch die Spaltennamen gar nicht gibt).
Da ich nicht weiß, wie deine Exceldatei aufgebaut ist, probier es mal so:
SELECT * FROM [Tabelle1$A:D]
"Tabelle1" ist hierbei der Name des abzufragenden Tabellenblatts in Excel, "A:D" liest die ersten 4 Spalten, also A bis D aus. Wenn die mit einem ordentlichen Spaltenheader versehen sind, werden diese als Spaltennamen beim Auslesen berücksichtigt.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community- Als Antwort markiert Matsak Freitag, 29. April 2016 14:42
Alle Antworten
-
Hi,
Jet 4.0 ist nur für 32 Bit Anwendungen und auch nur für Exceldateien bis Version 2003 (also nur .xls, keine .xlsx Dateien) verfügbar.
Wenn Du xlsx Dateien importieren willst, muss der ConnectionString anders lauten:
String excelConnString = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0 Xml\"; HDR=YES;IMEX=1", filePath);
Siehe dazu:
http://www.connectionstrings.com/excel/
Allerdings muss ACE auch erst auf dem jeweiligen System installiert werden, da das in der Regel noch nicht vorhanden ist.
https://www.microsoft.com/de-de/download/details.aspx?id=13255
Falls bereits eine Officeversion installiert ist, muss ACE dazu passen. Wenn Du ein 64 Bit Office hast, also auch 64 Bit ACE, ansonsten eben 32 Bit.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Hallo,
Danke für deine Antwort. Ich habe der ConnectionString anders mit Username und Password geschrieben.
String excelConnString = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0 Xml\"; HDR=YES;IMEX=1; User id=username;Password=password", filePath);
Das fühlen der Befehl
OleDbConnection excelConnection = new OleDbConnection(excelConnString) excelConnection.Open();
wird vom Debugger mit folgendem Fehler unterbrochen:
Die Anwendung kann nicht gestartet werden. Die Informationsdatei für die Arbeitsgruppe fehlt oder ist exklusiv von einem anderen Benutzer geöffnet.
die DB ist nicht offen und ich bin der einzige User....
Kann mir jemand weiterhelfen?
Dankeschön
Lg
-
Hi,
lass mal Username und Password aus dem ConnectionString weg.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Hi,
hast Du meinen Beitrag überhaupt gelesen? Ist ACE in der passenden Version und Variante installiert? ...?
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Guten Morgen Zusammen, Guten Morgen Stefan
ja , ich habe "AccessDatabaseEngine_X64.exe" erfolgsreich installiert. und die ConnectionsString wie bei deinem Vorschalg geschrieben. Aber ich bekomme noch diese Fehlermeldung "
Installierbares ISAM nicht gefunden.
"
Woran kann das liegen? Vielleicht ist noch ein Parameter in der ConnectionString falsch
Danke im Voraus
Lg
-
Hi,
wenn alles richtig und passend installiert ist, dann werden bei diesem ausgewiesenen Fehler Teile des ConnectionStrings nicht erkannt. Die Ursache dafür ist meist ein Schreibfehler, z.B. fehlendes Leerzeichen bei "Data Source" oder fehlendes Semikolon zwischen den Parametern.Poste mal den genauen ConnectionString, der direkt vor Open im Connection-Objekt steht.
--
Viele Grüsse
Peter Fleischer (MVP, Partner)
Meine Homepage mit Tipps und Tricks
Kommas richtig setzen!
Schüler sagen, Lehrer haben es gut.
Schüler, sagen Lehrer, haben es gut- Bearbeitet Peter Fleischer Mittwoch, 27. April 2016 07:32
-
private void button1_Click(object sender, EventArgs e) { SaveFileToDatabase("C:\\Projekte\\NCCworkshop\\Employee.xlsx"); } private void SaveFileToDatabase(string filePath) { try { String strConnection = "Data Source=.\\NB-GM;AttachDbFilename='C:\\Users\\Hemant\\documents\\visual studio 2010\\Projects\\CRMdata\\CRMdata\\App_Data\\Database1.mdf';Integrated Security=True;User Instance=True"; String excelConnString = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0 Xml\"; HDR=YES;IMEX=1", filePath); using (OleDbConnection excelConnection = new OleDbConnection(excelConnString)) { using (OleDbCommand cmd = new OleDbCommand("select id, Name, City, Address,Designation from [Employee$]", excelConnection)) { excelConnection.Open(); // An dieser Stelle wird von Debbuger mit dem Fehler unterbrochen. using (OleDbDataReader dReader = cmd.ExecuteReader()) { using (SqlBulkCopy sqlBulk = new SqlBulkCopy(strConnection)) { //Give your Destination table name sqlBulk.DestinationTableName = "Employee"; sqlBulk.WriteToServer(dReader); } } } } } catch (Exception ex) { MessageBox.Show(ex.Message); } }
Danke -
Ich habe auch so probiert. ich bekomme die Gleiche Fehler"
Installierbares ISAM nicht gefunden.
"OleDbConnection excelConnection2 = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Projekte\\NCCworkshop\\Employee.xlsx;Extended Properties=\"Excel 12.0 Xml\"; HDR=YES;IMEX=1"); excelConnection2.Open();
-
Hi,
der ConnectionString sollte ja so aussehen:
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=X:\Ordner\Datei.xlsx;Extended Properties="Excel 12.0 Xml;HDR=YES;IMEX=1";
Dein Aufbau ergibt aber das hier:
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=X:\Ordner\Datei.xlsx;Extended Properties="Excel 12.0 Xml"; HDR=YES;IMEX=1
Bei dir steht also das doppelte Anführungszeichen gegen Ende an der falschen Stelle. Setz das mal hinter IMEX=1.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Hi,
dann läuft deine Anwendung wahrscheinlich im falschen Modus. Stell mal auf x86 oder eben auf x64 um, je nachdem, was jetzt drinsteht.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Hi,
füge mal ein Debug.WriteLine(excelConnString); nach der Zuweisung des excelConnString ein und poste die Anzeige.--
Viele Grüsse
Peter Fleischer (MVP, Partner)
Meine Homepage mit Tipps und Tricks
Kommas richtig setzen!
Schüler sagen, Lehrer haben es gut.
Schüler, sagen Lehrer, haben es gut -
Hi,
zeig man den ConnectionString, nicht die Fehlerausschrift.--
Viele Grüsse
Peter Fleischer (MVP, Partner)
Meine Homepage mit Tipps und Tricks
Kommas richtig setzen!
Schüler sagen, Lehrer haben es gut.
Schüler, sagen Lehrer, haben es gut -
HI,
kopiere mal den Inhalt der Variablen "excelConnString" hierein ins Forum und zwar zum Zeitpunkt vor dem Open. Dazu kann man einen Haltepunkt setzten und mit dem Quickwatch-Fenster den Inhalt anzeigen lassen und dann von dort hier ins Forum kopieren.
--
Viele Grüsse
Peter Fleischer (MVP, Partner)
Meine Homepage mit Tipps und Tricks
Kommas richtig setzen!
Schüler sagen, Lehrer haben es gut.
Schüler, sagen Lehrer, haben es gut- Bearbeitet Peter Fleischer Mittwoch, 27. April 2016 10:05
-
OleDbConnection excelConnection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Projekte\\NCCworkshop\\Employee.xlsx;Extended Properties= Excel 12.0 Xml; HDR=YES;IMEX=1"); excelConnection.Open();
Quickwatch_Fenste_ excelConnection Vor excelConnection.Open();
Quickwatch_Fenste_ excelConnection
- Bearbeitet Matsak Mittwoch, 27. April 2016 10:27
-
Hi,
pass bitte deinen ConnectionString so an, wie ich es geschrieben habe! Dein ConnectionString ist falsch.
Es fehlen die Anführungszeichen um die Extended Properties Werte, es ist ein Leerzeichen vor Excel Xml 12.0, usw.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Hi,
Kerl, natürlich kannst Du das so nicht schreiben. Das, was ich gezeigt hatte, war das benötigte Ergebnis aus dem ConnectionString. Da Du nicht mit @ vor dem String arbeitest, musst Du natürlich auch die Anführungszeichen mit \" maskieren. Oder halt eben @"...", dann aber die Anführungszeichen verdoppeln.
String excelConnString = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Projekte\\NCCworkshop\\Employee.xlsx;Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=1\"");
oder eben:
String excelConnString = String.Format( @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Projekte\NCCworkshop\Employee.xlsx;Extended Properties=""Excel 12.0 Xml;HDR=YES;IMEX=1""" );
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community- Als Antwort markiert Matsak Freitag, 29. April 2016 14:41
-
Hallo, Die Fehlermeldung kommt nicht mehr. Ich kann schon die connection öffnen. Danke!. Nun bei ausführen der Command bekomme ich eine Fehlermeldung. Dass das Microsoft Acces Dantenbankmodul das Objekt nicht finden konnte. hier den code.
String excelConnString = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Projekte\\NCCworkshop\\Employee.xlsx;Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=1\""); OleDbConnection excelConnection = new OleDbConnection(excelConnString) OleDbCommand cmd = new OleDbCommand("SELECT [id],[Name],[City],[Address] ,[Designation]FROM [Grau].[dbo].[Employee]", excelConnection) excelConnection.Open(); OleDbDataReader dReader = cmd.ExecuteReader(); // An dieser Stelle kommt die Fehlermeldung
Aber die Tabelle ist schon da.
Fehlermeldung
Das Microsoft Access-Datenbankmodul konnte das Objekt 'Employee' nicht finden. Stellen Sie sicher, dass das Objekt vorhanden ist und dass die Namens- und Pfadangaben richtig eingegeben wurden. Ist 'Employee' kein lokales Objekt, sollten Sie die Netzwerkverbindung prüfen oder sich an den Serveradministrator wenden.
Danke für die Hilfe
MfG
- Bearbeitet Matsak Mittwoch, 27. April 2016 14:32
-
Hi,
ich denke, Du vermischst hier viele Sachen miteinander.
Das von dir gezeigte SQL Statement ist vom SQL Server. Du willst aber die Exceldatei abfragen. Das geht aber so, wie Du es willst, nicht, da es die genannten Objekte (Datenbankname, Schema, Tabellenname und wahrscheinlich auch die Spaltennamen gar nicht gibt).
Da ich nicht weiß, wie deine Exceldatei aufgebaut ist, probier es mal so:
SELECT * FROM [Tabelle1$A:D]
"Tabelle1" ist hierbei der Name des abzufragenden Tabellenblatts in Excel, "A:D" liest die ersten 4 Spalten, also A bis D aus. Wenn die mit einem ordentlichen Spaltenheader versehen sind, werden diese als Spaltennamen beim Auslesen berücksichtigt.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community- Als Antwort markiert Matsak Freitag, 29. April 2016 14:42
-
Guten Morgen Zusammen.
Ich habe die SELECT- Statement von Stefan probiert. Es funktionniert immer noch nicht. so sieht meine Exceldatei aus
Die Exceldatei liegt unter den Odner "C:\\Projekte\\NCCworkshop\\Employee.xlsx", was ich als DataSource in der ConnectionString gegeben habe. Die Tabelle heisst "Employee."
Ich habe 2 Variante Probiert.
1-
OleDbConnection excelConnection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Projekte\\NCCworkshop\\Employee.xlsx;Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=1\""); excelConnection.Open(); OleDbCommand cmd = new OleDbCommand("SELECT * FROM [Employee$A:E]", excelConnection); OleDbDataReader dReader = cmd.ExecuteReader();
Fehlermeldung
Das Microsoft Access-Datenbankmodul konnte das Objekt 'Employee$A:E' nicht finden
2-OleDbConnection excelConnection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Projekte\\NCCworkshop\\Employee.xlsx;Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=1\""); excelConnection.Open(); OleDbCommand cmd2 = new OleDbCommand("SELECT Id, Name, City, Address,Designation FROM [Employee$]", excelConnection); OleDbDataReader dReader2 = cmd2.ExecuteReader();
Fehlermeldung
'Employee$' ist kein gültiger Name. Stellen Sie sicher, dass der Name nicht zu lang ist und keine ungültigen Zeichen oder Interpunktionszeichen enthält.
Danke für euere Hilfe
MfG
-
Hi,
stell doch bitte mal deine XLSX Datei zum Download zur Verfügung. Wenn ich das hier lokal mit deinen Angaben nachbaue, klappt das problemlos.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Hallo Stefan,
Ich weiss nicht wie ich meine XLSX Datei hier hochladen kann. Ich habe nur die möglichkeit für Bilder. Aber meine Excel Datei erhält nur die folgende 5 Spalte. und liegt unten den oben gennante Odner mit dem Name "Employee.xlsx"
Id Name City Address Designation 1 Vithal Mumbai Sion Engineer 2 Sudhir Latur Kaban QA 3 Anil Delhi Delhi Project Lead 4 Mark Toronto Canada CEO Danke