【问题标题】:Webmatrix QueryValue call raising SQLException "Incorrect syntax near '0'."Webmatrix QueryValue 调用引发 SQLException“'0' 附近的语法不正确。”
【发布时间】:2018-01-02 17:34:38
【问题描述】:

以下方法查找 IMEI 代码的 Id

public static int GetId(string imei)
{
    int returnVal = 0;
    string sqlGetVehicle = "sp_Scalar_VehicleId_For_IMEI @IMEI = {0}";

    using (var db = Database.Open("ClientApp"))
    {
        returnVal = db.QueryValue(sqlGetVehicle, imei);
    }

    return returnVal;
}

它调用的 sp 设置为返回单个值。在 SMO 中运行时,程序运行良好。给它一个 IMEI 字符串,如果它在表中,它将返回车辆 ID。如果不是,则返回 0。

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      *trim*
-- Create date: 2017-05-12
-- Description: Returns the VehicleId Associated with an IMEI
-- =============================================
ALTER PROCEDURE [dbo].[sp_Scalar_VehicleId_For_IMEI]
    @IMEI varchar(20)
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    DECLARE @VehicleId int

    SELECT @VehicleId = v.VehicleId
    FROM   Vehicles v
    WHERE v.TabletIMEI = @IMEI


    -- ISNULL() in query wasn't working
    IF @VehicleId IS NULL
    BEGIN
        SET @VehicleId = 0
    END

    SELECT @VehicleId

END

从代码运行时,该过程会抛出 System.Data.SqlClient.SqlException: Incorrect syntax near '0'. 在我删除 ISNULL() 检查之前并在我用 IF 语句替换它之后抛出这个。这个错误的根本原因是什么?

[SqlException (0x80131904): '0' 附近的语法不正确。] System.Data.SqlClient.SqlConnection.OnError(SqlException 异常,布尔型 breakConnection,Action`1 wrapCloseInAction)+2442126 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException 异常,布尔型 breakConnection,Action`1 wrapCloseInAction) +5736904 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) +628 System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) +3731 System.Data.SqlClient.SqlDataReader.TryConsumeMetaData() +58 System.Data.SqlClient.SqlDataReader.get_MetaData() +89 System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds,RunBehavior runBehavior,字符串 resetOptionsString)+379 System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,Boolean async,Int32 超时,Task& 任务,Boolean asyncWrite,SqlDataReader ds,Boolean describeParameterEncryptionRequest)+2026 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,String 方法,TaskCompletionSource`1 完成,Int32 超时,Task& 任务,Boolean asyncWrite)+375 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String 方法) +53 System.Data.SqlClient.SqlCommand.ExecuteScalar() +271 WebMatrix.Data.Database.QueryValue(String commandText, Object[] args) +111 *trim*.Forms.*trim*.Vehicle.GetId(String imei) 在 C:\Users\*trim*\Documents\Visual Studio 2017\WebSites\*trim*\App_Code\Vehicle.cs:258 C:\Users\*trim*\Documents\Visual Studio 2017\WebSites\*trim*\App_Code\Functions.cshtml:148 中的 ASP.Functions.UpdateSessionVehicle() C:\Users\*trim*\Documents\Visual Studio 2017\WebSites\*trim*\Default.cshtml:8 中的 ASP._Page_Default_cshtml.Execute() System.Web.WebPages.WebPageBase.ExecutePageHierarchy() +198 System.Web.WebPages.WebPage.ExecutePageHierarchy(IEnumerable`1 执行者) +69 System.Web.WebPages.WebPage.ExecutePageHierarchy() +131 System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage) +78 System.Web.WebPages.WebPageHttpHandler.ProcessRequestInternal(HttpContextBase httpContext) +116

【问题讨论】:

  • 您确定这是sqlGetVehicle 的正确语法吗?我认为它应该看起来更像"sp_Scalar_VehicleId_For_IMEI @IMEI = @0"——如果这是可能的话......从来没有使用过 Webmatrix 和存储过程。
  • maybe 甚至只是:returnVal = db.Query("Exec sp_Scalar_VehicleId_For_IMEI", imei);
  • 你是对的,这是我的令牌格式。我发誓我要瞎了让它成为答案,我会选择它
  • 还有前面的 EXEC,其他的都是:/

标签: c# tsql webmatrix


【解决方案1】:

Webmatrix 的占位符似乎是 @0 而不是 {0}。此外,要实际执行存储过程,应该使用"Exec" 调用它。

考虑到这一点,命令文本应定义为:

string sqlGetVehicle = "Exec sp_Scalar_VehicleId_For_IMEI @IMEI = @0";

根据this post,另一种可能是:

returnVal = db.Query("Exec sp_Scalar_VehicleId_For_IMEI", imei);

【讨论】:

    猜你喜欢
    • 2019-04-13
    • 1970-01-01
    • 1970-01-01
    • 2014-11-09
    • 2021-01-23
    • 2011-05-28
    • 1970-01-01
    • 2020-11-03
    • 1970-01-01
    相关资源
    最近更新 更多