【问题标题】:can't retrieve the wanted data out from database无法从数据库中检索出想要的数据
【发布时间】:2013-07-05 10:15:00
【问题描述】:

我在 Visual Studio 2010 中创建了一个 ASP.NET 应用程序。我无法从我从日期选择器中选择的两个日期中检索我想要的数据。一旦我选择了 2 个日期,它只会继续显示所有数据,而不是我选择的日期。

这是我的代码:

protected void Page_Load(object sender, EventArgs e)
{
    string startdate = (string)Session["startdate"];
    string enddate = (string)Session["enddate"];
    DateTime one = Convert.ToDateTime(startdate);
    DateTime two = Convert.ToDateTime(enddate);

    if (DateTime.Compare(two, one)>=0)
    {
        SqlConnection conn = new SqlConnection("Data Source=localhost;Initial Catalog=ncpsdbb;Integrated Security=True");
        conn.Open();

        SqlCommand sqlcmd = new SqlCommand("SELECT * FROM StudentTransactions WHERE TimeDate BETWEEN '" + startdate + "' AND '" + enddate + "')", conn);

        SqlDataAdapter da = new SqlDataAdapter(sqlcmd);
        DataSet ds = new DataSet();
        da.Fill(ds);

        GridView1.Visible = true;
        GridView1.DataBind();

        conn.Close();
    }
    else
    {
       GridView1.Visible = false;
       string strMsg = " Data not found for the choosen dates.";
       Response.Write("<script>alert('" + strMsg + "')</script>");
    }
}

【问题讨论】:

标签: asp.net sql-server gridview data-binding ado.net


【解决方案1】:

我最初的观察是,您的 SQL 中有一个 ),而 没有匹配的 ( - 我想知道您的命令是否只是抛出异常...?

我会尝试的第一件事是参数化它;除了是一个非常好的主意之外,它还可以避免日期中的格式(dd/MM vs MM/dd)问题:

if(two >= one)
{
    DataSet ds = new DataSet();
    using(var conn = new SqlConnection("Data Source=localhost;Initial Catalog=ncpsdbb;Integrated Security=True"))
    using(var sqlcmd = new SqlCommand("SELECT * FROM StudentTransactions WHERE TimeDate BETWEEN @start AND @end", conn))
    using(var da = new SqlDataAdapter(sqlcmd))
    {
        sqlcmd.Parameters.AddWithValue("start", one);
        sqlcmd.Parameters.AddWithValue("end", two);
        conn.Open();
        da.Fill(ds);
    }
}

【讨论】:

  • 一旦到达 da.Fill(ds);我收到此错误:将表达式转换为数据类型日期时间的算术溢出错误。
  • @PorWeiting TimeDate 的列类型是什么?即在数据库中是如何定义的?
  • 我的 TimeDate 列类型是:nvarchar(50)
  • @PorWeiting 是的,这是个问题;该列应为datedatetime - 否则您按字母顺序比较充其量。数据库中的日期应作为类型值存储
  • 数据库类型date/datetime可以存储dd/mm/yyyy格式的数据吗?
【解决方案2】:
using(SqlConnection conn = new SqlConnection("Data Source=localhost;Initial Catalog=ncpsdbb;Integrated Security=True"))
{
    conn.Open();

    SqlCommand sqlcmd = new SqlCommand("SELECT * FROM StudentTransactions WHERE TimeDate BETWEEN @startDate AND @endDate", conn);

    sqlcmd.Parameters.AddWithValue("startDate" <Your start date>);
    sqlcmd.Parameters.AddWithValue("endDate" <Your end date>);

    ...

还要注意命令字符串中带有括号的错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-20
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    相关资源
    最近更新 更多