1

我正在使用 Charles Nurse 在他的博客 http://www.charlesnurse.com/Blog/tabid/226/EntryId/69/DAL-2-DataContext-Deep-Dive.aspx中概述的 DotNetNuke 7 的 DAL2 并且遇到过使用 ExecuteScalar 时出现意外错误。

我的存储过程触发并插入到数据库中,但总体而言,代码错误是“不存在数据时读取的尝试无效。”。我已经看到了与数据阅读器相关的这个错误,尽管在我的例子中我使用了 DotNetNuke 的 PetaPoco 集成。任何见解都非常感谢。这是代码

public int AddLocation(string LocationType, string Name, string Description, string Address, string AreaCode, string Telephone, int Capacity, float Long, float Lat)
        {
            int id;
            using (IDataContext db = DataContext.Instance())
            {

                id = db.ExecuteScalar<int>(CommandType.StoredProcedure,
                    "CP_AddLocation", LocationType, Name, Description, Address, AreaCode, Telephone, Capacity, Long, Lat);
            }
            return id;
        }

还有我的存储过程。它自己工作并返回最新的 ID。我应该提到一些我注意到并发现奇怪的是,如果我将参数声明为输出参数,即@LocationId int OUTPUT,那么 addLocation() 方法不起作用,并且出现类似“预期参数@LocationId”的错误。

CREATE PROCEDURE [dbo].[CP_AddLocation]
 @locationType nvarchar(100),
 @name nvarchar(100),
 @description nvarchar(200),
 @address nvarchar(250),
 @areaCode nvarchar(50),
 @telephone nvarchar(50),
 @capacity int,
 @long float,
 @lat float

AS

DECLARE @geoCode geography
SET @geoCode = geography:: STGeomFromText('POINT (' + CAST(@long AS varchar) + ' ' + CAST(@lat AS varchar) + ')',4326);
BEGIN
INSERT INTO CP_Locations(
    LocationType,
    Name,
    Description,
    Address,
    AreaCode,
    Telephone,
    GeoCode,
    Capacity,
    Long,
    Lat)
    VALUES(
    @locationType,
    @name,
    @description,
    @address,
    @areaCode,
    @telephone,
    @geoCode,
    @capacity,
    @long,
    @lat)
END
declare @locationId int;
select @locationId = SCOPE_IDENTITY()
return @locationId;
4

1 回答 1

1

执行标量需要选择值,因为它从结果集的第一行和第一列获取值。

因此,只需将存储过程的最后 3 行替换为

SELECT SCOPE_IDENTITY()

你将被设置!

于 2013-03-02T05:46:54.137 回答