带有DateTime列的DataTable抛出“转换日期和/或时间时转换失败”

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了带有DateTime列的DataTable抛出“转换日期和/或时间时转换失败”相关的知识,希望对你有一定的参考价值。

我试图调用一个存储过程接受一个表值参数与一个字符串和一个日期时间列。

存储过程

ALTER PROCEDURE [dbo].[uspStoredProcedureDateTimeTableValueTest]
-- Add the parameters for the stored procedure here
@Param DateTimeType READONLY
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;


END

TVP:

CREATE TYPE DateTimeType AS TABLE 
(
    Name nvarchar(50),
    ModifiedDate datetime
)

.NET控制台应用:

    static void Main(string[] args)
    {
        string connectionString = ConfigurationManager.ConnectionStrings["default"].ConnectionString;
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();

            DataTable table = new DataTable("Test");
            table.Columns.Add("ModifiedDate", typeof(DateTime));
            table.Columns.Add("Name", typeof(string));

            DataRow row = table.NewRow();
            row["Name"] = "David";
            row["ModifiedDate"] = DateTime.Now;
            table.Rows.Add(row);

            SqlCommand command = new SqlCommand("uspStoredProcedureDateTimeTableValueTest", connection);
            command.CommandType = CommandType.StoredProcedure;
            command.Parameters.AddWithValue("@Param", table);

            command.ExecuteNonQuery();
        }
    }

每当我尝试从.NET执行此SP时,我收到一个错误:

System.Data.dll中发生了类型为“System.Data.SqlClient.SqlException”的未处理异常

附加信息:从字符串转换日期和/或时间时转换失败。

表值参数“@Param”的数据不符合参数的表类型。 SQL Server错误是:241,状态:1

该语句已终止。

当我只有DateTime参数时似乎工作。但添加额外的“名称”参数显然会导致一些问题。我究竟做错了什么?

答案

你错过了一件关键的事情。您添加到命令的参数必须是SqlDbType.Structured

var param = new SqlParameter(); 
param.ParameterName= "@Param"; 
param.SqlDbType = System.Data.SqlDbType.Structured; 
param.Value = table; 
command.Parameters.Add(param);
另一答案

使用ADO.Net发送表值参数时,数据表的列顺序必须与用户定义的表类型的列的顺序完全匹配。我不知道这是一个错误还是一个功能,但这就是它的工作原理。

您需要在c#代码中切换下两行的顺序:

table.Columns.Add("ModifiedDate", typeof(DateTime));
table.Columns.Add("Name", typeof(string));

还有,Do not use AddWithValue。相反,使用Add

command.Parameters.Add("@Param", SqlDbType.Structured).Value = table;

以上是关于带有DateTime列的DataTable抛出“转换日期和/或时间时转换失败”的主要内容,如果未能解决你的问题,请参考以下文章

DataTable转xml存储到日志

获取DataTable中隐藏列的值

DataTable 转 CSV 日期格式

读取sqlite数据库时用SQLiteDataAdapter填充Datatable时遇到的问题。

Pandas对DateTime列的错误排序[重复]

使用熊猫读取带有时间戳列的 csv