3 Stimmen

Excel lesen mit C#

Ich versuche, eine Excel-Datei mit C# zu lesen und erhalte immer wieder diesen Fehler: oledbexception cannot update. database or object is read-only auf der Linie. Irgendwelche Ideen?

        string connStr = ConfigurationManager.ConnectionStrings["SiteSqlServer"].ConnectionString;
        SqlConnection conn = new SqlConnection(connStr);
        //file upload path

        string path = FileUpload1.PostedFile.FileName;
        //Create connection string to Excel work book
        string excelConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + FileUpload1.PostedFile.FileName + ";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\"";
        //Create Connection to Excel work book
        OleDbConnection excelConnection = new OleDbConnection(excelConnectionString);
        //Create OleDbCommand to fetch data from Excel
        OleDbCommand cmd = new OleDbCommand("Select [Coupon], [First Name], [Last Name] from [Sheet1$]",excelConnection);
        excelConnection.Open();
        OleDbDataReader dReader;
        dReader = cmd.ExecuteReader();
        SqlBulkCopy sqlBulk = new SqlBulkCopy(conn);
        //Give your Destination table name
        sqlBulk.DestinationTableName = "CPC_Coupons";
        sqlBulk.WriteToServer(dReader);
        excelConnection.Close();

Merci !

4voto

Ravi Gadag Punkte 15545

Müssen Sie die Verbindungszeichenfolge wie folgt ändern, von ConnectionStrings

es gibt einen Artikel auf der MS-Supportseite zu diesem Thema ADO.net mit Excel

 string FileName = GettheFileName; 
string excelConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+FileName+";Extended Properties="Excel 8.0;HDR=Yes;IMEX=1";

von der MS-Support-Website ADO.net mit Excel

T durch die Einstellung "IMEX=1" im Abschnitt Erweiterte Eigenschaften der Verbindungsstrings. Dadurch wird die Registrierung "ImportMixedTypes=Text" erzwungen Einstellung.

PS: Wenn Sie keine Spaltenüberschriften haben, müssen Sie HDR=No in der Verbindungszeichenfolge angeben.

4voto

Sajjan Sarkar Punkte 3572

Hier ist meine Methode, die mit in Excel 2007 erstellten Blättern funktioniert.

public static DataTable ReadExcel(string path)
{
    //create a DataTable to hold the query results
    DataTable dTable = new DataTable();

    try
    {
        if (!File.Exists(path))
            return null;

        //create the "database" connection string 
        string connString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=Excel 12.0;";

        //create the database query
        string query = "SELECT * FROM [Sheet1$]" ;

        //create an OleDbDataAdapter to execute the query
        OleDbDataAdapter dAdapter = new OleDbDataAdapter(query, connString);
        //fill the DataTable
        dAdapter.Fill(dTable);
        dAdapter.Dispose();
    }
    catch (Exception e)
    {
        Console.WriteLine(e);
    }

    return dTable;
}

1voto

TimATX Punkte 31

Nicht zu einfach...

Vergewissern Sie sich, dass das Dokument in Excel geschlossen ist (Excel erhält eine schreibgeschützte Freigabesperre - ich glaube, das ist schon eine Weile her).

Interop kann Ihnen Probleme bereiten, wenn Sie versuchen, dies in einer Serverumgebung zu verwenden - COM-Berechtigungen und dergleichen...

Ich würde auch vorschlagen, eine mit Block, um sicherzustellen, dass alles nach der Ausführung entsorgt wird:

using(OleDbConnection excelConnection = new OleDbConnection(excelConnectionString)) {
  //Create OleDbCommand to fetch data from Excel
  OleDbCommand cmd = new OleDbCommand("Select [Coupon]\t[First Name]\t[Last Name] from [Sheet1$]",excelConnection);
  excelConnection.Open();
...
  excelConnection.Close();
}

1voto

Shahzad Latif Punkte 1398

Bitte sehen Sie sich den folgenden Code an, wenn das in Ihrem Szenario helfen könnte:

  public static class DatabaseManager
    {
        //set connection string for SQL Server Express Edition
        static string connString = @"Data Source=LOCALHOST\SQLEXPRESS;Initial Catalog=DocumentStore;Integrated Security=True;Pooling=False";

        //method to save document to database
        public static bool SaveDocumentToDatabase(MemoryStream msDocument, DocumentType docType, string documentName)
        {
            //keep track of the save status 
            bool isSaved = false;

            //create database connection
            SqlConnection sqlConnection = new SqlConnection(connString);
            try
            {
                sqlConnection.Open();
            }
            catch (Exception ex)
            {
                Settings.LogException(ex);
                Console.WriteLine("Unable to open database connection");
                isSaved = false;
            }

            string commandText = "INSERT INTO Documents (DocumentType, DocumentName, DocumentContent, CreateDate) VALUES('" + docType + "','" + documentName + "', @DocumentContent ,'" + DateTime.Now + "')";
            SqlCommand sqlCommand = new SqlCommand(commandText, sqlConnection);
            sqlCommand.Parameters.AddWithValue("DocumentContent", msDocument.ToArray());
            try
            {
                sqlCommand.ExecuteNonQuery();
                Console.WriteLine("Document saved successfully");
                isSaved = true;
            }
            catch(Exception ex)
            {
                Console.WriteLine("Unable to save the document to database");
                Settings.LogException(ex);
                isSaved = false;
            }

            //close database connect
            sqlConnection.Close();

            return isSaved;
        }

    public static bool LoadDocumentFromDataBase(DocumentType docType)
    {
         //keep track of the retrieve status 
        bool isRetrieved = false;

        //create database connection
        SqlConnection sqlConnection = new SqlConnection(connString);
        try
        {
            sqlConnection.Open();
        }
        catch(Exception ex)
        {
            Console.WriteLine("Unable to open database connection");
            Settings.LogException(ex);
            isRetrieved = false;
        }

        string commandText = "SELECT * FROM Documents WHERE DocumentType ='" + docType + "'";

        SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(commandText, sqlConnection);
        SqlCommand sqlCommand = new SqlCommand(commandText, sqlConnection);

        DataTable dtDocuments = new DataTable();

        try
        {
            sqlDataAdapter.Fill(dtDocuments);
            Console.WriteLine("Document retrieved successfully");
            isRetrieved = true;
        }
        catch(Exception ex)
        {
            Console.WriteLine("Unable to retrieve documents from database");
            Settings.LogException(ex);
            isRetrieved = false;
        }
   }
}

0voto

vivek Punkte 1
string fileName = @"C:\Users\janki.prashar\Desktop\k.xls";
    string ConStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileName + ";Extended     Properties=\"Excel 8.0;HDR=NO;IMEX=1\"";
    OleDbConnection con = new OleDbConnection(ConStr);
    con.Open();
    OleDbCommand ad = new OleDbCommand("select * from [SheetName$]", con);
    OleDbDataReader dr = ad.ExecuteReader();
    System.Data.DataTable dt = new System.Data.DataTable();
    dt.Load(dr);
    dataGridView1.DataSource = dt;
    con.Close();

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X