Laden...

Excel Tabelle mit C# nach Sql-Server importieren

Erstellt von grarhakim vor 11 Jahren Letzter Beitrag vor 11 Jahren 8.605 Views
G
grarhakim Themenstarter:in
7 Beiträge seit 2012
vor 11 Jahren
Excel Tabelle mit C# nach Sql-Server importieren

Erstmal Hallo zusammen,

Ich habe viel durchsucht, leider nix hilfsreiches gefunden:
Auf jeden Fall, ich habe eine Excel-Tabelle mit ungefähr 50 spaltten und 100.000 rows.
Ich möchte die Excel-Tabelle auf einen SQL-Server 2008 importieren, die SQL-Tabelle soll vom Excel-Tabelle erstellt werden, die Daten sollen auch mit rein natürlich.
Da es Eine Spalte im Excel-Tabelle eindeutig ist, wäre es super wenn das als PK in the SQL-Tabelle übernommen werden könnte.

Ich bin auf jeden Fall für jeglicher Art Hilfe Dankbar.

Übung macht den Meister

F
115 Beiträge seit 2012
vor 11 Jahren

Hi,

auch wenn ich den SQL-Server nicht kenne sollte er doch wohl so eine Art Import Utility für csv-Dateien haben.

Google verweist auf:

http://msdn.microsoft.com/de-de/library/ms188609.aspx

das Werzeug heist wohl bcp.

Vielleicht hilft auch

http://www.codeproject.com/Articles/290242/Import-Data-from-a-Text-or-CSV-file-into-SQL-Serve

Gruß
f_igy

1.378 Beiträge seit 2006
vor 11 Jahren

Das geht direkt mittels TSQL auch - brauchst du denn eine C# Anwendung dafür?

Gewusst wie: Importieren von Daten aus Excel, SQL Server

Lg, XXX

G
grarhakim Themenstarter:in
7 Beiträge seit 2012
vor 11 Jahren

Danke erstmal für die schnelle Antwort,
es gibt Import Export-Möglichkeiten, die Sache ist die, das ganze muss mit C#-Code realisiert werden, vielleicht irgendetwas like that:

SelectCommand(select from * from xls ..... into dbtable);

Sodass die ganze Tabelle neu erstellt werden, der Name der tabelle soll vielleicht aus dem Excel tabelle extrahiert werden, aber das ist kein problem.
Also alles soll dynamisch realisiert werden.

ich versuche es jetzt 3 Tagen, eine Lösung dafür zu finden.

Übung macht den Meister

1.378 Beiträge seit 2006
vor 11 Jahren

Genau was mein Link beschreibt - hast du ihn dir überhaupt angesehen?

G
grarhakim Themenstarter:in
7 Beiträge seit 2012
vor 11 Jahren

Ohhps, da habe ich was übersehen, Danke vielmals, ich werde mir das heute abend noch genauer anschauen, und wenn es klappt werde ich den Code hier scharen.

danke nochmal

hakim

Übung macht den Meister

G
grarhakim Themenstarter:in
7 Beiträge seit 2012
vor 11 Jahren

Hallo ich bin es wieder,
es hackt immer noch.
Auf jeden Fall hier ist mein Code:


public void dropTableIfExists(string tableName)
        {
            conn = new Connect();

            string query = string.Format(@"USE [PROJECT_SHEET] GO 
                                                SET ANSI_NULLS ON GO
                                                SET QUOTED_IDENTIFIER ON
                                                GO
                                                IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES 
                                                            WHERE TABLE_NAME = 'Bla' AND XTYPE = 'U')
                                                    DROP TABLE Bla
                                                ELSE CREATE TABLE [dbo].[Project_Sheet].[Bla] AS 
                                                        SELECT * FROM 
                                                
                                          END");
            
            using (SqlCommand myCommand = new SqlCommand(query))
            {
                SqlParameter[] sqlParams = new SqlParameter[1];
                sqlParams[0] = new SqlParameter("@tableName", tableName);
                myCommand.Parameters.AddRange(sqlParams);

                conn.createTableInsertData(myCommand);
            }
        }

die string query muss eine Tabelle erstellen und gleichzeitig befüllen mit Daten, wenn die Tabelle vorhanden ist muss sie zuerst gelöscht werden, und neu erstellt und mit den neuen Daten gefüllt werden.
Eins noch die Excel-Tabelle hat keine feste Anzahl an Rows and Column, jedes mal können sie varieren.

hier noch die createTableInsertData() function


public void createTableInsertData(SqlCommand myCommand)
        {
            try
            {
                myCommand.Connection = ConnectOpen();
                myCommand.ExecuteNonQuery();
            }
            catch (SqlException e)
            {
                MessageBox.Show("Error - Connection.executeSelectQuery - Query: \nException: " + e.StackTrace.ToString(),
                    "Exception", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            myCommand.Dispose();
            sqlcon.Close();
        }

für jede Hilfe bin ich dankbar.

Übung macht den Meister

1.378 Beiträge seit 2006
vor 11 Jahren

Wobei genau hackts denn?

Evt. dass die Tabelle nach dem DROP nicht mehr angelegt wird? Das liegt wohl an deinem If-Else Konstrukt.

Dabei bezweifle ich ob dieses Create Statement überhaupt so funktionieren kann.

Wenn dir die vorigen Links nicht geholfen haben schiebe ich hier noch ein weiteres Schlagwort nach: OleDB Mittels OleDb kannst du auch auf ein Excel File zugreifen und dann die nötigen Informationen auslesen um deine Tabelle in der Datenbank zu erstellen.

Bitte setze dich auch mit den Themen ein wenig auseinander und versuch konkrete Fragen zu anfallenden Problemen zu stellen anstatt einfach nur den Code zu posten

Lg, XXX

G
grarhakim Themenstarter:in
7 Beiträge seit 2012
vor 11 Jahren

Sorry ich habe s auch selber nicht geschnallt 😕
ich möchte so einfach wie möglich ein simples code bilden der mir ein Excel Tabelle in ein neu kreierten SQLSERVER tabelle, dh die struktur von der tabelle auf dem server soll von der struktur der excel-datei gebildet.

ich habe es versucht mi der msdn seite und ich habe s nicht geschafft,

bis jetzt habe ich den query so gebildet :

USE [Project_Sheet]
GO

IF OBJECT_ID('Bla','U') IS NOT NULL
DROP TABLE dbo.[Bla]
GO

CREATE TABLE dbo.[Bla] AS
SELECT *
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0','Excel ;Database=C:\test\xltest.xls', [Customers$])
GO

wenn ich es ausführe kommt fehler meldung, after keyword AS something wrong

ist es überhaupt möglich, das was ich vorhabe.

grüsse

Übung macht den Meister

1.378 Beiträge seit 2006
vor 11 Jahren

Hallo grarhakim,

kannst du die Daten aus deinem Excelsheet abrufen?

Bei der TSQL Variante ist zu beachten, dass der SQL-Server Zugriff auf die Excel Datei haben muss, nicht deine Applikation. Wenn dies nicht möglich ist, fällt diese Variante sowieso weg.

Falls du doch zum Beispiel einen Netzwerkshare oder irgendwie anders die Datei zum Server bringen kannst, dann würd ich bei der TSQL Variante bleiben.

Falls du also die Möglichkeit hast, die zu importierenden Excel Files dem Server zugänglich zu machen, dann probier ob du nur dieses Statement irgendwie zum Laufen bringst. Über Drop und Create Tables kann man sich noch immer Gedanken machen sobald du mal das wichtigste, nämlich den Zugriff aufs Excel gemeistert hast.

SELECT *
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0','Excel ;Database=C:\test\xltest.xls', [Customers$]) 

Falls obiges nicht möglich ist, bleibt dir nur per OLEDB oder per Excel.Interop das Excel in deiner App in den Arbeitsspeicher zu laden und dort dann weiter per SqlCommands/SqlDataAdapter in die Datenbank einzufügen. Du findest sicherlich auch einiges im Forum dazu wenn du die Suche etwas bemühen würdest.

Hier noch ein paar Links die dir vielleicht weiterhelfen könnten:

Lg, XXX

G
grarhakim Themenstarter:in
7 Beiträge seit 2012
vor 11 Jahren

hallo, danke für deine antwort
ich habe gerade echt viel um die ohren deshalb zögern auch meine antworte, leider fällt die tsql variante weg, allerdings habe ich festgestellt, es gibt die möglichkeit, die excel-file in ein dataset zu konvertieren habe ich auch gemacht, jetzt bleibt mir diese dataset in einen Table umzuwandeln, ich brauche keine keys und keine constraints, die tabelle wird per knopfdruch konvertiert in die datenbank geladen, wenn allerdings eine tabelle wieder geladen wird wird die erste gelöscht und das prozess geht wieder vom anfang also tabelle neu erstellen und mit daten ausfüllen,
ich denke ich brauche keine keys, denn die tabelle wird nur zum lesen bereitgestellt also select id from tabelle.

hast du vielleicht eine idee womit ich anfangen könnte? also vom dataset oder datatable in sql-table??

grüße

Übung macht den Meister

1.378 Beiträge seit 2006
vor 11 Jahren

Nur mal so nebenbei möchte ich dich mal auf die Forenregeln verweisen, die unter anderem sagen, dass wir hier Grundkenntnisse und vor allem Eigeninitiative vorraussetzen. Es fühlt sich leider so an, als müsste ich dir alles vorkauen, weswegen vermutlich auch sonst niemand hier postet.

Zu deiner Frage: ADO.NET ist die .NET Schnittstelle mit der du auf deine Datenbank per SQL-Statements zugreifen kannst. Dies gesagt, kann ich dir noch für deine Zwecke die Klasse SqlBulkCopy empfehlen. Wie du aber damit deine Daten in die Datenbank bekommst schau dir bitte selber an. Es gibt unzählige Beispiele im Internet dazu und wie bereits erwähnt sind das Grundlagen die man sich selbst aneignen muss.

Lg, XXX

G
grarhakim Themenstarter:in
7 Beiträge seit 2012
vor 11 Jahren

ich habe es irgendwie hinbekommen, und funktioniert auch mit der table import, soweit so gut,
aber nicht optimal bei der create table.

Danke für deine Hilfe.
excel zu dataset:


public bool CreateExcelDataSet(string excPfad, bool colName)
        {
            //creating the dataset
            DataSet ds = new DataSet();
            //creating the oledb connection
            OleDbConnection connole = new OleDbConnection();
            
            //Build the connectionstring
            connole.ConnectionString = "Data Source=" + excPfad + ";Provider=Microsoft.Jet.OLEDB.4.0;";

            if (colName)
                connole.ConnectionString += @"Extended Properties = ""Excel 8.0; hdr=Yes""";
            else
                connole.ConnectionString += @"Extended Properties = ""Excel 8.0; hdr=No""";

            //open connection
            connole.Open();
            DataTable DtExcel = connole.GetOleDbSchemaTable( OleDbSchemaGuid.Tables, 
                                                            new object[] { null, null, null, "TABLE" });

            foreach (DataRow spalte in DtExcel.Rows)
            {
                string tabName = spalte["Table_Name"].ToString();
                string sql = "SELECT * FROM [" + tabName + "]";
                OleDbDataAdapter adap = new OleDbDataAdapter(sql, connole);
                adap.Fill(ds, tabName);
            }
            
            connole.Close();
            DataTable dtb = ds.Tables[0];
            ds.Dispose();
            return createSqlTable(dtb);
        }

//createSqlTable(datatable dtb)
kreiert eine sql-server table

der rest ist schrott aber funzt fürs erste, und habe echt wenig zeit um es besser zu machen

daten in die tabelle schreiben:


public bool InsertData(DataTable dtb)
        {
            bool inserted = false;
            using (SqlBulkCopy bulkcopy = new SqlBulkCopy(GetconnectData("Project_Sheet")))
            {
                bulkcopy.DestinationTableName = dtb.TableName;
                try
                {
                    bulkcopy.WriteToServer(dtb);
                    inserted = true;
                }
                catch (Exception ex)
                {

                    MessageBox.Show("Error writting the Data to the DataBase " + ex.Message, "Fehler while writting Data", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                finally
                {
                    bulkcopy.Close();
                }

            }
            sqlcon.Close();
            return inserted;
        }

bis s nächste mal

Übung macht den Meister