【问题标题】:Calling Stored Procedure in Entity Framework Core with parameters not start with @ or #在 Entity Framework Core 中调用存储过程,参数不以 @ 或 # 开头
【发布时间】:2019-11-05 22:51:43
【问题描述】:

我正在写一个基于ef-core 2.2的数据层,需要兼容SqlServer和Oracle。

当调用具有复杂数据格式(如二进制)或输出参数的SP时,需要创建一个SqlParameter实例。参数名称以 @ 或 # 开头,具体取决于所选数据库的类型。

为了数据库兼容性,如何避免使用前缀@或#?

谢谢。

【问题讨论】:

  • 我已经很久没有对 EF 做任何重要的工作了,所以我只会把它作为评论。从 C# 中执行 Sql 时,我从来不需要在 C# 中为参数名称添加前缀,只需根据数据库(MSSql、Oracle、MySQL)的 Sql 语言规则为执行的 Sql 中的参数添加前缀,例如: .Parameters.Add("myParam", myValue);
  • SqlParameter 确实不需要名称以@ 为前缀。该前缀在协议级别是必需的,但如果 SqlCommand 不以 @ 开头,则会在执行之前在内部修复名称。 (不知道它在 EF 中是如何工作的。)Oracle 不会接受 SqlParameter——这种类型是特定于 SQL Server 提供程序的。如果您想与数据库无关,则需要DbParameter

标签: c# sql-server oracle entity-framework-core ef-core-2.2


【解决方案1】:

不幸的是,在 sql 中你必须使用 @ 但在 oracle 中你可以删除它。 使用参数占位符 参数占位符的语法取决于数据源。 .NET Framework 数据提供程序以不同方式处理命名和指定参数和参数占位符。此语法针对特定数据源定制,如下表所述。

System.Data.SqlClient   Uses named parameters in the format @parametername.

System.Data.OleDb   Uses positional parameter markers indicated by a question mark (?).

System.Data.Odbc    Uses positional parameter markers indicated by a question mark (?).

System.Data.OracleClient    Uses named parameters in the format :parmname (or parmname).

你可以从这个链接找到完整的描述

https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/configuring-parameters-and-parameter-data-types?view=netframework-4.8#working-with-parameter-placeholders

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-25
    • 2020-12-11
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    • 1970-01-01
    • 2020-03-05
    • 2018-08-13
    相关资源
    最近更新 更多