我想查询任意年月日,比如查询所有2005年进货的货物信息,年为2005,日和月为空。
就是说,年月日,可以空一个或二个,但不能全部为空
我写的的Sql语句是:
{
  int year, month, day;
  if(txtYear.Text==""||txtMonth.Text==""||txtDay.Text=="")
  {  MessageBox.show("不能全部为空!","错误提示"); return;  }
  try
{
  year = Convert.ToInt32(txtYear.Text);
  month = Convert.ToInt32(txtMonth.Text);
  day = Convert.ToInt32(txtDay.Text);
}
catch(FormatException e1)
{MessageBox.show(e1.Message,"错误提示"); return;}
  string str1 = "year(" + Clom + ")='" + year + "' and month(" + Clom + ")='" + month + "' and day(" +Clom + ")='" + day + "'";   //Clom是列名!
  StrSel = "select * from " + table + " where   " + str1 + "";//Sql查询语句
   //其它无关的代码就不写了
}
点击查询时,年月日任意一个为空,则程序会报错.  
如果用if语句来判断,则要写好多代码  
我知道有一个Convert的函数可以转换成“yyy-mm-dd”格式,但不知怎么写 。 
查了百度和SQL联机丛书还是不会写  
怎么办?高手指点迷津呀截图在附件

解决方案 »

  1.   

    try 

        year   =   Convert.ToInt32(txtYear.Text); 
        month   =   Convert.ToInt32(txtMonth.Text); 
        day   =   Convert.ToInt32(txtDay.Text); 
    } 这里如果Text的内容为空,则转换会报错可以写成try 

        year   =   Convert.ToInt32( "0" + txtYear.Text.Trim()); 
        month   =   Convert.ToInt32( "0" + txtMonth.Text.Trim()); 
        day   =   Convert.ToInt32( "0" + txtDay.Text.Trim()); 

      

  2.   

    以下代码仅用于说明, 会被SQL注入攻击, 
    实际应用中最好用参数查询或使用存储过程string szFilter = String.Empty;
    if (txtYear.Text != "")
        szFilter = "YEAR(stock_date)=" + txtYear.Text;if (txtMonth.Text != "")
        szFilter += "AND MONTH(stock_date) =" + txtMonth.Text;if (txtDay.Text != "")
        szFilter += "AND DAY(stock_data)= " + txtDay;
    if (szFilter == String.Empty)
    {
        lblInfo.Text="不能全为空<BR>";
        return;
    }string szSql = "SELECT * FROM [table] WHERE " + szFilter;
      

  3.   

    楼上正确,非常谢谢!
    何为参数查询?能不能简单解释一下
    但不知为会被SQL注入攻击?
    书店有没有书籍参考?
    想看关于这方面的书籍~~
      

  4.   

    如果不是初学者的话尽量使用MVC结构编写程序吧,毕竟安全些!
      

  5.   

    3楼的代码有问题,我来修改一下:
    string szFilter = String.Empty;
    if (txtYear.Text != "")
        szFilter = " YEAR(stock_date)=" + txtYear.Text;
    if (txtMonth.Text != "")
    {
        if(szFilter == String.Empty)
            szFilter = " MONTH(stock_date) =" + txtMonth.Text;
        else
            szFilter += " AND MONTH(stock_date) =" + txtMonth.Text;
    }
    if (txtDay.Text != "")
    {
        if(szFilter == String.Empty)
            szFilter = " DAY(stock_data)= " + txtDay;
        else
            szFilter += " AND DAY(stock_data)= " + txtDay;
    }
    if (szFilter == String.Empty)
    {
        lblInfo.Text="不能全为空<BR>";
        return;
    }string szSql = "SELECT * FROM [table] WHERE " + szFilter;
      

  6.   

    楼上真仔细-_-U
    不过呢,还要把txtDay改为txtDay.Text;^_^
    非常感谢^_^
      

  7.   

    这样的问题,我经常就是在sql语句的时候 ,多谢一个条件,允许他为空,不久可以过咯 。。呵呵。。学习 
      

  8.   

    参数查询:SqlCommand cmd=new SqlCommand();
    string szFilter = "";
    SqlParameter param;if (txtYear.Text != "")
    {
        szFilter = " YEAR(stock_date)=@Year "
        param=new SqlParameter("@Year", txtYear.Text);
        param.DbType=DbType.Int32;
        cmd.Parameters.Add(param);
    }else {
        //要求必须包含Year
        lblInfo.Text="必须输入年份<BR>";
        return;
    }
        
    if (txtMonth.Text != "")
    {
        szFilter += "AND MONTH(stock_date)=@Month"
        param=new SqlParameter("@Month", txtMonth.Text);
        param.DbType=DbType.Int32;
        cmd.Parameters.Add(param);
    }if (txtDay.Text != "")
    {
        szFilter += "AND DAY(stock_date)=@Day"
        param=new SqlParameter("@Day", txtDay.Text);
        param.DbType=DbType.Int32;
        cmd.Parameters.Add(param);
    }cmd.Connection=conn;
    cmd.CommandText = "SELECT * FROM [table] WHERE " + szFilter;
    conn.Open();
    ...