Addwithvalue导致语法错误

时间:2013-12-11 20:37:23

标签: asp.net sql vb.net

我有一个存储过程spSchedulerCheck,可以从SQL Server执行。它只需要一个参数@jn。试图从VB / ASP.Net运行它会引发一个语法错误(我正在捕捉)。

VB代码:

Public Function ScheduleCheck()
    Dim sText As String
    Using cn As New System.Data.SqlClient.SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings("ProductionDatabaseConnectionString1").ConnectionString)
        cn.Open()
        Dim cmd As New System.Data.SqlClient.SqlCommand("SchedulerCheck", cn)
        cmd.Parameters.AddWithValue("@jn", Trim(Request.QueryString("jn").ToString()))
        Try
            Using reader As System.Data.SqlClient.SqlDataReader = cmd.ExecuteReader()
                If reader.Read() Then
                    sText = reader(0).ToString()
                End If
            End Using
        Catch ex As Exception
            Return ex.Message
        End Try

        If Not cn Is Nothing Then
            cn.Close()
        End If
    End Using
        Return sText
End Function

SP:

USE [Production Database 2]
GO

/****** Object:  StoredProcedure [dbo].[SchedulerCheck]    Script Date: 12/11/2013 15:31:48 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

-- =============================================
-- Author:      <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE [dbo].[SchedulerCheck] 
    -- Add the parameters for the stored procedure here
    @jn as nvarchar(max)

AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
declare @pn nvarchar(10);
set @pn = (select Proposalnumber from tblprj_management where jobnumber = @jn);

select ReturnCode = case
    when not exists (select * from tblprj_equipmentscope where jobnumber = @jn)
        then 'Could not find scope'
    when not exists (select * from tblprj_frcriteria where jobnumber = @jn and 'FR' in (select equipment from tblprj_equipmentscope where jobnumber = @jn)) 
        then 'Could not find FR Criteria entry'
    when not exists (select * from tblprj_wccriteria where jobnumber = @jn and 'WC' in (select equipment from tblprj_equipmentscope where jobnumber = @jn)) 
        then 'Could not find WC Criteria entry'
    when not exists (select * from tblprj_sctcriteria where jobnumber = @jn and 'SCT' in (select equipment from tblprj_equipmentscope where jobnumber = @jn)) 
        then 'Could not find SCT Criteria entry'
    when not exists (select * from tblprj_accriteria where jobnumber = @jn and 'AC' in (select equipment from tblprj_equipmentscope where jobnumber = @jn)) 
        then 'Could not find AC Criteria entry'
    when not exists (select * from tblprj_LFcriteria where jobnumber = @jn and 'LF' in (select equipment from tblprj_equipmentscope where jobnumber = @jn)) 
        then 'Could not find LF Criteria entry'
    when not exists (select * from tblprj_laborest where proposalnumber = @pn)
        and not exists (select * from tblprj_mfglaborest assy where proposalnumber = @pn)
        then 'Could not find labor estimates'
    else 'Success'
    end


END

GO

在我看来,这应该返回SP中的一条消息,而不是错误输出。事实上,从SQL服务器运行它确实按预期运行。一些故障排除还表明,当我不提供参数时,它会按预期运行,并且只有在我尝试传递一个参数时才会出现问题。我在做什么导致错误?

编辑:错误是Syntax Error near SchedulerCheck

2 个答案:

答案 0 :(得分:2)

当您调用存储过程时,您需要将属性CommandType从默认的Text更改为StoredProcedure

  Dim cmd As New System.Data.SqlClient.SqlCommand("SchedulerCheck", cn)
  cmd.CommandType = CommandType.StoredProcedure

否则CommandText SchedulerCheck被解释为普通的sql文本 (就像是SELECT/INSERT/UPDATE/DELETE)。当然这会导致语法错误。

AddWithValue与错误消息

无关

答案 1 :(得分:2)

您需要将CommandType命令设置为StoredProcedure。默认值为Text

cmd.CommandType = CommandType.StoredProcedure