2010-09-28 20 views
6

İlk olarak, burada derin bir su üzerinde olduğumu söylemek istiyorum, çünkü şirketteki başka biri tarafından yazılan kodda bazı değişiklikler yapıyorum. Excel'e "konuşmak" için OleDbDataAdapter kullanarak ve bu aşina değilim. Orada takip edemediğim bir hata var.Bir Excel sayfasından veri almak için OleDbDataAdapter kullanma ile ilgili sorun

Yaklaşık 450 satırlık bir excel dosyasında okumak için bir OleDbDataAdapter kullanmaya çalışıyorum.

kodunda böyle bitti:

connection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source='" + path + "';" + "Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1;\""); 
connection.Open(); 
OleDbDataAdapter objAdapter = new OleDbDataAdapter(objCommand.CommandText, connection); 
objAdapter.Fill(objDataSet, "Excel"); 

foreach (DataColumn dataColumn in objTable.Columns) { 
    if (dataColumn.Ordinal > objDataSet.Tables[0].Columns.Count - 1) { 
    objDataSet.Tables[0].Columns.Add(); 
    } 
    objDataSet.Tables[0].Columns[dataColumn.Ordinal].ColumnName = dataColumn.ColumnName; 
    objImport.Columns.Add(dataColumn.ColumnName); 
} 

foreach (DataRow dataRow in objDataSet.Tables[0].Rows) { 
    ... 
} 

Her şey bir şey hariç iyi çalışıyor gibi görünüyor. İkinci sütun, büyük ölçüde 6739, 3920 ve benzeri gibi dört rakamlı sayılarla doldurulur, ancak fice satırları 8201NO ve 8205NO gibi alfasayısal değerlere sahiptir. Bu beş hücrenin, alfanümerik içerik yerine boş içerik olduğu bildirilmiştir. Excel'de kontrol ettim ve bu sütunlardaki tüm hücreler Metin olarak işaretlendi.

Bu bir xls dosyasıdır, xlsx değil.

Bu hücrelerin DataRow'da neden boş olarak gösterildiğinden, ancak sayısal olanların iyi gösterildiğinden herhangi bir ipucu var mı? Tam olarak gösterilen alfanümerik içerikli başka sütunlar var.

+0

Teşekkür bu konuyla yardımın için. Bunun neden olduğunu anlamamı sağladın, bu yüzden uygun çözümü bulabilirim. Ben hala bu şekilde çalıştığını düşünüyorum oldukça korkunç, ama bu başka bir hikaye :) –

cevap

8

Neler oluyor? Excel, o sütundaki ilk birkaç değere dayanarak e-tablo sütununa bir veri türü atamaya çalışıyor. Bu sütundaki özelliklere bakarsanız, sayısal bir sütun olduğunu söylerim.

Sorun, bu elektronik tabloyu jet kullanarak sorgulamaya başladığınızda ortaya çıkıyor. Sayısal bir sütunla uğraştığını düşündüğünde ve bir varchar değeri bulduğunda sessizce hiçbir şey döndürmez. Şifreli bir hata mesajı bile yok.

Mümkün olan bir çalışma olarak, alfa sayısal değerlerden birini ilk veri satırına taşıyabilir ve ardından ayrıştırma işlemini deneyebilirsiniz. Alfa sayısal satırlar için değerler almaya başlayacağından şüpheleniyorum ...

this article'a bir göz atın. Bu konuda daha fazla ayrıntıya giriyor. o da hangi etrafında olası bir işin bahsediyor: Biz ayarlarsanız

Ancak JET belgelendirmesi olarak, biz , aracılığıyla bağlantı dizesi ayar kayıt geçersiz kılabilir IMEX = 1 ( Extended bir parçası olarak Özellikler), UNICODE VARCHAR veya bakılmaksızın ait ADVARWCHAR gibi tüm sütun türünü ayarlayacaktır JET 'ımportmixedtypes' tuşuna value.hey

+0

Bunu şimdi test ettim, ve alfa nümerik sırasını ilk sıraya koyarsam, beklendiği gibi çalışır. Benim sorunum, müşterilerin kendi sayfalarında okuyacağı gibi, bunu genel bir kural haline getiremem. Ancak, çözümüm "hile" yapmaktı, böylece alfanümerik başlığın sütun alfanümerik hale getirmek için okunduğundan emin olmak için bağlantı dizesinde HDR = Hayır değiştirdim, sonuçta ortaya çıkan DataTable'ın ilk satırını kestim. Oldukça kötü ama burada başka bir seçenek görmüyorum. Bana doğru yönde gelmen için yardımın için çok teşekkürler. –

+0

Çok sinsi. Çalışırsa işe yarıyor! –

1

IMEX=1 "metin olarak karışık veri oku" anlamına gelir. Bununla birlikte, bazı yakalamalar da vardır. Jet, verilerin karma olup olmadığını belirlemek için yalnızca birkaç satır kullanır ve eğer böyle bir satır varsa, bu satırların hepsi sayısal olur, bu davranışı alırsınız.

Detaylar için connectionstrings.com bakınız:

kontrol dışarı [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel] bulunan kayıt REG_DWORD "TypeGuessRows". Excel'in sütunlar veri türünü tahmin etmek için yalnızca ilk 8 satırı kullanmasına izin vermemenizin anahtarı budur. Tüm satırları taramak için bu değeri 0 olarak ayarlayın. Bu performansa zarar verebilir.Ayrıca IMEX = 1 seçeneğinin eklenmesi, IMEX özelliğinin yalnızca 8 satırdan sonra girmesine neden olabileceğini de unutmayın. Bunun yerine, kayıt defterini zorlamak için IMEX = 0 kullanın. Çalışmak için TypeGuessRows = 0 (tüm satırları tarayın).

+0

Jet'in Excel'de nasıl ortaya çıktığını bilmiyorum, ancak Access'te, geçerli durumda Jet db motorunun çalışma zamanında, kayıt defterini değiştirip Access'i yeniden başlatmaya gerek kalmadan çalışma şeklini değiştirebilirsiniz. –

+0

Bu bilgi için teşekkürler. İşe yaradı ama şaşırtıcı bir şekilde yavaştı, bu yüzden "okuma ve atma başlığı" hile ile gitmek zorunda kaldım. –

1

Yardım ederseniz Excel'e erişmek için OleDb veri sağlayıcısı ürünlerini kullanmamanızı öneriyorum. Tam olarak başkalarının işaret ettiği nedenlerden ötürü hiçbir şeyim yoktu. Büyük e-tablolarla uğraşırken performansın da acımasız olduğu görülüyor.

Bu açık kaynak çözümü deneyebilirsiniz: herkese http://exceldatareader.codeplex.com/

+0

Sana tamamen katılıyorum Mark. Bence bu oldukça korkunç, ama bu durumda mevcut bir programda bu hatayı düzeltmek için atandığım herhangi bir seçeneğim yok ve büyük bir refakatçılığın yapılmasına zaman verilmiyor. Bunu daha sonra sıfırdan yapmam gerekirse, bağlantınızı aklımda tutacağım. –