在我的应用程序(VS2015、C#、WebForm)中,我有以下代码,以前可以正常工作(在本地和生产服务器上),但现在出现错误:
插入项目的存储过程:
CREATE PROCEDURE [dbo].[StoredProcedure_Item_Insert]
@ItemText VARCHAR(250),
@InsertedID INT OUTPUT
INSERT INTO [dbo].[Item] ([ItemText])
VALUES (@ItemText -- ItemText - varchar(250)
);
SET @InsertedID = SCOPE_IDENTITY();
SELECT @InsertedID AS InsertedID;
存储库代码:
public int InsertItem(string itemText)
{
ObjectParameter InsertedId = new ObjectParameter("InsertedID", -1);
_db.StoredProcedure_Item_insert(feeText, InsertedId);
return (int)InsertedId.Value;
}
在
.edmx
文件中导入此存储过程的函数
Returns a Collection Of Scalars: Int32
当我点击
Get Column Information button
时,我得到
Name: InsertedID
EDM Type: Int32
Db Type: int
Nullable: true
我能想到的唯一改变是我的机器升级到了Windows 10,所以我不得不重新安装VS2015。
我尝试/发现的:
InsertedId.Value
始终为 -1DeclaringMethod
中的错误表示
((System.RuntimeType)InsertedId.MappableType).DeclaringMethod 抛出 System.InvalidOperationException System.Reflection.MethodBase {System.InvalidOperationException} 类型的异常
DeclaringMethod.Message
说
方法只能在 Type.IsGenericParameter 为 true 的类型上调用。
在存储过程中尝试了
OUT
和OUTPUT
SELECT @InsertedID
和RETURN @InsertedID
new ObjectParameter("InsertedID", typeof(Int32))
而不是 -1
作为第二个参数我已经花了好几个小时试图弄清楚发生了什么,但我完全陷入困境......
我想它抱怨从存储过程返回的结果是一个结果集是有道理的,但我仍然不知道为什么它过去可以工作......无论如何改变代码如下就可以了。
更改自:
public int InsertItem(string itemText)
{
ObjectParameter InsertedId = new ObjectParameter("InsertedID", -1);
_db.usp_Fee_insert(itemText, InsertedId);
return (int)InsertedId.Value;
}
对此:
public int InsertItem(string itemText)
{
ObjectParameter InsertedId = new ObjectParameter("InsertedID", -1);
var result = _db.usp_Fee_insert(itemText, InsertedId);
return (int)InsertedId.Value;
}