【发布时间】:2018-07-31 07:11:10
【问题描述】:
我正在尝试创建一个存储过程来添加或更新在 c# 中执行的对象集合,但不确定为什么它在 c# 中无法正确执行,而在 sql 中运行良好。
我也不确定如何生成一些有用的错误消息来帮助调试。
非常感谢任何可以引导我走向正确方向的提示或指针。
示例代码如下:
SQL 脚本:
CREATE TYPE CodeList
AS TABLE
(
Code varchar(255) NOT NULL UNIQUE,
Name varchar(max) NOT NULL,
GeneratedDate date NULL
);
GO
PRINT 'Created CodeList Type';
GO
CREATE PROCEDURE AddOrUpdateCodes
@List AS CodeList READONLY
AS
BEGIN
SET NOCOUNT ON;
MERGE dbo.Code AS tgt
USING @List AS src
ON tgt.Code = src.Code
WHEN MATCHED THEN
UPDATE SET Name = src.Name, GeneratedDate = src.GeneratedDate
WHEN NOT MATCHED THEN
INSERT (Code, Name, GeneratedDate) VALUES (src.Code, src.Name, src.GeneratedDate);
END
GO
PRINT 'Created AddOrUpdateCodes Stored Procedure';
GO
DECLARE @List AS CodeList;
INSERT INTO @List (Code, Name, GeneratedDate) VALUES ('SQLTEST', 'SQLTEST', '2018-07-30')
EXEC AddOrUpdateCodes @List
GO
SELECT * FROM Symbol;
C#代码:
public int AddOrUpdateCodes(List<Code> codes)
{
using (var entity = new CodeEntities())
{
var dataTable = new DataTable("CodeList");
using (var reader = ObjectReader.Create(codes, "Code", "Name", "GeneratedDate"))
{
dataTable.Load(reader);
}
var sqlParameter = new SqlParameter("@List", dataTable);
sqlParameter.SqlDbType = SqlDbType.Structured;
sqlParameter.TypeName = "dbo.CodeList";
var result = entity.Database.ExecuteSqlCommand("AddOrUpdateCodes",
sqlParameter);
entity.SaveChanges();
return result;
}
}
【问题讨论】:
-
你得到什么错误?
-
@HoneyBadger 提出了一个很好的观点 - 将来,请务必包含您收到的确切错误消息。请参阅How to Ask 和minimal reproducible example 了解更多详情。
-
@Brian Yah 我的问题的一部分是我没有收到任何错误消息,或者不确定如何捕获我在上面问题中提到的错误消息。
标签: c# sql sql-server stored-procedures