【问题标题】:User-Defined Table Type insertion causing conversion error用户定义的表类型插入导致转换错误
【发布时间】:2018-10-22 22:47:18
【问题描述】:

不是User-Defined Table Type insertion sometimes causing conversion error的重复项

我有一个用户定义的表类型:

CREATE TYPE [dbo].[udtImport] AS TABLE(
    Name    varchar(256)    null
    Code    varchar(32) null
    StartDate   varchar(256)    null
    EndDate varchar(256)    null
    DateCreated datetime    null

使用DateTime.Now(), 在我的数据库层中填充 DateCreated 字段,而所有其他字段都来自导入的表。

当我导入一个填充了日期字段的文件时,我得到一个 SQL 错误:

从字符转换日期和/或时间时转换失败 字符串。

使用 SQL Profiler 截取生成的代码显示:

DECLARE @p1 dbo.udtImport;
INSERT INTO @p1
VALUES
  ( N'Kit A1', 
    N'A002',  
    '2016-04-02 00:00:00.000',
    '2016-10-10 00:01:00.000', 
    '2018-10-22 16:08:28.6823468' );

exec impSaveImport @ImportList=@p1

impSaveImport 是一个存储过程,它只有一个参数:表类型 var 并直接插入表 [Import]。没有逻辑,没有触发器,没有对其他表的引用。

在 SSMS 中执行此代码显示与预期相同的错误。
修剪最后一个 DateTime 字段的最后 4 位数字会导致插入查询成功。

到目前为止一切顺利。

当我导入 StartDate 和 EndDate 字段为空的文件时,我没有收到任何错误,并且数据已成功插入到 Import 表中。

当我使用探查器拦截成功插入时,我得到:

DECLARE @p1 dbo.udtImport;
   INSERT INTO @p1
        VALUES
          ( N'Kit A1', 
            N'A002',  
            null,
            null, 
            '2018-10-22 16:34:11.5243245' );

        exec impSaveImport @ImportList=@p1

请记住,此查询成功地将一行插入到表 Import 中。

当我在 SSMS 中运行此最新查询时,我得到与以前相同的转换错误,

但它在我的 MVC 应用程序中运行没有错误!

这最后一部分让我很难过。

怎么可能?

项目正在使用带有 SQL2016 的 MVC。

【问题讨论】:

  • 您必须向我们展示您的 MVC 应用程序的代码。也许您的应用程序捕获了错误或为您的数据库设置了不同的日期格式。
  • @Corion。异常处理程序仅在填充 StartDate 和 EndDate 字段时捕获描述的 SQL 错误。应用程序使用视图模型来建模此数据,日期字段定义为可为空的 DateTime。没有其他逻辑。

标签: sql asp.net-mvc sql-trace


【解决方案1】:

你可以使用DATETIME2:

CREATE TYPE [dbo].[udtImport] AS TABLE(
    Name    varchar(256)    null,
    Code    varchar(32) null,
    StartDate   varchar(256)    null,  -- should be datetime2 format
    EndDate varchar(256)    null,      -- should be datetime2 format
    DateCreated datetime2    null);

DECLARE @p1 dbo.udtImport;
INSERT INTO @p1(Name, Code, StartDate, EndDate, DateCreated)
VALUES
  ( N'Kit A1', 
    N'A002',  
    '2016-04-02 00:00:00.000',
    '2016-10-10 00:01:00.000', 
    '2018-10-22 16:08:28.6823468' );

db<>fiddle demo

【讨论】:

  • 当从 MVC 应用程序执行时,插入成功,前两个日期字段为空(作为 varchar 传递)。此 udtImport 的数据模型是 vanilla,与 SQL 定义完全相同。
  • 您的答案最接近解决方案。当我将用户定义表类型的 StartDate 和 EndDate 字段更改为 [DATETIME] 时,问题就解决了。
猜你喜欢
  • 1970-01-01
  • 2014-07-01
  • 2021-11-10
  • 1970-01-01
  • 2013-05-14
  • 1970-01-01
  • 1970-01-01
  • 2015-12-04
  • 2011-04-02
相关资源
最近更新 更多