【问题标题】:Calling Stored Proc with CHAR Parameters results in a parameter with a huge value使用 CHAR 参数调用存储过程会导致参数值很大
【发布时间】:2017-09-12 10:40:29
【问题描述】:

我正在使用 .net 应用程序中的 EF5 调用存储过程 [MS SQL]

来自 EF 的电话

return base.ExecuteFunction<sp_select_contracts_Result>("sp_select_contracts", x, y, z);

在proc中参数定义为@para1 CHAR(2)

但在 SQL Profiler 中,我发现 EF 发送以下内容

exec [dbo].[sp_select_contracts_statistics] @x='15                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               '@y='24                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               ',@z='2010                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            '

完全一样 - 实际值后面有大量空格。

当我将 CHAR 更改为 VARCHAR 时,它可以正常工作:

exec [dbo].[sp_select_contracts_statistics] @x='15','@y='24,@z='2010'

我可以轻松解决这个问题,但我想知道我缺少什么 在这里。

更新: 忘了提到在 C# 中所有的值都是字符串。 在通过 EF 之前来自 c# 的最后一次调用中,值是正确的: x = "15" {String}等..

编辑2: 将 CHARS 更改为 VARCHARS 按预期工作。仍然希望知道这是一个错误还是我们缺少的东西。

【问题讨论】:

  • 您的应用程序中的参数是如何定义的?很明显,传递所有空格的是应用程序...
  • 啊,我忘记了那部分:/它们都是字符串,在通过 EF 之前的最后一次调用中,值是正确的。
  • 我不懂 C#,但字符串在那些定义中没有 SIZE 吗?例如,当您定义 char 数据类型时,您还应该精确地确定大小:例如 char(50)。如果你不这样做,默认大小是 1。难道在 C# 中也有一个默认大小,比如 8000,如果你没有明确定义它,它使用那个默认大小?

标签: sql-server entity-framework c#-4.0 entity-framework-5


【解决方案1】:

当你定义一个 char 参数时,你必须定义最大长度,否则它会做一些奇怪的事情。它默认为未定义为最大大小的完整长度的所有其他字符放置空格。我猜这里 char 的 EF 的默认最大大小相当大:

var parm = new SqlParameter("x", SqlDbType.Char, 2);
parm.Value = "15";

【讨论】:

  • 这可能是真的,但我认为这应该由 EF 而不是手动完成。
  • EF 不知道存储过程的参数类型是什么。你必须自己设置。
  • 不能推断类型吗?我的意思是它是在存储过程中定义的,而 EF 已经获取了其他所有内容 - 存储过程本身及其参数,甚至它的返回类型。我错过了什么吗?
  • 你给了一个字符串来运行 sql,所以它在 ef 之外运行。它需要点击主数据库来计算参数,但它不能为你做到这一点,因为它可能没有权限。我假设默认值是 50 个字符,不是那么大,但这只是意味着你必须在调用 sp 时自己告诉它所有内容。
  • 更换设计师的问题是每次我刷新 edmx 并且它会自动生成并删除我的更改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-28
  • 2018-08-16
  • 1970-01-01
相关资源
最近更新 更多