Sql-Server

sp_executesql 使用 EntityCommandExecutionException 處理 uniqueidentifier-param 但仍按預期執行

  • July 5, 2017

我使用 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 中沒有實際列。

但是當我此時查看 DB 時,SProc 已成功執行: 結果如我所料…

那麼……您可以提供任何建議或解釋來理解這種魔法嗎?我是否應該簡單地抓住這個異常並表現得好像它從未發生過?副作用等?謝謝!

您使用的 API 需要一個結果集 ( SqlQuery<...>(...)),但您的儲存過程不產生任何結果集。因此出現錯誤消息。在您的程序執行,錯誤發生在客戶端,以解釋您看到的“魔術”。

您有幾種選擇:

引用自:https://dba.stackexchange.com/questions/178004