提供者無法決定 String 值。例如,剛建立資料列,String 資料行的預設值無法使用,而消費者尚未設定新 String 值。

提供者無法決定 String 值。例如,剛建立資料列,String 資料行的預設值無法使用,而消費者尚未設定新 String 值。

今天看一個用.NET開啟Excel讀取Data的問題,Code及錯誤訊息如下,

Code:


Dim objConn As New OleDb.OleDbConnection(strConn)
'Dim objDA As New OleDb.OleDbDataAdapter("SELECT " & "Format([身分證號], String(Len([身分證號]), '0')) as 身分證號" & " FROM [Sheet1$] ", objConn)
Dim objDA As New OleDb.OleDbDataAdapter("SELECT " & "Len([身分證號]) as ID_LEN, Format([身分證號], '000000000000000000') as IDNO" & " FROM [Sheet1$] ", objConn)
Dim ds As New DataSet
objDA.Fill(ds)

Error:

System.InvalidOperationException: 提供者無法決定 String 值。例如,剛建立資料列,String 資料行的預設值無法使用,而消費者尚未設定新 String 值。
at System.Data.OleDb.DBBindings.get_Value()
at System.Data.OleDb.OleDbDataReader.GetValues(Object[] values)
at System.Data.Common.SchemaMapping.LoadDataRow(Boolean clearDataValues, Boolean acceptChanges)
at System.Data.Common.DbDataAdapter.FillLoadDataRow(SchemaMapping mapping)
at System.Data.Common.DbDataAdapter.FillFromReader(Object data, String srcTable, IDataReader dataReader, Int32 startRecord, Int32 maxRecords, DataColumn parentChapterColumn, Object parentChapterValue)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, String srcTable, IDataReader dataReader, Int32 startRecord, Int32 maxRecords)
at System.Data.Common.DbDataAdapter.FillFromCommand(Object data, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet)

英文是The provider could not determine the Object value

是發生在OleDbDataAdapter在呼叫Fill 時,所發生出來的錯誤!

看一下程式比較奇怪的部份是有做FORMAT裡再包個STRING,STRING裡面再包個LEN,發現如果把LEN拿掉,直接用20個0進去,就不會有錯誤。

可是如果沒有去做FORMAT的話,也可以正常讀取到資料,看到程式中的註解是怕該CELL中的值如果超過了10碼,就會變成「科學符號」的問題。覺得這應先把EXCEL中的格式設成了字串,應該就沒這個問題吧! 所以就不加上那個FORMAT。 直接用 SELECT * 就好了!

在用FORMAT時,發現另外一個好玩的事,如果CELL的值是數值,而且只有18位的話,FORMAT後面的”0”如果是20個的話,FORMAT會把0給去掉哦!

另外,如果CELL的值不為數值,也不會發生錯誤呢! 容錯力真強哈!

附上範例:OpenExcel.rar

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^