0
我试图导入excel文件到我的网站,然后将其内容保存在sql服务器 我的问题与sqlbulkcopy当它填充数据库的一些列填充错误值是NULL!而列中有一个非空的double值!SqlBulkCopy插入null而不是双重
这里是代码:
void ImporttoDatatable()
{
try
{
if (FileUpload3.HasFile)
{
string FileName = FileUpload3.FileName;
string path = Path.Combine(Server.MapPath("~/ImportDocument"), Guid.NewGuid().ToString() + Path.GetExtension(FileUpload3.PostedFile.FileName));
FileUpload3.PostedFile.SaveAs(path);
using (OleDbConnection OleDbcon = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + "; Extended Properties = \"Excel 8.0;HDR=Yes;IMEX=2\" "))
{
conn.Open();
OleDbcon.Open();
OleDbCommand command = new OleDbCommand("Select [IdOftable], [Time],[InstrumentLeftHand],[LeftSwitch],[LeftKnob],[ForceFeedbackLeftHand],[CumTimeLeftForceOverThreshold],[CumTimeLeftForceOver2xThreshold],[TranslationLeft_x],[TranslationLeft_y],[TranslationLeft_z],[quatLeft_x],[quatLeft_y],[quatLeft_z],[quatLeft_w],[InstrumentRightHand],[RightSwitch],[RightKnob],[ForceFeedbackRightHand],[CumTimeRightForceOverThreshold],[CumTimeRightForceOver2xThreshold],[TranslationRight_x],[TranslationRight_y],[TranslationRight_z],[quatRight_x],[quatRight_y],[quatRight_z],[quatRight_w],[BloodEmittedFrame],[BloodCurrentFrame],[TotalBloodEmitted],[TotalWhiteFibreCut],[TotalRedFibreCut],[Volume0_Brain],[Volume1_Tumor],[Volume2_Tumor] from [Sheet1$]", OleDbcon);
//OleDbDataAdapter objAdapter1 = new OleDbDataAdapter(command);
DbDataReader dr = command.ExecuteReader();
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn))
{
bulkCopy.DestinationTableName = "MyExcel";
try
{
bulkCopy.BulkCopyTimeout = 400;
bulkCopy.WriteToServer(dr);
bulkCopy.BatchSize = 16000;
}
catch (Exception ex)
{
Response.Write(ex.ToString());
}
finally
{
dr.Close();
}
OleDbcon.Close();
bulkCopy.Close();
}
}
} lblmessage.Text = "The File Succssesfully Imported ";
}
catch (Exception ex)
{
Response.Write(ex.ToString());
}
}
,这是SQL表定义:
CREATE TABLE [dbo].[MyExcel] (
[IdOftable] NVARCHAR (50) NOT NULL,
[Time] FLOAT (53) NULL,
[InstrumentLeftHand] NVARCHAR (50) NULL,
[LeftSwitch] FLOAT (53) NULL,
[LeftKnob] FLOAT (53) NULL,
[ForceFeedbackLeftHand] FLOAT (53) NULL,
[CumTimeLeftForceOverThreshold] FLOAT (53) NULL,
[CumTimeLeftForceOver2xThreshold] FLOAT (53) NULL,
[TranslationLeft_x] FLOAT (53) NULL,
[TranslationLeft_y] FLOAT (53) NULL,
[TranslationLeft_z] FLOAT (53) NULL,
[quatLeft_x] FLOAT (53) NULL,
[quatLeft_y] FLOAT (53) NULL,
[quatLeft_z] FLOAT (53) NULL,
[quatLeft_w] FLOAT (53) NULL,
[InstrumentRightHand] NVARCHAR (50) NULL,
[RightSwitch] FLOAT (53) NULL,
[RightKnob] FLOAT (53) NULL,
[ForceFeedbackRightHand] FLOAT (53) NULL,
[CumTimeRightForceOverThreshold] FLOAT (53) NULL,
[CumTimeRightForceOver2xThreshold] FLOAT (53) NULL,
[TranslationRight_x] FLOAT (53) NULL,
[TranslationRight_y] FLOAT (53) NULL,
[TranslationRight_z] FLOAT (53) NULL,
[quatRight_x] FLOAT (53) NULL,
[quatRight_y] FLOAT (53) NULL,
[quatRight_z] FLOAT (53) NULL,
[quatRight_w] FLOAT (53) NULL,
[BloodEmittedFrame] NVARCHAR (50) NULL,
[BloodCurrentFrame] FLOAT (53) NULL,
[TotalBloodEmitted] FLOAT (53) NULL,
[TotalWhiteFibreCut] FLOAT (53) NULL,
[TotalRedFibreCut] FLOAT (53) NULL,
[Volume0_Brain] FLOAT (53) NULL,
[Volume1_Tumor] FLOAT (53) NULL,
[Volume2_Tumor ] FLOAT (53) NULL,
PRIMARY KEY CLUSTERED ([IdOftable] ASC)
);
有,当我跑的代码,但没有例外,当我检查了数据的服务器里面有一些值不为空值=(
我使用visual studio express 2012 for web。怎么办才能纠正它?
谢谢
但除了一个所有的字段可以有NULL值... – e4rthdog 2014-11-06 08:38:02
我没有检查的'SqlBulkCopy.WriteToServer(IDataReader的)内部工作',但我的猜测是,由于从电子表格读不给一个强类型的读者,在那里我是一个相当宽松的转换器,在转换失败时使用'DbNull'。我昨天遇到了这个问题,并发现添加额外的代码来显式迭代读者,并用显式转换填充一个强类型的'DataTable',然后将这个表写入服务器的速度比试图反映.NET更快准确找出发生这种情况的原因。 – GarethD 2014-11-06 08:40:07
@ e4rthdog谢谢你的回复,但是当我改变它不为null异常“system.invalidoperationexception列”列名'不允许dbnull.value“会出现这意味着相同的问题出来与null或没有它=( – seetah 2014-11-06 09:33:20