当string正常出现时从DataTable DataRow获取一个int

我已经在这里和其他地方广泛search了一个答案,但没有取得成功。

我正在使用OLEDB连接到一个电子表格,并提取数据以移植到一个数据库,除了一个小细节之外,一切都会相当顺利。

有一个名为技能的列,我收到的条目通常是一个string,但是值有时可以是一个像334423一样的int,当我尝试将这个值添加到新的数据库时,条目是简单的空白。

通常的方法来提取:

foreach(DataRow dr in dt.Rows) { /* dealing with other columns */ sTemp.skill = dr[3].ToString(); /* more stuff */ } 

但是,当这行中的列是一个int,只是一个空白的string,我绝对没有任何反应。 它甚至没有抛出任何例外,这至less会给我一些方向。

我也试过把它作为一个整型:

 sTemp.skill = (int)dr[3].ToString(); 

(这不起作用)

仅供参考:“sTemp”是一个与其相关的string的对象,技能是一个string。 这个问题的神秘安静的性质也使我很难知道我应该问什么。 任何OLEDB大师在那里,请帮助! 谢谢

编辑:经过一些更多的调查,似乎问题不是转换/string转换为整数,但实际上得到的数据在第一位。

在有数字的字段的情况下,它会完全忽略它(因为我想不出来的原因),所以没有什么可以parsing的。 神秘的行为的确如此。

除非有人知道使用OleDbDataAdapter从excel获取int的已知问题,然后随时回答…对不起,浪费你所有的时间,多么尴尬。

编辑#2:这是一个更新的代码视图:

 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Data.OleDb; namespace SQEPSkillsImporter { public partial class MainWindow : Form { string skillsFileName = ""; List<SkillTemplate> TemplateList = new List<SkillTemplate>(); public MainWindow() { InitializeComponent(); } private void skillsFilePathBtn_Click(object sender, EventArgs e) { this.skillsFileDialog.Filter = "Excel Worksheets|*.xls;*xlsx"; DialogResult result = skillsFileDialog.ShowDialog(); if (result == DialogResult.OK) { this.skillsFileName = skillsFileDialog.FileName; skillsFilePathTxBx.Text = skillsFileName; } } private void readSkillsBtn_Click(object sender, EventArgs e) { DataTable skillsTable = new DataTable("SkillsResults"); string connectionString = "Provider=Microsoft.Jet.OleDb.4.0;" + " Data Source=" + this.skillsFileName + ";Extended Properties=Excel 8.0;"; using(OleDbConnection Connection = new OleDbConnection(connectionString)) { Connection.Open(); using(OleDbCommand Command = new OleDbCommand()) { Command.Connection = Connection; /* The columns I want are in A through D */ Command.CommandText = "SELECT * FROM [Skills$A:D]"; using (OleDbDataAdapter Adapter = new OleDbDataAdapter()) { Adapter.SelectCommand = Command; Adapter.Fill(skillsTable); } } Connection.Close(); Connection.Dispose(); } SkillTemplate sTemp = new SkillTemplate(); foreach (DataRow dr in skillsTable.Rows) { /* most sGroup, group and heading columns are blank, so remain the same unless changed, meaning the name wont be null */ if(dr[0].ToString() != "") sTemp.SuperGroup = dr[0].ToString(); if (dr[1].ToString() != "") sTemp.Group = dr[1].ToString(); if (dr[2].ToString() != "") sTemp.Heading = dr[2].ToString(); if (dr[3].ToString() != "") sTemp.Skill = dr[3].ToString(); /* VERY rough test textbox to verify that my output is correct before sending to DB */ this.skillsDumpTxBx.Text += sTemp.SuperGroup + " /// " + sTemp.Group + " /// " + sTemp.Heading + " /// " + sTemp.Skill + System.Environment.NewLine; } } } public class SkillTemplate { public string SuperGroup { get; set; } public string Group { get; set; } public string Heading { get; set; } public string Skill { get; set; } } } 

 sTemp.skill = Convert.ToInt32(dr[3].ToString()); 

或使用此方法转换为任何types:

 /// <summary> /// Safe converting to any type /// </summary> /// <typeparam name="T"></typeparam> /// <param name="value">Value to convert</param> /// <param name="defaultValue">Default value, sets type of return value</param> /// <returns>Converted value or defaul when error</returns> public static T safeConvert<T>(object value, T defaultValue) { try { return value == null ? default(T) : (T)Convert.ChangeType( value, Nullable.GetUnderlyingType(typeof(T)) ?? typeof(T) ); } catch { return defaultValue; } } 

用法:

 sTemp.skill = safeConvert(dr[3],0); // or String s = safeConvert(obj, string.Empty); 

如果dr [3] .ToString()返回空白,那么可能性是包含DBNull或空白string。 你有没有检查你的查询,以确保你的第4列(从零开始的索引3)返回有效值