SQL / VB.NET - 查询不返回应用程序

时间:2014-04-25 13:04:54

标签: sql sql-server vb.net

我从SQL管理控制台运行的MSSQL程序运行良好,但是当我尝试从我的VB.NET运行它时,它根本就不会返回。有人有什么想法吗?

  • 我正在使用相同的数据库进行测试。

SQL CODE(程序)

ALTER PROCEDURE [dbo].[P_DEN_L_IMPRESSAO_ORCAMENTOS_APROVADO_NOVO]
(
    @PAC_D_DATA_INICIAL DATETIME        = NULL,
    @PAC_D_DATA_FINAL   DATETIME        = NULL,
    @PAC_DET_N_CODIGO   DECIMAL         = NULL,
    @PAC_CLI_N_CODIGO   DECIMAL         = NULL,
    @PAC_EMP_N_CODIGO   DECIMAL         = NULL
)
AS

SELECT
    PAC_N_CODIGO,
    PAC_C_CODIGO_INTERNO,
    PAC_C_NOME,
    PAC_C_EMAIL,
    PAC_C_TELEFONE_RES,
    PAC_CLI_N_CODIGO,
    CLI_C_DESCRICAO,
    ODO_D_DATA_INICIO,
    ODO_D_DATA_FINAL,
    ODO_PTR_N_CODIGO,
    CASE PAC_N_CORRESPONDENCIA 
        WHEN 1 THEN
            PAC_C_ENDERECO_RES +
            CASE 
                WHEN PAC_C_NUMERO_RES IS NULL OR PAC_C_NUMERO_RES = '' THEN ''
                ELSE ', ' + PAC_C_NUMERO_RES
            END +
            CASE
                WHEN PAC_C_COMPLEMENTO_RES IS NULL OR PAC_C_COMPLEMENTO_RES = '' THEN ''
                ELSE ', ' + PAC_C_COMPLEMENTO_RES
            END
        WHEN 2 THEN
            PAC_C_ENDERECO_COM +
            CASE
                WHEN PAC_C_NUMERO_COM IS NULL OR PAC_C_NUMERO_COM = '' THEN ''
                ELSE ', ' + PAC_C_NUMERO_COM
            END +
            CASE
                WHEN PAC_C_COMPLEMENTO_COM IS NULL OR PAC_C_COMPLEMENTO_COM = '' THEN ''
                ELSE ', ' + PAC_C_COMPLEMENTO_COM
            END
    END AS PAC_C_ENDERECO,
    CASE PAC_N_CORRESPONDENCIA
        WHEN 1 THEN PAC_C_BAIRRO_RES
        WHEN 2 THEN PAC_C_BAIRRO_COM
    END AS PAC_C_BAIRRO,
    CASE PAC_N_CORRESPONDENCIA
        WHEN 1 THEN PAC_C_CIDADE_RES
        WHEN 2 THEN PAC_C_CIDADE_COM
    END AS PAC_C_CIDADE,
    CASE PAC_N_CORRESPONDENCIA
        WHEN 1 THEN
            (SELECT EST_C_RESUMIDO
            FROM DEN_EST_ESTADO
            WHERE EST_N_CODIGO = PAC_EST_N_CODIGO_RES)
        WHEN 2 THEN
            (SELECT EST_C_RESUMIDO
            FROM DEN_EST_ESTADO
            WHERE EST_N_CODIGO = PAC_EST_N_CODIGO_COM)
    END AS EST_C_RESUMIDO,
    CASE PAC_N_CORRESPONDENCIA
        WHEN 1 THEN PAC_C_CEP_RES
        WHEN 2 THEN PAC_C_CEP_COM
    END AS PAC_C_CEP,
    ODO_N_VERSAO,
    PAC_C_CELULAR,
    PAC_DET_N_CODIGO,
    ODO_N_CODIGO,
    SUM(VIN_N_VALOR) as 'T_PROC',
    (SELECT SUM(VIN_N_VALOR) FROM DEN_VIN_VINCULO_TRATAMENTO
        WHERE VIN_OXD_ODO_N_CODIGO = ODO_N_CODIGO) as 'VIN_N_VALOR',
    convert(decimal(18,2),0) AS 'T_ENTRADA'    
FROM
    DEN_PAC_PACIENTE
INNER JOIN 
    DEN_DET_DENTISTA 
ON
    DET_N_CODIGO = PAC_DET_N_CODIGO 
AND
    DET_CLI_N_CODIGO = PAC_CLI_N_CODIGO     
INNER JOIN 
    DEN_CLI_CLINICA 
ON
    CLI_N_CODIGO = PAC_CLI_N_CODIGO 
INNER JOIN 
    DEN_EMP_EMPRESA 
ON
    EMP_N_CODIGO = CLI_EMP_N_CODIGO     
INNER JOIN 
    DEN_ODO_ODONTOGRAMA 
ON
    ODO_PAC_N_CODIGO = PAC_N_CODIGO
INNER JOIN
    DEN_VIN_VINCULO_TRATAMENTO
ON
    VIN_OXD_ODO_N_CODIGO = ODO_N_CODIGO
WHERE
    (ODO_D_DATA_FINAL BETWEEN @PAC_D_DATA_INICIAL AND @PAC_D_DATA_FINAL) 
AND
    (ODO_PTR_N_CODIGO = 2) 
AND
    (ODO_B_APROVADO = 1) 
AND
    (@PAC_CLI_N_CODIGO IS NULL OR PAC_CLI_N_CODIGO = @PAC_CLI_N_CODIGO)
AND
    (@PAC_DET_N_CODIGO IS NULL OR VIN_DET_N_CODIGO = @PAC_DET_N_CODIGO)
AND
    (CLI_EMP_N_CODIGO = @PAC_EMP_N_CODIGO) 
AND
    (PAC_B_ATIVO = 1) 
AND
    (PAC_B_POTENCIAL = 0)   
GROUP BY
    PAC_N_CODIGO,
    PAC_C_CODIGO_INTERNO,
    PAC_C_NOME,
    PAC_C_EMAIL,
    PAC_C_TELEFONE_RES,
    PAC_CLI_N_CODIGO,
    CLI_C_DESCRICAO,
    ODO_D_DATA_INICIO,
    ODO_D_DATA_FINAL,
    ODO_PTR_N_CODIGO,
    ODO_N_VERSAO,
    PAC_C_CELULAR,
    PAC_DET_N_CODIGO,
    ODO_N_CODIGO,
    PAC_N_CORRESPONDENCIA,
    PAC_C_ENDERECO_RES,
    PAC_C_NUMERO_RES,
    PAC_C_NUMERO_RES,
    PAC_C_COMPLEMENTO_RES,
    PAC_C_ENDERECO_COM,
    PAC_C_NUMERO_COM,
    PAC_C_COMPLEMENTO_COM,
    PAC_C_BAIRRO_RES,
    PAC_C_BAIRRO_COM,
    PAC_C_CIDADE_RES,
    PAC_C_CIDADE_COM,
    PAC_EST_N_CODIGO_RES,
    PAC_EST_N_CODIGO_COM,
    PAC_C_CEP_RES,
    PAC_C_CEP_COM
ORDER BY
    PAC_C_NOME, ODO_N_VERSAO

VB.NET代码

Public Function ListarOrcamentosAprovadoNovo(ByVal mdlPaciente As Paciente, _
                                                 ByVal datDataInicial As Date, _
                                                 ByVal datDataFinal As Date, _
                                                 ByVal pblnEtiqueta As Boolean, Optional ByVal pstrCodigos As String = "") As DataTable
            Try
                cmdCommand = New FWCommand

                With cmdCommand
                    .CommandText = "P_DEN_L_IMPRESSAO_ORCAMENTOS_APROVADO_NOVO"
                    .CommandTimeout = intCommandTimeOut
                    .CommandType = CommandType.StoredProcedure

                    .Parameters.Add(New FWParameter("@PAC_D_DATA_INICIAL", FWDbType.DateTime))
                    .Parameters("@PAC_D_DATA_INICIAL").Value = datDataInicial

                    .Parameters.Add(New FWParameter("@PAC_D_DATA_FINAL", FWDbType.DateTime))
                    .Parameters("@PAC_D_DATA_FINAL").Value = datDataFinal

                    If mdlPaciente.CodDentista > -1 Then
                        .Parameters.Add(New FWParameter("@PAC_DET_N_CODIGO", FWDbType.Decimal))
                        .Parameters("@PAC_DET_N_CODIGO").Value = mdlPaciente.CodDentista
                    End If

                    If mdlPaciente.CodClinica > 0 Then
                        .Parameters.Add(New FWParameter("@PAC_CLI_N_CODIGO", FWDbType.Decimal))
                        .Parameters("@PAC_CLI_N_CODIGO").Value = mdlPaciente.CodClinica
                    End If

                    If mdlPaciente.CodEmpresa > 0 Then
                        .Parameters.Add(New FWParameter("@PAC_EMP_N_CODIGO", FWDbType.Decimal))
                        .Parameters("@PAC_EMP_N_CODIGO").Value = mdlPaciente.CodEmpresa
                    End If
                End With

                Return conProvider.ExecuteDataTable(cmdCommand)

            Catch ex As Exception
                Throw
            Finally
                cmdCommand = Nothing
            End Try
        End Function

1 个答案:

答案 0 :(得分:0)

要检查的事项:

  1. 检查您的.NET连接字符串是否指向同一个数据库 您正在SSMS查询中使用
  2. 您在.NET代码中使用不同的参数值,然后在SSMS中运行
  3. 这可能与"参数嗅探"有关。可能的解决方法是

    a)将with(recompile)添加到proc,

    b)添加一组局部变量,将参数值复制到查询中并使用局部变量,

    c)使用OPTION (OPTIMIZE FOR (@VARIABLE UNKNOWN))

    d)跟踪标志4136,可用于禁用"参数嗅探"流程(http://support.microsoft.com/kb/980653

  4. 有关参数嗅探的更多详细信息,请参阅这些文章:

    http://blogs.msdn.com/b/turgays/archive/2013/09/10/parameter-sniffing-problem-and-workarounds.aspx http://blogs.technet.com/b/mdegre/archive/2012/03/19/what-is-parameter-sniffing.aspx