2012-07-10 74 views
0

我在SQL Server 2005中的存储过程是这样的:传递日期时间变量到SQL Server存储过程在Visual Studio 2008

CREATE PROCEDURE [dbo].[REP_PayRange] 
    @StartDate datetime = NULL, 
    @EndDate datetime = NULL 
AS 
BEGIN 
    SET NOCOUNT ON; 
    SELECT * FROM Payment WHERE PayTime BETWEEN @StartDate AND @EndDate 
END 

它执行我运行从SQL中的结果:

EXEC REP_PayRange '1 Jan 2012', '10 Jan 2012' 

我遇到困难的地方是在Visual Studio中。

这里是我采取的步骤:

  1. 创建一个新的空白, “Web窗体”/ aspx文件中的选择
  2. 插入一个GridView
  3. 选择一个数据源的Visual Basic语言选择“数据库”
  4. 选择一个数据连接,我已经证实作品(用于SQL Server Native)
  5. “指定自定义SQL语句或存储过程”
  6. 选择“存储过程:”“REP_PayRange”
  7. 选择“参数来源:无”和默认值“2012 1月1日”的开始日期和“参数来源:无”和默认值“2012 01月10日”为结束日期
  8. 在测试查询页面上,点击“测试查询”,确保我的值是我上面指定的值,并且没有数据返回。如果我保存并在浏览器中预览它,GridView是空的。

我想使用此方法创建我的网页,以便稍后可以将我的参数源更改为日历而不是默认值。

提前感谢您的任何帮助或提示。

回答

1

你需要做两件事情:

(一)停止与区域,依赖于语言的风格格式化你的字符串。使用适当的,标准的,明确的格式,如'YYYYMMDD'。你的网页表单应该通过正确的输入参数和/或使用.Format()摆脱这个'2012年1月1日'的废话。 (b)为日期范围查询停止使用BETWEEN,因为这可能非常不明确(即使当您认为您的日期时间列不包含时间,您确定介于您认为它的意思时)吗?

一些背景资料:

http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/16/bad-habits-to-kick-mishandling-date-range-queries.aspx

http://sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/what-do-between-and-the-devil-have-in-common.aspx

+0

HI亚伦,感谢您的时间。我现在试着用你推荐的格式,它仍然在SQL中工作,但Visual Studio告诉我“字符串没有被识别为有效的DateTime”请参阅[这里](http://imgur.com/UQwMT)。 我之所以使用“之间”是为了提供一个简单的例子来说明如何重新创建问题。它仍然不能解释为什么它在SQL而不是Visual Studio中工作。 还有其他想法吗? – user1513425 2012-07-10 01:50:56

+0

对不起,不知道,在我的生活中曾经没有用过那个参数值对话框。也许这种高兴的事情是期待周围的报价(例如''20100101''),或者它可能需要''yyyy-mm-dd''... – 2012-07-10 02:01:17

+0

啊,我刚刚试过'yyyy-mm-dd'和visual studio将其作为有效输入接受,但SQL查询未返回任何结果。也许我必须学会如何以手动的方式做到这一点。有趣的是,如果您在Visual Studio中将其定义为自定义SQL语句(exec REP_PayRange'01 Jan 2012','Jan Jan 2012'),它将返回一个值,但不能使用便捷的参数源选择器。 – user1513425 2012-07-10 02:04:49