C#LINQ ObjectParameter将STP输出转换为SQL数据类型
我一直在寻找答案,但找不到答案,有些事情真的很奇怪 我有一个SQL存储过程,它以smallint形式返回输出参数C#LINQ ObjectParameter将STP输出转换为SQL数据类型,c#,sql,sql-server,linq,stored-procedures,C#,Sql,Sql Server,Linq,Stored Procedures,我一直在寻找答案,但找不到答案,有些事情真的很奇怪 我有一个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_APPE
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返回二进制,2返回位,3返回字符,10返回Nchar
当我设置@Out\u Error\u Level=35时结束,结果是35
有什么帮助吗?如果查看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
,我希望它可以正常工作
资料来源:
总结一下,如果你得到了错误的结果,那么我建议你一定要看一下为你使用的对象和方法提供的文档,确保你没有对它的工作原理做出任何错误的假设