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

时间:2017-09-22 06:05:55

标签: 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 * 
        FROM @taradodType a
        WHERE NOT EXISTS (SELECT 1 
                          FROM dbo.taradod 
                          WHERE IDp = a.IDp 
                            AND (SELECT CAST(Date AS DATETIME)) = a.date)

在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中定义的类型插入数据:

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);
    }
}

但是当我运行它来将数据插入SQL Server表时,我收到一个错误:

  

从字符串

转换日期和/或时间时转换失败

表值参数@taradodType的数据不符合参数的表类型。 SQL Server错误是:

  

Msg 241,州:1   该声明已被终止

请帮我解决这个问题

2 个答案:

答案 0 :(得分:0)

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

CREATE TYPE [dbo].[taradodType] AS TABLE
(
    [IDP] [int] NULL,
    [date] [datetime] NULL,
    [day] [nvarchar](max) NULL,
    [nobatkari] [nvarchar](max) NULL,
    [code] [nvarchar](max) NULL
)

您的数据表应该是这样的:

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));

答案 1 :(得分:0)

正如@ zohar-peled所说“即使名称匹配,你也必须匹配列的顺序”