1

チャールズ・ナースがブログ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() メソッドが機能せず、この「Expected parameter @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 に答える