直接100分,一个从dataset中取数据的小问题,本人使用c#两天,还请大家帮忙

nonocast 2005-10-28 07:42:23
EXCEL中的数据,这是第一列,后面的省略
室号
401A
402B
403
404
405A
406B


string connect = @"Provider=Microsoft.JET.OLEDB.4.0; data source=E:\sandbox\dotnet\database\new.xls;Extended Properties=Excel 8.0;";
string sql = "select * from [统计$]";
OleDbConnection db_conn = new OleDbConnection(connect);
OleDbDataAdapter adapter = new OleDbDataAdapter();
adapter.SelectCommand = new OleDbCommand(sql, db_conn);

foreach (DataRow row in dt.Rows)
{
string s = (string)row["室号"];
MessageBox.Show(s);
}
db_conn.Close();

开始两个都正常,到第三个竟然报Unable to cast object of type 'System.DBNull' to type 'System.String'
接受不了

唯一的区别就是开头两个带字母,第三个是数字,但我已经在excel中将格子的属性改为文本了
而且dt.Columns["室号"].DataType也是String
这不是折腾嘛
大家帮忙,感谢万分
...全文
477 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
nonocast 2005-10-28
  • 打赏
  • 举报
回复
你的意思就是看可以取值的第一个
那么如果excel
1--------------------------
室号
401A
402B
403
404
405A
406B

2--------------------------
室号
401
402B
403
404
405A
406B

这两种会有区别吗?
dragonfly001 2005-10-28
  • 打赏
  • 举报
回复
我說的第一实際上是你讀取的表格的列名可能你讀取的只是一個表
如果如下所示
VGA 標準工時與ON LINE人力一覽表

客戶 機 種 聯板數 SMT點數/ pcs VGA各線別C.T (Sec)
Total BOT TOP A~C B C D E F G "other
lines"
CP QP CP QP
168 8873-060 4 637 356 16 245 20 6.2 3 4 W 12
168 8808-320 4 145 145 2 2 2 W 2 2T T
168 8808-320 4 145 145 r
168 8878-230 4 412 180 6 214 12 4t
168 8830-030 2 672 318 19 330 5 6.2 23.29 23.29' 23.29' 23.29
你就知道了. 而且讀取 EXCEL時都可以轉化為XML格式.NET是如何轉化的樓主感興趣可以去研究一下.
nonocast 2005-10-28
  • 打赏
  • 举报
回复
第二行,不是列,呵呵
nonocast 2005-10-28
  • 打赏
  • 举报
回复
讀取EXCEL時,每列的類型 是通過該列的
第一行值得实際類型來確定的.

????
第一列肯定是文本吧

应该是第二列吧
dragonfly001 2005-10-28
  • 打赏
  • 举报
回复
oDS.Tables[0].Rows[i][0].ToString().Trim(); 意思就是用你的欄位順序來讀取內容.
dragonfly001 2005-10-28
  • 打赏
  • 举报
回复
for( i=0;i<oDS.Tables[0].Rows.Count;i++)
{
if(!oDS.Tables[0].Rows[i][0].Equals(System.DBNull.Value))
{
string sMessage= oDS.Tables[0].Rows[i][0].ToString().Trim();
}
} 樓主可以試著這樣讀取數據.而且據我的經驗所知,讀取EXCEL時,每列的類型 是通過該列的
第一行值得实際類型來確定的.而且如果你後面的數據格下拉過,即時沒有內容他也會讀取,只是值是System.DBNull.
也就是的oDS.Tables[0].Rows.Count值會大於你的实際所有的值的行數.
swordragon 2005-10-28
  • 打赏
  • 举报
回复
string s;

if(row["室号"] != null)
{
s = Convert.ToString(row["室号"]);
MessageBox.Show(s);
}
nonocast 2005-10-28
  • 打赏
  • 举报
回复
找到错误了
错误不在程序里,在excel中
excel认为404这个单元格不是string类型的
要扭曲一下把他强行先改成404aaa再去掉404,之后有绿色三角提示强行存文本才行
妖怪啊
毕竟excel不是database,不能直接设置类型...
大家是怎么做的?
ChengKing 2005-10-28
  • 打赏
  • 举报
回复
但是: Unable to cast object of type 'System.DBNull' to type 'System.String'
这句的意思明明是DBNULL.

你把你的语句F9跟踪出来放到SQl查询分析器中运行一下.
nonocast 2005-10-28
  • 打赏
  • 举报
回复
肯定不为空
非常奇怪

401A
402B
403
404
405A
406B

我将上面的excel中数据中的字符全部去掉
401
402
403
404
405
406

还是同样的代码,string s = (string)row["室号"];
竟然报错Unable to cast object of type 'System.Double' to type 'System.String'
改成double d = (double)row["室号"];
MessageBox成功!
这我就更想不通了,我在excel中已经将格子的属性改为文本,确定没有绿色三角,怎么会这样?
excel中列数据的类型到底怎么来确定?
jxufewbt 2005-10-28
  • 打赏
  • 举报
回复
同意ChengKing(enthusiasm)
nonocast 2005-10-28
  • 打赏
  • 举报
回复
to chengKing
还是报同样的错误
因为row["室号"]不是null是DBNull
我前面这样写
foreach(DataRow row in dt.Rows) {
object o = row["室号"];
MessageBox.Show(o.ToString());
}
虽然可以避免问题不报错
但其中的403,404取不出来
swordragon 2005-10-28
  • 打赏
  • 举报
回复
确认报错的那行的数据row["室号"]是否为空!!!
ChengKing 2005-10-28
  • 打赏
  • 举报
回复
Ado.Net访问数据库方法集合:
http://blog.csdn.net/chengking/archive/2005/10/07/496656.aspx
ChengKing 2005-10-28
  • 打赏
  • 举报
回复
""或null不能转换为:ToString()的。会报“未将对象引用到实例错误”
修改如下:

foreach (DataRow row in dt.Rows)
{
string s = "";
if(row["室号"] != null)
{
string s = (string)row["室号"];
}

MessageBox.Show(s);
}

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧