【问题标题】:Error executing stored procedure with datatable parameter in c#在 C# 中使用 datatable 参数执行存储过程时出错
【发布时间】: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 Askminimal reproducible example 了解更多详情。
  • @Brian Yah 我的问题的一部分是我没有收到任何错误消息,或者不确定如何捕获我在上面问题中提到的错误消息。

标签: c# sql sql-server stored-procedures


【解决方案1】:

DbContext.Database.ExecuteSqlCommand() 方法有助于针对数据库执行给定的 DDL/DML 命令。尝试使用此行传递 SqlParameters:

var result = entity.Database.ExecuteSqlCommand("AddOrUpdateCodes @List",
    sqlParameter);
    entity.SaveChanges();
        return result;

【讨论】:

  • 谢谢!我理解我在那里犯的粗心错误。
猜你喜欢
  • 2018-07-26
  • 2015-09-17
  • 1970-01-01
  • 2010-12-08
  • 1970-01-01
  • 2023-03-21
  • 2019-09-26
  • 1970-01-01
相关资源
最近更新 更多