【发布时间】:2021-04-13 12:20:53
【问题描述】:
到目前为止,我试图找到一个关于此的问题,但没有运气,所以我想我会问一次!
我有一个应用程序将用户定义的表类型传回 SQL 以在存储过程中使用(通过将类转换为表)。 日期为 '13/04/2021 00:00:00',将其传递到 SQL 中用户定义表的标准日期时间列中。
CREATE TYPE [dbo].[KeyData] AS TABLE(
[Date] [datetime] NULL,
[Time] [datetime] NULL,
[UnknownDate] [bit] NULL,
[DateReported] [datetime] NULL
)
从字符串转换日期和/或时间时出现“转换失败”的错误。 表值参数“@KeyData”的数据不符合参数的表类型。 我知道如果我只传递参数,我可以将存储过程中的参数转换为 103 类型(就像我在英国一样),但在将数据传递到定义的表类型时似乎出错了。
有什么想法吗?
编辑:我传递的两个字段在 C# 端都是可为空的日期时间,因为它们可能并不总是必需的。当它们为空且日期为 12/04/2021 时,它可以正常工作。
C# 类:
public DateTime? Date { get; set; }
public DateTime? Time { get; set; }
public Boolean UnknownDate { get; set; }
public DateTime DateReported { get; set; }
C#代码:
using (SqlCommand cmd = new SqlCommand("MyProc", conn))
{
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter test = cmd.Parameters.AddWithValue("@KeyData",
K.ToTable());
test.SqlDbType = SqlDbType.Structured;
test.TypeName = "KeyData";
conn.Open();
cmd.ExecuteScalar();
conn.Close();
}
编辑 2:将时间转换为时间跨度,仍然出现错误。我相信它在 DateReported 周围是 '13/04/2021', 12/04/21 工作正常。看起来它试图将它作为 mm/dd/yyyy 传递。有什么想法吗?
【问题讨论】:
-
另外,为什么你有一个名为
date的列,还有一个名为time的列,但它们都是datetime?date和time数据类型不是更合适吗? -
听起来您正在传递一个包含您的日期时间的字符串参数,并希望将其转换为 sql 数据时间列。而是将存储过程中的参数设为日期时间,并在应用程序中将字符串转换为日期时间,然后将其传递给 sql。
-
在 Webforms 和 C# 中发布此内容的主要原因是,可能有更多 C# 知识的人建议在 Webform 上而不是 SQL 端调整日期格式。编辑:两者都是我通过的类中的可空日期时间。我会在帖子中包含该信息
-
@Lambey,我怀疑您的 C# 查询没有参数化。 Use parameters,具有匹配的数据类型,我敢打赌问题会得到解决。
-
@DanGuzman 编辑显示我的代码
标签: c# sql sql-server