2017-08-31 9 views
0

Webアプリケーションから実行するストアドプロシージャの取得に取り組んでいます。私は、値がshouldのように入力されていることを確認できますが、私は2つのエラーのいずれかを得ます。Entity Frameworkコード最初に格納されたProc構文が正しくない/スカラ変数が宣言されている必要があります

これは関連するコードですが、私も周りを見回し、いくつかの異なるソリューションを試してみましたが、なぜ機能していないのかを突き止めました。

// incorrect syntax near newCompany - have tried with both the parameter1 and parameter1.Value, parameter2 and parameter2.Value 
public virtual int usp_TransferRecords(int oldCompany, int newCompany) 
{ 
    SqlParameter parameter1 = new SqlParameter("OldCompany", oldCompany); 
    SqlParameter parameter2 = new SqlParameter("NewCompany", newCompany); 
    return ((IObjectContextAdapter)this).ObjectContext.ExecuteStoreCommand("usp_TransferRecords @OldCompany @NewCompany", parameter1, parameter2); 
} 

// Message = "Must declare the scalar variable \"@OldCompany\"." - have tried with both the parameter1 and parameter1.Value, parameter2 and parameter2.Value 
public virtual int usp_TransferRecords(int oldCompany, int newCompany) 
{ 
    SqlParameter parameter1 = new SqlParameter("OldCompany", oldCompany); 
    SqlParameter parameter2 = new SqlParameter("NewCompany", newCompany); 

    return ((IObjectContextAdapter)this).ObjectContext.ExecuteStoreCommand("usp_TransferRecords @OldCompany, @NewCompany", parameter1, parameter2); 
} 

これはストアドプロシージャです::私はそれが次

// Original 
public virtual int usp_TransferRecords(int oldCompany, int newCompany) 
{ 
    SqlParameter parameter1 = new SqlParameter("OldCompany", oldCompany); 
    SqlParameter parameter2 = new SqlParameter("NewCompany", newCompany); 
    return ((IObjectContextAdapter)this).ObjectContext.ExecuteStoreCommand("usp_TransferRecords @OldCompany, @NewCompany", parameter1, parameter2); 
} 

を変更することにより、正常に動作するようになった

@using (Html.BeginForm(null, null, FormMethod.Post, new { id = "Form", enctype = "multipart/form-data" })) 
{ 
    <h2 style="text-align:center"> This copy Records from old Company to new Company</h2> 
    <div class="centered" style="width:400px"> 
    @Html.TextBox("oldCompany", id, new { onkeyup = "this.value=this.value.replace(/[^0-9]/g,'')", watermark = "Old Company #", @class = "watermark", style = "display:inline-block;" }) 
    @Html.TextBox("newCompany", String.Empty, new { onkeyup = "this.value=this.value.replace(/[^0-9]/g,'')", watermark = "New Company #", @class = "watermark", style = "display:inline-block;" }) 
    <input type="submit" name="submitButton" value="Copy" class="right orangebutton" style="position:absolute;left:62%;" /> 
    </div> 
} 

CREATE PROCEDURE [dbo].[usp_TransferRecords] 
    @OldCompany int, 
    @NewCompany int 
AS 
BEGIN 
    -- delete existing records from new company 
    DELETE FROM [dbo].[Table] WHERE CompanyID = @NewCompany 

    -- copy records from old company to new new company 
    INSERT INTO [dbo].[Table] ([ID], [CompanyID], [City], [State], [Priority]) 
     SELECT NEWID(), @NewCompany, City, State, Priority 
     FROM [dbo].[TABLE] 
     WHERE CompanyID = @OldCompany 

    -- reset record pages for both new and old companies 
    SET NOCOUNT ON; 

    -- deletes Dynamic Content Cache for both new and old companies 
    DELETE FROM [dbo].[Table] 
    WHERE CompanyID IN (@OldCompany, @NewCompany) 
     AND (ContentKey LIKE '%-generic-service-page' OR 
      ContentKey LIKE '%-item-custom-service-page' OR 
      ContentKey LIKE '%-about-page') 

    -- deletes contents to so they will be regenerated 
    DELETE FROM [dbo].[TABLE] 
    WHERE CompanyID IN (@OldCompany, @NewCompany) 
     AND IsCityPage = 1 
END 

Web UIのマークアップ

// Working 
public virtual int usp_TransferRecords(int oldCompany, int newCompany) 
{ 
    var @params = new SqlParameter[] 
    { 
     new SqlParameter("OldCompany", oldCompany), 
     new SqlParameter("NewCompany", newCompany) 
    }; 
     return ((IObjectContextAdapter)this).ObjectContext.ExecuteStoreCommand("usp_TransferRecords @OldCompany, @NewCompany", @params); 
} 

この方法が他の元のものよりも優れている理由については、洞察があります。すべての人に感謝します。

+0

です'usp_CopyRecord'を呼び出そうとしていますか? –

+0

申し訳ありませんが、タイプミスでコピーレコードの代わりにusp_TransferRecordsを呼び出す必要がありました – ondrovic

+0

'EXEC usp_TransferRecords @OldCompany = @OldCompany、@NewCompany = @ NewCompany'は何の収穫ですか? –

答えて

2
// Message = "Must declare the scalar variable \"@OldCompany\"." - have tried with both the parameter1 and parameter1.Value, parameter2 and parameter2.Value 
public virtual int usp_TransferRecords(int oldCompany, int newCompany) 
{ 
    SqlParameter parameter1 = new SqlParameter("OldCompany", oldCompany); 
    SqlParameter parameter2 = new SqlParameter("NewCompany", newCompany); 
    return ((IObjectContextAdapter)this).ObjectContext.ExecuteStoreCommand("usp_CopyRecord @OldCompany, @NewCompany", parameter1, parameter2); 
} 

エラーメッセージが表示されます。

"スカラー変数\" @ OldCompany \ "を宣言する必要があります。"ここで

"@OldCompany" != "OldCompany" 
+0

私は、 "usp_CopyRecord @OldCompany、@NewCompany" – ondrovic

+0

のパラメータの間にカンマがあると考えていました。私は 'ObjectContext.ExecuteStoreCommand'構文に慣れていません。しかし、 'SqlParameter'の名前には必ず' @ 'が必要です。 –

0

は、どのような最終的に

約1)明示的に `EXEC`を使用して、あなたが` usp_TransferRecords`とき」ストアドプロシージャのソースを与えている理由2)を説明する方法
// Working 
public virtual int usp_TransferRecords(int oldCompany, int newCompany) 
{ 
    var @params = new SqlParameter[] 
    { 
     new SqlParameter("OldCompany", oldCompany), 
     new SqlParameter("NewCompany", newCompany) 
    }; 
    return ((IObjectContextAdapter)this).ObjectContext.ExecuteStoreCommand("usp_TransferRecords @OldCompany, @NewCompany", @params); 
} 
関連する問題