【问题标题】:Entity Framework Code First Stored Proc Incorrect Syntax / Must Declare Scalar VaribleEntity Framework Code First Stored Proc 语法不正确/必须声明标量变量
【发布时间】:2018-02-09 17:05:35
【问题描述】:

致力于让存储过程从 Web 应用程序中执行。我可以验证这些值是否像应该那样被填充,但我要么得到两个错误之一。

这是相关代码,我也环顾四周并尝试了一些不同的解决方案,只是坚持为什么它不起作用。

// 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);
}

这是存储过程:

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

网页界面标记:

@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>
}

我通过更改以下内容使其正常工作

// 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);
}

到:

// 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);
}

如果有人对为什么这种方法比另一种原始方法有效,我很想知道。感谢所有回复的人。

【问题讨论】:

  • 1) 显式使用 EXEC 和 2) 在尝试调用 usp_CopyRecord 时解释为什么要提供存储过程 usp_TransferRecords 的源代码?
  • 抱歉打错了应该调用 usp_TransferRecords 而不是复制记录
  • EXEC usp_TransferRecords @OldCompany = @OldCompany, @NewCompany = @NewCompany 产生了什么?还有EXEC usp_TransferRecords @OldCompany = ?, @NewCompany = ? 怎么样(后者应该不是必需的,但是嘿。)
  • 只是删除/传输的记录数量(0 行受影响)//已删除(8 行受影响)//传输 exec dbo.usp_TranferRercords @oldCompany = 1234,@newCompany = 5678
  • 不,我的意思是,更改代码中的执行字符串以读取它并查看是否收到不同的错误消息(或工作代码)。知道语句在查询窗口中工作也很有趣,但不是重点。 :-)

标签: c# sql entity-framework


【解决方案1】:
// 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"

【讨论】:

  • 我认为是因为这里的参数之间的逗号“usp_CopyRecord @OldCompany, @NewCompany”
  • 可能。我不熟悉ObjectContext.ExecuteStoreCommand 语法。但是SqlParameters 肯定需要在他们的名字中添加@
【解决方案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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-03
    • 1970-01-01
    • 2013-07-03
    相关资源
    最近更新 更多