sp_executesql 使用 EntityCommandExecutionException 處理 uniqueidentifier-param 但仍按預期執行
我使用 Azure DB(MS-Sql)並使用 Management Studio for SQL Server 2016 管理數據庫。我的應用程序是一個簡單的 C#/WPF 應用程序。
所以我們開始吧,這是我的 SProc:
ALTER PROCEDURE [dbo].[StartChangeTrackingProcedure] ( @UID uniqueidentifier ) AS BEGIN SET NOCOUNT ON declare @sql nvarchar(max); SET @sql = N'INSERT INTO TBL_ChangeTrackerPerLoggedUser VALUES (0,0,0,0,0, @UID)'; PRINT @sql; EXECUTE sp_executesql @sql, '@UID uniqueidentifier', @UID = @UID END
TBL_ChangeTrackerPerLoggedUser 的名稱有點令人困惑,因為它與普通的 ChangeTracking-Mechanism 無關,它只是一個簡單的表,您可以在其中查找是否對 DB 進行了任何更改(因為 Azure 沒有查詢通知,對?)。它看起來像這樣:
CREATE TABLE [dbo].[TBL_ChangeTrackerPerLoggedUser]( [ChangedTemplates] [bit] NOT NULL, [ChangedInstances] [bit] NOT NULL, [ChangedWF] [bit] NOT NULL, [ChangedUser] [bit] NOT NULL, [ChangedDoc] [bit] NOT NULL, [UserDependency] [uniqueidentifier] NOT NULL, CONSTRAINT [PK_TBL_ChangeTrackerPerLoggedUser] PRIMARY KEY CLUSTERED ( [UserDependency] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) )
接下來,您將看到來自 Entity Framework 的呼叫,其中 LoggedUser.Instance.UsrID 是一個 GUID:
using (NCDBEntities DBContext = new NCDBEntities()) { var uid = new SqlParameter("@UID", LoggedUser.Instance.UsrID); var res = DBContext.Database .SqlQuery<TBL_ChangeTrackerPerLoggedUser> ("StartChangeTrackingProcedure @UID", uid).ToList(); }
現在,當我處理這段程式碼時,我得到一個 EntityCommandExecutionException 告訴我:
數據讀取器與“NCDBModel.TBL_ChangeTrackerPerLoggedUser”的指定值不兼容。類型為 (‘ChangedTemplates’) 的元素在同名數據讀取器中沒有對應的列。
翻譯這意味著類似:
Datareader 與“NCDBModel.TBL_ChangeTrackerPerLoggedUser”的給定值不兼容。一個類型的元素 (‘ChangedTemplates’) 在同名的 Datareader 中沒有實際列。
那麼……您可以提供任何建議或解釋來理解這種魔法嗎?我是否應該簡單地抓住這個異常並表現得好像它從未發生過?副作用等?謝謝!
您使用的 API 需要一個結果集 (
SqlQuery<...>(...)
),但您的儲存過程不產生任何結果集。因此出現錯誤消息。在您的程序執行後,錯誤發生在客戶端,以解釋您看到的“魔術”。您有幾種選擇:
- 使用非查詢 API,例如
ExecuteSqlCommand
- 讓您的儲存過程
OUTPUT
使用INSERT
.- 在 EF 中映射儲存過程