最近需要做从excel导入数据到sql server,由于自己也是一个新手,所以在网上找了一些资料,参考找做了一下,结果出现了问题,所以还是来问一下大家,希望帮助解决,先谢谢了!
情况如下,这是参考网上提供的一段代码:
//新表插入,MySqlOperator是我自己写的一个数据库操作类,就是封装了一些常用的操作,应该是没有问题的
MySqlOperator mySql = new MySqlOperator();mySql.StrSql = "SELECT * into Table1 FROM OpenRowSet('MICROSOFT.JET.OLEDB.4.0','Excel 8.0;HDR=YES;DATABASE=" + Server.MapPath("/SW/Data/") + "gtds.xls',个体定税$)";mySql.ExeSql();//然后:向已有表插入数据
mySql.StrSql = "INSERT INTO Table1 " +
               " SELECT * FROM OpenRowSet('microsoft.jet.oledb.4.0','Excel 8.0; " +
               " HDR=NO;IMEX=1;database=" + Server.MapPath("/SW/Data/")+ "gtds.xls;','select * from [个体定税$]')";
mySql.ExeSql();
错误如下:将数据类型 nvarchar 转换为 float 时出错。 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. Exception Details: System.Data.SqlClient.SqlException: 将数据类型 nvarchar 转换为 float 时出错。我看了一下数据库,发现数据好像都写进去了,不过正如错误信息所说的,excel文件中单元格全为数字的字符串在数据库中也是数字型的了(都带小数点了),本来这些是字符串的,比如说一个编码4006358(excel中)数据库中则是4006358.0了,这个问题如何解决!另外,我现在关键的是需要导入数据到我的数据库表中,由于这个表的数据字段是单位提供的,原则上是不让修改的,因此我将上面的修改为向我的表格中导数据(将table1改为我的数据表名)
//然后:向已有表插入数据
mySql.StrSql = "INSERT INTO mytable " +
               " SELECT * FROM OpenRowSet('microsoft.jet.oledb.4.0','Excel 8.0; " +
               " HDR=NO;IMEX=1;database=" + Server.MapPath("/SW/Data/")+ "gtds.xls;','select * from [个体定税$]')";结果提示如下错误:
不允许从数据类型 nvarchar 到数据类型 money 的隐性转换(表 'sw.dbo.sy_dszl_gtsd',列 'r7')。请使用 CONVERT 函数来运行此查询。不允许从数据类型 nvarchar 到数据类型 money 的隐性转换(表 'sw.dbo.sy_dszl_gtsd',列 'r12')。请使用 CONVERT 函数来运行此查询。不允许从数据类型 nvarchar 到数据类型 money 的隐性转换(表 'sw.dbo.sy_dszl_gtsd',列 'r15')。请使用 CONVERT 函数来运行此查询。不允许从数据类型 nvarchar 到数据类型 money 的隐性转换(表 'sw.dbo.sy_dszl_gtsd',列 'r22')。请使用 CONVERT 函数来运行此查询。 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. Exception Details: System.Data.SqlClient.SqlException: 不允许从数据类型 nvarchar 到数据类型 money 的隐性转换(表 'sw.dbo.sy_dszl_gtsd',列 'r7')。请使用 CONVERT 函数来运行此查询。不允许从数据类型 nvarchar 到数据类型 money 的隐性转换(表 'sw.dbo.sy_dszl_gtsd',列 'r12')。请使用 CONVERT 函数来运行此查询。不允许从数据类型 nvarchar 到数据类型 money 的隐性转换(表 'sw.dbo.sy_dszl_gtsd',列 'r15')。请使用 CONVERT 函数来运行此查询。不允许从数据类型 nvarchar 到数据类型 money 的隐性转换(表 'sw.dbo.sy_dszl_gtsd',列 'r22')。请使用 CONVERT 函数来运行此查询。按照这个提示,我是不是要在select后面将所有列名写出来,然后再对应的列上面使用CONVERT函数阿?这样也太郁闷了吧……又没有什么解决办法啊?

解决方案 »

  1.   

    [SqlException (0x80131904): 不允许从数据类型 nvarchar 到数据类型 money 的隐性转换(表 'sw.dbo.sy_dszl_gtsd',列 'r7')。请使用 CONVERT 函数来运行此查询。
    不允许从数据类型 nvarchar 到数据类型 money 的隐性转换(表 'sw.dbo.sy_dszl_gtsd',列 'r12')。请使用 CONVERT 函数来运行此查询。
    不允许从数据类型 nvarchar 到数据类型 money 的隐性转换(表 'sw.dbo.sy_dszl_gtsd',列 'r15')。请使用 CONVERT 函数来运行此查询。
    不允许从数据类型 nvarchar 到数据类型 money 的隐性转换(表 'sw.dbo.sy_dszl_gtsd',列 'r22')。请使用 CONVERT 函数来运行此查询。]
       System.Data.SqlClient.SqlConnection.OnError(SqlException exception, TdsParserState state) +201
       System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, TdsParserState state) +68
       System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) +1048
       System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +2607
       System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result) +375
       System.Data.SqlClient.SqlCommand.ExecuteNonQuery() +125
       my.sql.MySqlOperator.ExeSql() +61
       ExcelToDB_aspx.Page_Load(Object Src, EventArgs E) in e:\Visual Studio\WebSites\SW\Test\ExcelToDB.aspx.cs:49
       System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +15
       System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +36
       System.Web.UI.Control.OnLoad(EventArgs e) +102
       System.Web.UI.Control.LoadRecursive() +45
       System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +952
      

  2.   

    没有人回复啊,只有把分全部给smallradish了