从服务器接收结果时发生传输级错误。 (提供者:tcp 提供者,错误:0 - 没有这样的文件或目录)'

问题描述 投票:0回答:1
using (var command = new SqlCommand("INSERT INTO TMateriales (NumMateriales, CodMateriales, NamMateriales, IslocalPMateriales, IdCategries, IsDepoMateriales, MadMateriales, PriceMateriales, PricePecMateriales, IdCurrency, TotaAmountOfPiece, DatMateriales) VALUES (@NumMateriales, @CodMateriales, @NamMateriales, @IslocalPMateriales, @IdCategries, @IsDepoMateriales, @MadMateriales, @PriceMateriales, @PricePecMateriales, @IdCurrency, @TotaAmountOfPiece, @DatMateriales)", App.Connection))
{
    command.Parameters.AddWithValue("@NumMateriales", row.NumMateriales ?? string.Empty);
    command.Parameters.AddWithValue("@CodMateriales", row.CodMateriales ?? string.Empty);
    command.Parameters.AddWithValue("@NamMateriales", row.NamMateriales ?? string.Empty);
    command.Parameters.AddWithValue("@IslocalPMateriales", row.IslocalPMateriales ?? false);
    command.Parameters.AddWithValue("@IdCategries", row.IdCategries ?? 0);
    command.Parameters.AddWithValue("@IsDepoMateriales", row.IsDepoMateriales ?? false);
    command.Parameters.AddWithValue("@MadMateriales", row.MadMateriales ?? string.Empty);
    command.Parameters.AddWithValue("@PriceMateriales", row.PriceMateriales ?? 0);
    command.Parameters.AddWithValue("@PricePecMateriales", row.PricePecMateriales ?? 0);
    command.Parameters.AddWithValue("@IdCurrency", row.IdCurrency ?? 0);
    command.Parameters.AddWithValue("@TotaAmountOfPiece", row.TotaAmountOfPiece ?? 0);
    command.Parameters.AddWithValue("@DatMateriales", row.DatMateriales ?? DateTime.Now);

    var result = command.ExecuteScalar();
    return Task.FromResult(result != null ? Convert.ToInt32(result) : 0);
}

我尝试将 PriceMateriales 设置为零(十进制类型),并且发生这些错误

从服务器接收结果时发生传输级错误。 (提供者:tcp 提供者,错误:0 - 没有这样的文件或目录)

PricePecMateriales 也是如此。

c# sql-server sqlcommand sqlexception
1个回答
0
投票

您的错误是因为

ExecuteScalar()
期望得到响应,而没有
INSERT
子句的
OUTPUT
语句或同一事务中后续的
SELECT/UPDATE/DELETE
语句没有返回值。

根据您的用例,您有三个选项。 您在哪里调用执行查询的方法可能会让您了解您的实际用例。

第一个,正如 Dan Guzman 在他的评论中指出的那样,是使用

ExecuteNonQuery
。 这将修复您的错误,并返回受查询影响的行数。

第二种是在语句中添加

OUTPUT
子句并使用
ExecuteScalar()
,并捕获返回的输出数据。

第三个仍然使用

ExecuteScalar()
。 将
SELECT
语句附加到您的 INSERT 中。 例如:

command.CommandText += "; SELECT CAST(SCOPE_IDENTITY() AS INT);";

然后将仅返回插入行的标识值。 非常适合

INSERT
ing 单行,并允许您继续使用新保存的实体。

© www.soinside.com 2019 - 2024. All rights reserved.