C# 将Excel导入Sql Server数据库时,将数据类型nvarchar转换为数字时出错

C# 将Excel导入Sql Server数据库时,将数据类型nvarchar转换为数字时出错,c#,sql-server-2008,import,C#,Sql Server 2008,Import,我正在使用控制台应用程序脚本将excel文件导入Sql Server数据库 private static void ImportToSql(string ssqlconnectionstring, string query) { string query = "MERGE Inventory AS target USING (select LocalSKU,ItemName, QOH,ISNULL(Price,0.00),Discontinued,Integer2

我正在使用控制台应用程序脚本将excel文件导入Sql Server数据库

    private static void ImportToSql(string ssqlconnectionstring, string query)
    {
        string query = "MERGE Inventory AS target USING (select LocalSKU,ItemName, QOH,ISNULL(Price,0.00),Discontinued,Integer2,Integer3 from @source)  as source ON (source.LocalSKU = target.LocalSKU) WHEN MATCHED THEN UPDATE SET ItemName=source.ItemName,Price=source.Price,Discontinued=source.Discontinued,Integer2=source.Integer2,Integer3=source.QOH;";
        string excelfilepath = Environment.CurrentDirectory + @"\Sheet1.csv";
        // make sure your sheet name is correct, here sheet name is sheet1, so you can change your sheet name if have different
        // string myexceldataquery = "select LocalSKU,ItemName,QOH,Price,Discontinued,Barcode,Integer2,Integer3,SalePrice,SaleOn,Price2 from [sheet1$]";
        string myexceldataquery = "select LocalSKU,ItemName, QOH,Price,Discontinued,Integer2,Integer3 from [sheet1$]";

        try
        {

            // string sexcelconnectionstring = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + excelfilepath + ";Extended Properties=Excel 12.0;";

            string sexcelconnectionstring = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source =" + excelfilepath + "; Extended Properties=\"Excel 12.0; HDR=Yes; IMEX=2; ImportMixedTypes=Text;\"";
            //string ssqlconnectionstring = "Data Source=User-PC\\Dell;Trusted_Connection=True;DATABASE=TestStore;CONNECTION RESET=FALSE";

            SqlConnection sqlconn = new SqlConnection(ssqlconnectionstring);

            //series of commands to bulk copy data from the excel file into our sql table
            OleDbConnection oledbconn = new OleDbConnection(sexcelconnectionstring);
            OleDbCommand oledbcmd = new OleDbCommand(myexceldataquery, oledbconn);

            oledbconn.Open();

            OleDbDataReader dr = oledbcmd.ExecuteReader();
            SqlCommand sqlcmd = new SqlCommand(@query, sqlconn);

            SqlParameter param;
            param = sqlcmd.Parameters.AddWithValue("@source", dr);
            param.SqlDbType = SqlDbType.Structured;

            param.TypeName = "dbo.DTTOW";
            sqlconn.Open();
            sqlcmd.ExecuteNonQuery();
            sqlconn.Close();

            oledbconn.Close();

            Console.WriteLine(".xlsx file imported succssessfully into database. /r /n ");

        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
当我从excel工作表中仅选择两列时,此代码有效,LocalSKUQOH

当我再选择几个列时,就会出现此错误“将数据类型nvarchar转换为数字时出错。”

我使用的是用户定义的数据类型:

CREATE TYPE [dbo].[DTTOW] AS TABLE(
  [LocalSKU] [varchar](200) NOT NULL,
  [ItemName] [varchar](200) NULL,
  [QOH] [int] NULL,
  [Price] [decimal](19, 4) NULL,
  [Discontinued] [bit] NULL,
  [Integer2] [int] NULL,
  [Integer3] [int] NULL

)

从结构的SQL DDL的外观来看,excel文件中的某个地方存在混乱的价格。您可以运行宏或脚本来查看price列中的所有单元格是否都是可转换的吗?您可以使用ise=ISNUMBER()函数。这也是一种简单而肮脏的方法——尝试编辑价格列底部的=SUM()。我想知道是否有一些“smarty pants”卡在Price列的某个单元格中的“-”或“$”字符中。:)在OLE-DB perception中,任何Excel单元格的默认类型都是nvarachar


就我个人而言,我会使用Excel inter-op来吸收信息,而不是像您这样处理隐式转换错误。它稍微慢了一点,但确实可以完成这项工作,而您不必担心OLE-DB for Excel的“黑盒子”中会出现什么问题。

您可以对查询中从Excel中选择的数字类型进行清理。对于Price字段,您可以将查询更改为以下内容,以确保该列始终为数字,方法是将非数字值替换为0

select iif(isnumeric(Price), Price, 0) as Price from [sheet1$]

在excel价格列中是否有任何非数值?有空格、字母、null或空字符串吗?有。。我明白你的意思。。你能告诉我怎么处理这些吗?我贴了一个答案哦,怎么处理它们。