2017-07-27 5 views
1

Die folgende Methode sieht eine Id für einen IMEI-Code bis Webmatrix-QueryValue-Anruferhöhung SQLException "Falsche Syntax in der Nähe von '0'."

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

Die sp ruft gesetzt wird einen einzelnen Wert zurück. Wenn in SMO ausgeführt wird, funktioniert das Verfahren gut. Geben Sie ihm eine IMEI-Zeichenfolge, und wenn es in der Tabelle ist, wird die VehicleId zurückgegeben. Wenn dies nicht der Fall, gibt es ein 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 

Wenn von Code ausführen, die Prozedur wirft System.Data.SqlClient.SqlException: Incorrect syntax near '0'. Es wirft, bevor ich die ISNULL() entfernt überprüfen, und nachdem ich es mit der IF-Anweisung ersetzt. Was ist die Ursache für diesen Fehler?

 
[SqlException (0x80131904): Incorrect syntax near '0'.] 
    System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) +2442126 
    System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean 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, String resetOptionsString) +379 
    System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds, Boolean describeParameterEncryptionRequest) +2026 
    System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite) +375 
    System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) +53 
    System.Data.SqlClient.SqlCommand.ExecuteScalar() +271 
    WebMatrix.Data.Database.QueryValue(String commandText, Object[] args) +111 
    *trim*.Forms.*trim*.Vehicle.GetId(String imei) in C:\Users\*trim*\Documents\Visual Studio 2017\WebSites\*trim*\App_Code\Vehicle.cs:258 
    ASP.Functions.UpdateSessionVehicle() in C:\Users\*trim*\Documents\Visual Studio 2017\WebSites\*trim*\App_Code\Functions.cshtml:148 
    ASP._Page_Default_cshtml.Execute() in C:\Users\*trim*\Documents\Visual Studio 2017\WebSites\*trim*\Default.cshtml:8 
    System.Web.WebPages.WebPageBase.ExecutePageHierarchy() +198 
    System.Web.WebPages.WebPage.ExecutePageHierarchy(IEnumerable`1 executors) +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 
+0

Sind Sie sicher, dass dies die richtige Syntax für 'sqlGetVehicle' ist ? Ich denke, es sollte mehr wie "sp_Scalar_VehicleId_For_IMEI @IMEI = @ 0" 'aussehen - wenn das überhaupt möglich ist ... hat noch nie mit Webmatrix und gespeicherten Prozeduren gearbeitet. – Corak

+0

Oder [vielleicht] (https://forums.asp.net/t/1649174.aspx) gerade eben: 'returnVal = db.Query (" Exec sp_Scalar_VehicleId_For_IMEI ", imei);' – Corak

+0

Sie hatten Recht, es war mein Token Format. Ich schwöre, ich werde blind. Mach es eine Antwort und ich wähle es – Hecatonchires

Antwort

1

Der Platzhalter für WebMatrix scheint @0 statt {0} zu sein. Um eine gespeicherte Prozedur tatsächlich auszuführen, sollte sie mit "Exec" aufgerufen werden.

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

Nach this post einen anderen Weg geben könnte:

, die mit im Auge, sollte der Befehl Text definiert werden als

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