猿问

将小于 0.1 的小数从 C# 传递到 SQL - SQL Profiler 解释问题

当我从 C#传递值时,我无法将小于0.1正确值的十进制值从 C# 传递到 SQL,例如0.0033M我33在 SQL Profiler 中获得的十进制值


db.Insert(0.0033M);//SP Called from EDMX context `db` C#

当我检查SQL Profiler时,我得到


exec [dbo].[Insert] @Value=33 --Shouldn't it be 0.0033

但是当我传递任何大于等于0.1该值的值时,都会正确传递


如何将十进制值从 C# 正确传递到存储过程的十进制值?


这是我们的 SP,没关系,只是为了让事情更清楚,实际值是我们在前面提到的 Profiler 中收到的值


CREATE PROCEDURE [dbo].[Insert]  

 @Value[decimal](18, 6) NULL

AS            

BEGIN            

        Select @Value  -- this would give `33` when passed `0.0033M` From C#      

END

修改:


我非常感谢Microsoft 的 David Browne的回答。正如他所说,这没有问题,传递价值也没有问题。但在我们进一步的调查中,我们确实发现SQL Profiler解释错误,而 SQL 和 C# 工作得很好。在这里我要提到的是,我们使用 ADO.net 和 Entity Framework 进行了测试,发现问题出在 SQL Profiler 的解释上,即当小于0.1通过时 SQL Profiler 显示值错误,它显示 0.01为1和0.077as77。我非常感谢每一位参与的人,但我也想在这里提到这一点,这是一种异常行为,SQL Profiler 没有提供预期的结果,因为对于许多调试场景,我们使用 SQL Profiler。


胡说叔叔
浏览 83回答 1
1回答

临摹微笑

什么版本的EF?我无法使用简单的基于 EF6 EDMX 的数据库优先模型来重现这一点。添加了这个过程:CREATE PROCEDURE [dbo].[Insert]&nbsp;&nbsp;&nbsp;@Value[decimal](18, 6) NULLAS&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;BEGIN&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; Select @Value&nbsp; -- this would give `33` when passed `0.0033M` From C#&nbsp; &nbsp; &nbsp;&nbsp;END添加了数据库优先模型,生成public virtual ObjectResult<Nullable<decimal>> Insert(Nullable<decimal> value){&nbsp; &nbsp; var valueParameter = value.HasValue ?&nbsp; &nbsp; &nbsp; &nbsp; new ObjectParameter("Value", value) :&nbsp; &nbsp; &nbsp; &nbsp; new ObjectParameter("Value", typeof(decimal));&nbsp; &nbsp; return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<Nullable<decimal>>("Insert", valueParameter);}并跑:using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace ConsoleApp24{&nbsp; &nbsp; class Program&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; static void Main(string[] args)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; using (var db = new aEntities())&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; var result = db.Insert(0.0033M);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine(result.First().Value);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.ReadKey();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}输出是0.003300
随时随地看视频慕课网APP
我要回答