我有一个实用程序,可将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。当我将目标表中的数据类型更改为十进制(30、15)时,我想我也可以将相应的用户定义表类型中的数据类型也更改为十进制,这将强制数据兼容。但是我的C#错误陷阱仍然告诉我“将数据类型nvarchar转换为数字时出错。”。
任何帮助将不胜感激。
答案 0 :(得分:2)
要从nvarchar(字符串)转换,您需要通过执行double.Parse
在C#中对其进行转换。如果要保留在查询中,请执行以下操作:
select convert(decimal(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
通过传递列名,您不必依赖具有相同名称的列。