C# 从Excel2003将数据导入到SQL2005,数据发生截断的问题分析
问题描述:大家没有遇到过这种情况使用自己编写的工具读取Excel2003文件中的数据,然后执行插入语句将数据批量导入到SQL2005.
一定有人遇到过数据截断的情况,大多数的原因是因为,数据库中的字段设置的太小导致的,只要稍微修改下就能解决。
但是下面的情况发生的原因是在读取Excel2003文件中的数据式,发生的读取数据截断,这种情况该怎么解决呢?
首先屡一下导入数据的思路,
将Excel2003加载到DataTable,或者你直接使用DataReader一行一行的从Excel2003问价中读取,读取一条插入一条
然后直接你的SQL语句导入;这样基本就ok了!
读取Excel2003文件的核心代码如下
我们采用两种方式 DataTable的方式和DataReader的方式
public class Conmmon
{
/// <summary>
/// 读取excel文件获得DataTable
/// </summary>
/// <param name="strExcelFileName">目标Excel文件完全路径</param>
/// <param name="strSheetName">工作表的名字</param>
/// <returns></returns>
public static DataTable ExcelToDataTable(string strExcelFileName, string strSheetName)
{
//string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + strExcelFileName + ";" + "Extended Properties='Excel 12.0 Xml;HDR=YES;IMEX=1';";
string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + strExcelFileName + ";" + "Extended Properties='Excel 8.0;HDR=YES;IMEX=1';";
string strExcel = "select * from [" + strSheetName + "$]"; DataSet ds = new DataSet();
using (OleDbConnection conn = new OleDbConnection(strConn))
{
conn.Open();
OleDbDataAdapter adapter = new OleDbDataAdapter(strExcel, strConn);
adapter.Fill(ds, strSheetName);
return ds.Tables[strSheetName];
}
}
/// <summary>
/// 读取excel文件获得DataReader
/// </summary>
/// <param name="strExcelFileName"></param>
/// <param name="strSheetName"></param>
/// <returns></returns>
public static OleDbDataReader ExcelToDataReader(string strExcelFileName, string strSheetName)
{
string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + strExcelFileName + ";" + "Extended Properties='Excel 8.0;HDR=YES;IMEX=1';";
//string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + strExcelFileName + ";" + "Extended Properties='Excel 12.0 Xml;HDR=YES;IMEX=1';"; string strExcel = "select * from [" + strSheetName + "$]";
OleDbConnection conn = new OleDbConnection(strConn);
OleDbCommand cmd = new OleDbCommand(strExcel, conn);
try
{
conn.Open();
OleDbDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
return reader;
}
catch (System.Data.OleDb.OleDbException e)
{
throw new Exception(e.Message);
}
}
}
ok!如果代码有什么问题,请大家指出来!
下面我们开始使用上面的代码输出一下“测试数据文件.xls”文件中的内容【在下面下载和源代码一起】
//使用DataTable的方式
private void btnTest_Click(object sender, EventArgs e)
{
DataTable myT = Conmmon.ExcelToDataTable(this.txtExcel.Text, "Content");
object obj = null;
foreach (DataRow myrow in myT.Rows)
{
obj = myrow["qvod"];
txtResult.AppendText(obj.ToString() + "\n");
}
}
ok !
我们看一下测试的结果
通用使用DataReader也是同样的结果哦,大家有可以下载我下面的 【源码包】 自行测试哦
嘿嘿!不要以为就这样完了!
好戏才刚刚开始!
我们将刚刚的第14行数据!复制一下,粘贴在第一行,【可以查看"测试数据2.xls"】
我们在重复上面的步骤 显示输出一下
至此问题描述完毕!原因我还没有找到,如果代码没有问题话那就是 数据驱动程序了问题了 瞎猜了,
我调试过程序,14行数据其实是完全读取了,但是放在循环语句中就不行了,
那么是Excel2003文件的问题吗? 我设置单元格格式 为 文本 也没有效果
希望能有高手协助,也许原因就是很小的一个地方引起的。我已经在园子内提问了,但是还没有找到方法。
附上源代码和测试数据