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 也是如此。
您的错误是因为
ExecuteScalar()
期望得到响应,而没有 INSERT
子句的 OUTPUT
语句或同一事务中后续的 SELECT/UPDATE/DELETE
语句没有返回值。
根据您的用例,您有三个选项。 您在哪里调用执行查询的方法可能会让您了解您的实际用例。
第一个,正如 Dan Guzman 在他的评论中指出的那样,是使用
ExecuteNonQuery
。 这将修复您的错误,并返回受查询影响的行数。
第二种是在语句中添加
OUTPUT
子句并使用 ExecuteScalar()
,并捕获返回的输出数据。
第三个仍然使用
ExecuteScalar()
。 将 SELECT
语句附加到您的 INSERT 中。 例如:
command.CommandText += "; SELECT CAST(SCOPE_IDENTITY() AS INT);";
然后将仅返回插入行的标识值。 非常适合
INSERT
ing 单行,并允许您继续使用新保存的实体。