2012-01-30 2 views
3

Я пытаюсь прочитать файл Excel с C#, и я продолжаю получать эту ошибку: oledbexception cannot update. database or object is read-only на линии. Есть идеи?Чтение Excel с C#

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

Спасибо!

+0

Я бы рекомендовал более новый ACE вместо старого JetDB. http://www.microsoft.com/download/en/details.aspx?id=13255 –

+0

Вы против использования Interop вместо этого (http://www.daniweb.com/software-development/csharp/threads/262228) ? –

+2

Попробуйте использовать библиотеку Microsoft.Office.Interop вместо – MGZero

ответ

1

Пожалуйста, смотрите следующий код, если это может помочь в вашем сценарии:

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; 
     } 
    } 
} 
4

вам нужно изменить ConnectionString, как это, от ConnectionStrings

как есть статья на сайте MS поддержки для этого ADO.net with Excel

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

с сайта поддержки MS ADO.net with Excel

To work around this problem for read-only data, enable Import Mode by using the setting "IMEX=1" in the Extended Properties section of the connection string. This enforces the ImportMixedTypes=Text registry setting.

PS: Если у вас нет заголовков столбцов, вам необходимо указать HDR = No в строке подключения

+0

Спасибо. Но я не знаю, как будет вызван файл. Они будут загружать его через веб-страницу. Таким образом, имя может быть другим. –

+1

@ Justin проверено ans. вы можете передать varible к этой строке соединения и использовать ее –

+0

Спасибо. Больше не дает этой ошибки, но теперь она дает странный путь и не может ее найти. Путь начинается с «C: \ Program Files (x86) \ IIS Express \», который он дает. КСТАТИ. Я использую элемент управления FileUpload и использую его для получения моего пути «string path = FileUpload1.PostedFile.FileName;» Есть идеи? Благодаря! –

1

не более чем просто ...

Убедитесь, что документ закрыт в Excel (Excel получает только для чтения доли замок на нем - я думаю, что его было какое-то время)

Interop могут дать вам вопросы если вы пытаетесь использовать это в среде сервера - COM разрешения и такие ...

Я мог бы также предложить использовать используя блок, чтобы убедиться, что все, расположенный после выполнения:

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(); 
} 
2

Вот мой метод, работает с таблицами, созданными в Excel 2007.

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; 
} 
0
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(); 
Смежные вопросы