none
Excel- Datei in SQL-Server importieren. RRS feed

  • 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 Fehlermeldung

    Installierbares 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

    Dienstag, 26. April 2016 12:44

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
    Mittwoch, 27. April 2016 12:29
    Moderator
  • 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
    Mittwoch, 27. April 2016 14:51
    Moderator

Alle Antworten

  • Dienstag, 26. April 2016 12:51
  • 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

    Dienstag, 26. April 2016 13:57
    Moderator
  • 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

    Dienstag, 26. April 2016 14:36
  • 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

    Dienstag, 26. April 2016 14:47
    Moderator
  • Hallo,

    ja ich habe Username und Password weg gelassen. Ich bekomme die voherige Fehlermeldung

    Installierbares ISAM nicht gefunden.

    Danke.


    • Bearbeitet Matsak Dienstag, 26. April 2016 14:52
    Dienstag, 26. April 2016 14:49
  • 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

    Dienstag, 26. April 2016 14:58
    Moderator
  • 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

    Mittwoch, 27. April 2016 07:10
  • 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


    Mittwoch, 27. April 2016 07:31
  •   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
    Mittwoch, 27. April 2016 07:43
  • 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();


    Mittwoch, 27. April 2016 07:48
  • 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

    Mittwoch, 27. April 2016 07:51
    Moderator
  • Hallo,

    Ich habe eingesetzt. Funcktioniert auch nicht. gleiche Fehler

    MfG

    Mittwoch, 27. April 2016 08:36
  • 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

    Mittwoch, 27. April 2016 08:40
    Moderator
  • 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

    Mittwoch, 27. April 2016 08:52
  • Mittwoch, 27. April 2016 09:21
  • 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

    Mittwoch, 27. April 2016 09:37
  • Hallo,

    ja, die Fehlerausschrift wird hier  "excelConnection.Open();" angezeigt

    Mittwoch, 27. April 2016 09:46
  • 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


    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
    Mittwoch, 27. April 2016 10:23
  • 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

    Mittwoch, 27. April 2016 11:07
    Moderator
  • Hallo,

      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"");

    führt zur Fehler. Ich kann so nicht schreiben

    Mittwoch, 27. April 2016 12:18
  • 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
    Mittwoch, 27. April 2016 12:29
    Moderator
  • 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
    Mittwoch, 27. April 2016 14:28
  • 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
    Mittwoch, 27. April 2016 14:51
    Moderator
  • 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

    Donnerstag, 28. April 2016 09:38
  • 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

    Donnerstag, 28. April 2016 09:52
    Moderator
  • 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

    Donnerstag, 28. April 2016 10:12
  • Hi,

    ich habe gefunden. Mit dem Link "http://www.file-upload.net/download-11527143/Employee.xlsx.html" sollte die Download Klappen

    Danke

    Donnerstag, 28. April 2016 10:25
  • Hallo Stefan,

    könntest du die  XLSX Datei Download ? Klappt die Zeile "

    OleDbDataReader dReader = cmd.ExecuteReader();

    " immer noch bei Ihnen? bei mir klappt immer noch nicht.

    Danke im voraus

    MfG

    Donnerstag, 28. April 2016 14:25
  • Hallo,

    Ich habe  der Sheet Name mit dem Excel- TabelleName verwechseln .

    Sheet Name war Tabelle1

    Excel-Name war Employee

    Danke für die Hilfe

    Freitag, 29. April 2016 14:45