我有一个实用程序,可以将 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/