我在这里和其他地方广泛搜索了答案,但收效甚微。
我正在使用OLEDB连接到电子表格并将数据提取到端口到数据库,除了一个小细节之外,所有内容都相当顺利。
有一个名为Skills的列,其中我收到的条目通常是一个字符串,但是该值有时可能是一个类似于334423的int,当我尝试将此值添加到新数据库时,该条目只是空白。
通常的提取方法:
foreach(DataRow dr in dt.Rows)
{
/* dealing with other columns */
sTemp.skill = dr[3].ToString();
/* more stuff */
}
但是当这行中的列是一个int时,我完全没有响应,只是一个空字符串。它甚至没有任何例外,这至少会给我一些指导。
我也试过把它作为一个int:
sTemp.skill = (int)dr[3].ToString();
(这不起作用)
仅供参考:“sTemp”是一个与其相关联的字符串的对象,技能是一个字符串。这个问题神秘安静的性质也使我很难知道我应该问什么。任何OLEDB大师都在那里,请帮忙!感谢
编辑:经过多次调查后,似乎问题不在于将字符串转换/转换为整数,而是实际获取数据。
在具有数字的字段的实例中,它将完全忽略它(由于我无法想到的原因),因此无需解析。确实是神秘的行为。
除非有人知道使用OleDbDataAdapter从excel获取内容的已知问题,否则随时回答...抱歉浪费了你的时间,多么尴尬。
编辑#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; }
}
}
答案 0 :(得分:1)
sTemp.skill = Convert.ToInt32(dr[3].ToString());
或使用此方法转换为任何类型:
/// <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);
答案 1 :(得分:0)
如果dr [3] .ToString()返回空白,则可能包含DBNull或空字符串。您是否检查了查询以确保第4列(基于零的索引3)返回有效值