我想将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 该声明已被终止
请帮我解决这个问题
答案 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所说“即使名称匹配,你也必须匹配列的顺序”