【问题标题】:C# LINQ ObjectParameter turns STP output to SQL Data typeC# LINQ ObjectParameter 将 STP 输出转换为 SQL 数据类型
【发布时间】:2017-12-31 00:31:57
【问题描述】:

我一直在寻找答案,但找不到,发生了一些非常奇怪的事情。

我有 SQL 存储过程,它以 smallint 形式返回输出参数。

ALTER PROCEDURE [STP_NAME] 
@Out_Error_Level    Smallint OUTPUT
SELECT @Out_Error_Level = 0

当我通过 SQL Management Studio 执行时,非常简单且完美运行。

现在奇怪的是,当我通过 C# Link 执行时,我得到了“Bigint”。 C#代码也很简单:

DS_RAS_CD_APPEntities2 db = new DS_RAS_CD_APPEntities2();
ObjectParameter outputError = new ObjectParameter("Out_Error_Level", SqlDbType.SmallInt);
var updateProcessesList2 = db.STP_NAME(outputError);
Console.WriteLine(outputError.Value);

结果是:BigInt。

现在,当我将 sql 中的输出更改为不同的数字时,我会得到某种数据类型,例如:1 返回 Binary,2 返回 Bit,3 返回 Char,10 返回 Nchar。

当我设置@Out_Error_Level = 35时它结束,那么结果是35。

有什么帮助吗?

【问题讨论】:

    标签: c# sql sql-server linq stored-procedures


    【解决方案1】:

    如果你查看 ObjectParameter 的构造函数,你会发现有两个重载:

    ObjectParameter(String name, Object value)
    ObjectParameter(String name, Type type)
    

    如果您查看作为第二个参数提供的内容,那么它不是类型,因此它必须使用第一个重载。

    如果我们再看看它对第二次重载的描述:

    价值
    类型:System.Object
    参数的初始值(以及固有的类型)。

    如您所见,它将您传递的值 (SqlDbType.SmallInt) 作为默认值,并使用它来计算对象应该是的类型 - 在这种情况下当然是枚举 SqlDbType .因此,您传回的每个数字都将被转换为等效的枚举。一旦你提供了枚举中不存在的数字,它只会返回数字本身。

    你可能想做的是

    new ObjectParameter("Out_Error_Level", typeof(Int16));
    

    我使用Int16,因为这相当于数据库 SmallInt。您同样可以使用更常见的Int32,我希望它可以正常工作。

    信息来源:https://msdn.microsoft.com/en-us/library/system.data.entity.core.objects.objectparameter.objectparameter(v=vs.113).aspx

    要得出结论,如果您得到错误的结果,那么我建议您始终查看为您正在使用的对象和方法提供的文档,并确保您没有对它的工作原理做出任何错误的假设......

    【讨论】:

      猜你喜欢
      • 2020-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-18
      相关资源
      最近更新 更多