C# SQL Server中出现错误241:从C中的字符串转换为datetime#
我想将数据从C#插入SQL Server。因此,我在SQL Server中创建了以下类型: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
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));