将日期参数从C#WinForm传递到SQL存储过程

将日期参数从C#WinForm传递到SQL存储过程,c#,sql-server,winforms,stored-procedures,type-conversion,C#,Sql Server,Winforms,Stored Procedures,Type Conversion,我有一个带有2个dateTimePicker控件(dtpStart和dtpEnd)的表单,一个按钮和一个显示结果的datagridview。datagridview绑定到bindingSource控件 我想将两个date参数从dateTimePicker控件传递到存储过程,以便在我的datagridview上返回所需的范围 我的存储过程如下所示: CREATE PROC [dbo].[ProcTest](@StartDate date, @EndDate date) AS SELECT * FR

我有一个带有2个
dateTimePicker
控件(
dtpStart
dtpEnd
)的表单,一个按钮和一个显示结果的
datagridview
datagridview
绑定到
bindingSource
控件

我想将两个
date
参数从
dateTimePicker
控件传递到存储过程,以便在我的datagridview上返回所需的范围

我的存储过程如下所示:

CREATE PROC [dbo].[ProcTest](@StartDate date, @EndDate date)
AS
SELECT * FROM Test WHERE ModifiedDate BETWEEN @StartDate AND @EndDate
我的C#代码是:

当我运行上面的代码时,我在datagrid上没有收到任何信息,
dtpEnd.value
显示:
13/08/2012 02:15:29
,我假设这是一个转换问题,因为我在存储过程中使用了
date
类型,而
datetimepicker
值是
dateTime
类型


请问,如何解决此问题?

我认为您需要发送日期,而不是日期时间选择器的值

基本上,改变这一行:

var Qry = dc.ProcTest(dtpStart.Value, dtpEnd.Value);
全文如下:

var Qry = dc.ProcTest(dtpStart.SelectedDate.Value, dtpEnd.SelectedDate.Value);
如果仍然不起作用,我会尝试:

var Qry = dc.ProcTest(dtpStart.SelectedDate.Value.Date, dtpEnd.SelectedDate.Value.Date);

我相信你需要发送日期,而不是日期时间选择器的值

基本上,改变这一行:

var Qry = dc.ProcTest(dtpStart.Value, dtpEnd.Value);
全文如下:

var Qry = dc.ProcTest(dtpStart.SelectedDate.Value, dtpEnd.SelectedDate.Value);
如果仍然不起作用,我会尝试:

var Qry = dc.ProcTest(dtpStart.SelectedDate.Value.Date, dtpEnd.SelectedDate.Value.Date);

您需要检索查询结果,例如:

bindingSource1.DataSource = Qry.ToList();
我认为问题根本不在于日期参数。这一点得到以下方面的支持:


您需要检索查询结果,例如:

bindingSource1.DataSource = Qry.ToList();
我认为问题根本不在于日期参数。这一点得到以下方面的支持:

而不是这个

var Qry = dc.ProcTest(dtpStart.Value, dtpEnd.Value);
使用此选项并检查您的问题是否得到解决

var Qry = dc.ProcTest(dtpStart.ToString("dd-MMM-yyyy"), dtpEnd.ToString("dd-MMM-yyyy"));
而不是这个

var Qry = dc.ProcTest(dtpStart.Value, dtpEnd.Value);
使用此选项并检查您的问题是否得到解决

var Qry = dc.ProcTest(dtpStart.ToString("dd-MMM-yyyy"), dtpEnd.ToString("dd-MMM-yyyy"));

感谢Dave R.提供的链接:我发现我的代码不需要任何修改就可以工作。因此,我首先通过删除SP中的参数来搜索错误,然后发现我必须创建一个新的数据源对象,指向SP的结果,并在设计时将其绑定到datagridview。现在datagrid显示数据和参数正在工作

抱歉,伙计们,在发布我的问题之前,我必须验证这一点,但我对日期参数的使用非常困惑

因此,我保留了最初问题中的代码:

private void button1_Click(object sender, EventArgs e)
{
    dc = new NorthwindDataContext();

    var Qry = dc.ProcTest(dtpStart.Value, dtpEnd.Value);
    bindingSource1.DataSource = Qry;
}

感谢Dave R.提供的链接:我发现我的代码不需要任何修改就可以工作。因此,我首先通过删除SP中的参数来搜索错误,然后发现我必须创建一个新的数据源对象,指向SP的结果,并在设计时将其绑定到datagridview。现在datagrid显示数据和参数正在工作

抱歉,伙计们,在发布我的问题之前,我必须验证这一点,但我对日期参数的使用非常困惑

因此,我保留了最初问题中的代码:

private void button1_Click(object sender, EventArgs e)
{
    dc = new NorthwindDataContext();

    var Qry = dc.ProcTest(dtpStart.Value, dtpEnd.Value);
    bindingSource1.DataSource = Qry;
}


尝试仅传递日期部分-dtpStart.Value。Date@AVD,dtpStart.Value.Date显示2012年8月13日00:00:00不起作用,我认为要让我的代码正常工作,我需要我的SP接收如下内容:“2012/08/13”。我认为解决方案的一部分是使用ToSortDateString()如下:dtpStart.Value.ToSortDateString()返回2012年8月13日,查询需要使用以下格式:“2012/08/13”或“20120813”尝试将结果转换为
List
-dataGridView1.DataSource=res.ToList()@AVD,这似乎是一个解决方案,我在SP中成功地使用了您的建议,dtpStart.Value.ToString(“yyy/MM/dd”)返回了正确的格式,但仍然无法在我的datagrid中接收数据,需要验证datagrid绑定。。。我做了一些谷歌搜索,我们这里有一个文化问题,所以也可以保留参数的日期类型,并使用dtpStart.Value.ToUniversalTime()尝试只传递日期部分-dtpStart.Value。Date@AVD,dtpStart.Value.Date显示2012年8月13日00:00:00不起作用,我认为要让我的代码正常工作,我需要我的SP接收类似这样的信息:“2012/08/13”。我认为解决方案的一部分是像这样使用ToSortDateString():dtpStart.Value.ToSortDateString()返回2012年8月13日,查询需要使用以下格式:“2012/08/13”或“20120813”尝试将结果转换为
List
-dataGridView1.DataSource=res.ToList()@AVD,这似乎是一个解决方案,我在SP中成功地使用了您的建议,dtpStart.Value.ToString(“yyy/MM/dd”)返回了正确的格式,但仍然无法在我的datagrid中接收数据,需要验证datagrid绑定。。。我做了一些谷歌搜索,我们这里有一个文化问题,因此也可以保留参数的日期类型,并使用dtpStart.Value.ToUniversalTime(),如果您要进行向下投票,你能至少解释一下原因吗?有人投了反对票,我想是因为SelectedDate不是dateTimePicker控件的属性。如果你要投反对票,你能至少解释一下原因吗?有人投了反对票,我想是因为SelectedDate不是dateTimePicker控件的属性。谢谢你的建议,尝试bindingSource1.DataSource=Qry.ToList()时未发生任何更改@AlphaBird-您是否尝试过对日期参数进行编码,以确保存储过程实际返回某些内容?从SP中删除参数并运行程序后,我发现问题在于bindingsource在设计时未绑定到SP结果,因此,我创建了一个新的datasource对象,指向SP的结果,然后datagrid显示数据。而且没有必要向查询中添加.ToList()。@AlphaBird-很抱歉,ToList()毕竟不是必需的。我看到的例子都使用它,所以我认为这就是问题所在。不过,现在项目已经全部修复了,这太好了。感谢您的建议,尝试bindingSource1.DataSource=Qry.ToList()时没有任何更改@AlphaBird—您是否尝试过对日期参数进行编码,以确保您的存储过程实际上返回了一些内容?在从中删除参数之后