c# - 从 Excel 导入数据到 SQL Server,无法保存为小数数据类型

标签 c# sql types import-from-excel

我有一个实用程序,可以将 Excel 电子表格导入到 SQL Server。最近,当我必须将某些字段从 nvarchar 转换为十进制时,我的实用程序崩溃了。

我使用 C# 代码来调用存储过程。我的 C# 代码:

DataTable dtChem = new DataTable();
ada.Fill(dtChem);  // Fills datatable with data from Excel
cmd.Parameters.Clear();
cmd.CommandText = "dbo.insertDataChem";
cmd.Parameters.AddWithValue("@chemResults", dtChem);
cmd.Parameters.AddWithValue("@eddName", strFileName);                                    
cmd.ExecuteNonQuery();

我的存储过程:

create PROCEDURE [dbo].[insertDataChem]
    @chemResults as dbo.udtableDataChem READONLY
    , @eddName nvarchar(100) = null
AS

BEGIN 
    INSERT INTO MY_TABLE
    SELECT cr.SampleDate, cr.*,  @eddName, CURRENT_TIMESTAMP FROM @chemResults cr
END 

我使用以下用户定义的表类型来存储我的数据(为了简洁起见,我删除了很多字段):

CREATE TYPE [dbo].[udtableDataChem] AS TABLE(

    ...

    [MDL] [decimal](30, 15) NULL,   // data type changed
    [RL] [decimal](30, 15) NULL,    // data type changed
    [DilutionFactor] [nvarchar](200) NULL,  // original data type
    [ExpectedValue] [nvarchar](200) NULL,  // original data type

    ...

)

在上面的数据表类型中,我的所有类型都曾经是 nvarchar。当我将目标表中的数据类型更改为decimal(30, 15)时,我想我可以将相应的用户定义表类型中的数据类型也更改为decimal,这将强制数据兼容。但我的 C# 错误捕获仍然告诉我“将数据类型 nvarchar 转换为数字时出错。”。

如有任何帮助,我们将不胜感激。

最佳答案

要从 nvarchar(字符串)转换,您需要在 C# 中通过执行 double.Parse 进行转换。如果您想将其保留在查询中,请执行以下操作:

选择转换(十进制(4,2),'12.32')

...您可以将“12.32”替换为您的列。

还要注意小数点的存储方式。您可能需要将本地小数点替换为固定小数点(将“,”替换为“.”)。

如果您想在插入时更改数据类型,也可以执行相同的操作:

INSERT INTO CEDEN_ChemResults  (SampleData, EddName, InsertedAtUtc, NumericColumnA)
SELECT cr.SampleDate, @eddName, GETUTCDATE(), CONVERT(decimal(30,15), cr.OriginalVarcharColumn) FROM @chemResults cr

通过传递列名称,您不必依赖具有相同名称的列。

关于c# - 从 Excel 导入数据到 SQL Server,无法保存为小数数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57117110/

相关文章:

javascript - 防止浏览器 JavaScript 缓存问题的最佳实践

php - 试图在数据库中存储 IP 地址。错误

sql - 为什么我在 Pivot 中得到 4 行?

variables - 检查Flask中Jinja2内部的变量类型

c# - 以编程方式添加 DataGridView 列

c# - SqlCommand结果-无法将对象从dbnull强制转换为其他类型

c# - 方法必须有返回类型 (C#)

mysql - 如何修复带有 "group by"子句的查询中的 count()?

scala - 按名称调用参数

Swift 无法转换匹配泛型约束的类型的值