C# SQL Server中出现错误241:从C中的字符串转换为datetime#

C# SQL Server中出现错误241:从C中的字符串转换为datetime#,c#,sql-server,stored-procedures,runtime-error,user-defined-types,C#,Sql Server,Stored Procedures,Runtime Error,User Defined Types,我想将数据从C#插入SQL Server。因此,我在SQL Server中创建了以下类型: SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[InsertTaradod] @taradodType dbo.taradodType READONLY AS BEGIN SET NOCOUNT ON; INSERT INTO dbo.taradod SELECT

我想将数据从C#插入SQL Server。因此,我在SQL Server中创建了以下类型:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[InsertTaradod]
    @taradodType dbo.taradodType  READONLY
AS
BEGIN
    SET NOCOUNT ON;

    INSERT INTO dbo.taradod 
        SELECT * 
        FROM @taradodType a
        WHERE NOT EXISTS (SELECT 1 
                          FROM dbo.taradod 
                          WHERE IDp = a.IDp 
                            AND (SELECT CAST(Date AS DATETIME)) = a.date)
SqlConnection sqlconn = new SqlConnection(DBsetting.Connstring);
sqlconn.Open();

using (sqlconn)
{
    try
    {
        SqlCommand cmd = new SqlCommand("InsertTaradod", sqlconn);
        cmd.CommandType = CommandType.StoredProcedure;

        SqlParameter dtparam = cmd.Parameters.AddWithValue("@taradodType", dtreadd);
        dtparam.SqlDbType = SqlDbType.Structured;

        cmd.ExecuteNonQuery();

        MessageBox.Show("Inserted");
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}
在C#中,我定义了一个数据表:

 DataTable dtreadd = new DataTable();

 dtreadd.Columns.Add("IDp");
 dtreadd.Columns.Add("date");
 dtreadd.Columns.Add("day");
 dtreadd.Columns.Add("nobatkari");
 dtreadd.Columns.Add("code");
我使用以下代码将数据插入
dtreadd

dtreadd.Clear();

for (int i = 0; i < dtja.Rows.Count; i++)
{
    dtreadd.Rows.Add(dtja.Rows[i]["IDp"].ToString(),DateTime.Parse(dtja.Rows[i]["date"].ToString()), GetDayOfWeek(GetPerDate2(dtja.Rows[i]["date"].ToString())), "", dtja.Rows[i]["code"].ToString());
}
但是,当我运行此命令将数据插入SQL Server表时,我得到一个错误:

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

表值参数
@TaradoType
的数据与参数的表类型不一致。SQL Server错误为:

消息241,状态:1
声明已被终止


请帮助我解决此问题

假设用户定义的表类型与您的其他问题中的相同(感谢BugFinder!)

您的数据表应该如下所示:

DataTable dtreadd = new DataTable();

dtreadd.Columns.Add("IDp", typeof(int));
dtreadd.Columns.Add("date", typeof(DateTime));
dtreadd.Columns.Add("day", typeof(string));
dtreadd.Columns.Add("nobatkari", typeof(string));
dtreadd.Columns.Add("code", typeof(string));

正如@zohar peled提到的,“即使名称匹配,也必须匹配列的顺序”

当使用.Net
DataTable
作为表值参数时,必须确保
DataTable
中的所有列与sql server中用户定义的表类型匹配。即使名称匹配,也必须匹配列的顺序。请编辑您的问题,将用户定义的表类型包括在内。这不仅仅是一个dup,也是您的问题吗?@ZoharPeled,正如您所见,一切都正常,但如果我将datatable中日期列的类型更改为datetime,我不知道为什么会出错。日期仅为gerigorian fromat格式,不能转换为波斯语calanderDate格式。您应该在用户定义的表类型中使用
Date
DateTime2
,在c#DataTable中使用
DateTime
DataTable dtreadd = new DataTable();

dtreadd.Columns.Add("IDp", typeof(int));
dtreadd.Columns.Add("date", typeof(DateTime));
dtreadd.Columns.Add("day", typeof(string));
dtreadd.Columns.Add("nobatkari", typeof(string));
dtreadd.Columns.Add("code", typeof(string));