2010-11-01 95 views
1

我有一个存储过程,我用它在.net程序中填充gridview。SQL参数导致问题

问题是,当我填充该参数,并发送执行到数据库,我没有得到任何回报。

当我执行没有该参数的查询时,那么应用程序返回的数据没有任何问题。

任何想法可能是什么问题?

一些代码:

if (ddlCountries.SelectedIndex > 0) 
{ 
    commAdvanced.Parameters.Add("@ShippingCountry", SqlDbType.NVarChar).Value = shippingCountry; 
} 
else 
{ 
    commAdvanced.Parameters.Add("@ShippingCountry", SqlDbType.NVarChar).Value = DBNull.Value; 
} 

,这里是存储过程:

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER PROCEDURE Dbo_SearchAll 
(
    @StartTime datetime = null, 
    @EndTime datetime = null, 
    @CustomerEmail nvarchar(255) = null, 
    @OrderStatusID nvarchar = null, 
    @PaymentStatusID nvarchar = null, 
    @Username nvarchar(255) = null, 
    @CustomerName nvarchar(255) = null, 
    @OrderNumber int = null, 
    @MinimumOrderAmount decimal = null, 
    @MaximumOrderAmount decimal = null, 
    @ShippingMethod nvarchar = null, 
    @SKU nvarchar(255) = null, 
    @CouponID int = null, 
    @DiscountType int = null, 
    @ShippingCountry nvarchar = null 
) 
AS BEGIN 
    SET NOCOUNT ON 

    SELECT DISTINCT 
     o.OrderID, o.OrderTotal, o.ShippingCountry, 
     n.Name AS OrderStatus, 
     p.Name AS PaymentStatus 
    FROM 
     Order o 
    JOIN 
     OrderStatus n ON o.OrderStatusID = n.OrderStatusID 
    JOIN 
     PaymentStatus p ON o.OrderStatusID = p.PaymentStatusID 
    JOIN 
     Customer c ON o.CustomerID = c.CustomerID 
    JOIN 
     OrderVariationsPeople op ON o.OrderID = op.OrderID 
    JOIN 
     VariousPeople pv ON op.ProductID = pv.ProductId 
    WHERE 
     (o.CreatedOn > @StartTime OR @StartTime IS NULL) 
     AND (o.CreatedOn < @EndTime OR @EndTime IS NULL) 
     AND (o.ShippingEmail = @CustomerEmail OR @CustomerEmail IS NULL) 
     AND (o.OrderStatusID IN (@OrderStatusID) OR @OrderStatusID IS NULL) 
     AND (o.PaymentStatusID IN (@PaymentStatusID) OR @PaymentStatusID IS NULL) 
     AND (c.Username = @Username OR @Username IS NULL) 
     AND (o.BillingFirstName + ' ' + o.BillingLastName = @CustomerName OR @CustomerName IS NULL) 
     AND (o.ShippingFirstName + ' ' + o.ShippingLastName = @CustomerName OR @CustomerName IS NULL) 
     AND (o.OrderID = @OrderNumber OR @OrderNumber IS NULL) 
     AND (o.OrderTotal > @MinimumOrderAmount or @MinimumOrderAmount IS NULL) 
     AND (o.OrderTotal < @MaximumOrderAmount OR @MaximumOrderAmount IS NULL) 
     AND (o.ShippingMethod = @ShippingMethod OR @ShippingMethod IS NULL) 
     AND (pv.SKU = @SKU OR @SKU IS NULL) 
     AND (o.DiscountID = @DiscountType OR @DiscountType IS NULL) 
     AND (o.ShippingCountry = @ShippingCountry OR @ShippingCountry IS NULL) 
    ORDER BY 
     o.OrderID 
END 

任何想法,为什么该参数导致错误?

在此先感谢

+1

你得到了什么错误? – 2010-11-01 20:57:35

+0

我假设你在某处设置了shippingCountry = ddlCountries.SelectedValue的字符串值,对吧? – Bill 2010-11-01 22:11:32

+0

是的,我这样做,并且sql参数会得到正确的选择,如果从下拉列表中选择一个值,那么它的值将是sql null值。 – Laziale 2010-11-02 14:19:40

回答

2

试试这个,我会为你的所有条款做到这一点。

@ShippingCountry IS NOT NULL AND o.ShippingCountry = @ShippingCountry 

也不能传递参数NULL时,你默认的参数NULL的SP。

+0

问题是当我想包括国家参数,我没有问题,当国家参数不包括在内,只要在标准中包含 – Laziale 2010-11-01 21:50:48

+0

就是这样,试试我的方式。 – 2010-11-01 22:21:09

+0

我也尝试过,每当选择国家时,我仍然没有收到任何数据:S – Laziale 2010-11-02 14:18:52

0

您是否尝试过使用一些已知的良好参数值在应用程序之外执行proc?它是否在@ShippingCountry不为空时返回数据?