提供者无法决定 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