各位大侠,请听我道来。
我在一个页面上添加一个Detailsview,一个Objectdatasource,数据源的INSERT方法是调用DL.CS中的 public void insertok(string bookID, string bookTitle, DateTime bookDate),请注意最后一个参数类型为DateTime。
现在我想在插入记录时判断日期是否合法,如果不合法或为空,则默认为当前时间DateTime。now,在insertok里应该如何判断呢?相关代码:        string sqlstr = "insert into Books(bookTitle,bookISBN,bookPrice,bookPublisher,bookAuthor,bookDate,bookID,bookCoverUrl) " +
                                     " values(@bookTitle,@bookISBN,@bookPrice,@bookPublisher,@bookAuthor,@bookDate,@bookID,@bookCoverUrl)";  
            SqlCommand sqlCmd = new SqlCommand(sqlstr, mycon);
            if (bookTitle == null) bookTitle = "";
            if (bookISBN == null) bookISBN = "";
            if (bookPublisher == null) bookPublisher = "";
            if (bookAuthor == null) bookAuthor = "";
            if (bookCoverUrl == null) bookCoverUrl = "";            if (bookDate == null) bookDate = DateTime.Now;  //请注意这里不起作用
            if (bookPrice == null) bookPrice = 0;
         
            sqlCmd.Parameters.Add("@bookID", SqlDbType.NChar, 10).Value = bookID;
            sqlCmd.Parameters.Add("@bookTitle", SqlDbType.NChar, 50).Value = bookTitle;
            。。;
            sqlCmd.Parameters.Add("@bookCoverUrl", SqlDbType.NChar, 50).Value = bookCoverUrl;         
            sqlCmd.Parameters.Add("@bookDate", SqlDbType.DateTime).Value = bookDate;        
            mycon.Open();
            returnValue = sqlCmd.ExecuteNonQuery();
在判断的地方我试用了搜索来的很多方法,比如Datetime.parse,Datetime.tryparse,convert.todatetime,is datetime,bookdate.tostring()==""等,但均不见效果,请高手指点一下,如果不合法或为空,则默认为当前时间DateTime。now。谢谢啊。

解决方案 »

  1.   

    DateTime dt= DateTime.Now;
    if(DateTime.TryPase(bookDate,out bookDate))
    {
     
    }  
      

  2.   


    谢谢这位高手啊,请问你的意思是这样吗?            DateTime dt = DateTime.Now;
                if (DateTime.TryParse(bookDate, out bookDate))
                {            }
                else
                {
                    bookDate = dt;
                }
          可是提示错误:
    源错误:编译器错误信息: CS1502: 与“System.DateTime.TryParse(string, out System.DateTime)”最匹配的重载方法具有一些无效参数 行 114:            if (DateTime.TryParse(bookDate, out bookDate))好像不行哎。
     
      

  3.   


            DateTime bookDate = DateTime.Now;
            string strTime =Convert.ToString(bookDate);
            if (DateTime.TryParse(strTime,out bookDate))
            {
                bookDate = Convert.ToString(dt);
            }
            else
            {
                bookDate = Convert.ToString(dt);
            }
      

  4.   

    不好意思,上面弄错了,这个你自己改改,我刚测试了可以的DateTime dt = DateTime.Now;
            string ds = Convert.ToString(dt);
            if (DateTime.TryParse(ds,out dt))
            {
                this.LinkButton1.Text = Convert.ToString(dt);
            }
            else
            {
                this.LinkButton1.Text = Convert.ToString(dt);
            }
      

  5.   


    你的方法我之前已经使用过了,只对了一半,这是我修改的代码,语法上讲应该没什么问题:           DateTime dt = DateTime.Now;
                DateTime dtt;
               if (DateTime.TryParse(bookDate.ToString(), out dtt))
                {            }
                else
                {
                    dtt = dt;
                }
          
                
                sqlCmd.Parameters.Add("@bookDate", SqlDbType.DateTime).Value = dtt;
    当数据形如“2009-5-5”这样比较符合才可以运行,如果该字段没填内容,则报以下错误:
    SqlDateTime 溢出。必须介于 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM 之间。 
    说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.Data.SqlTypes.SqlTypeException: SqlDateTime 溢出。必须介于 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM 之间。源错误: 
    行 137:        
    行 138:            mycon.Open();
    行 139:            returnValue = sqlCmd.ExecuteNonQuery(); 而如果胡乱输入,比如“2009”,则会这样报错:该字符串未被识别为有效的 DateTime。 
    说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.FormatException: 该字符串未被识别为有效的 DateTime。源错误: 执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。 
    总之还不太完善啊,这怎么办呢,请再帮我想想办法吧。谢谢了。
      

  6.   

    如果在嵌套一个可以不?if (bookDate = null)
    {//}
    else
    {//}
      

  7.   


               if (bookDate == null)
                {
                    dtt = dt;
                }
                else
                {
                    if (DateTime.TryParse(bookDate.ToString(), out dtt))
                    {                }
                    else
                    {
                        dtt = dt;
                    }
                }
          改成这样还是不行,仍然报那个溢出错误,现在我觉得当bookdate没值时可能不是null,或许是其他,现在就是需要搞清楚到底是什么。
      

  8.   

    可惜我不太会看,也看不懂,看来你也尽力了,哎,谢谢你了。“/WebSite1”应用程序中的服务器错误。
    --------------------------------------------------------------------------------SqlDateTime 溢出。必须介于 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM 之间。 
    说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.Data.SqlTypes.SqlTypeException: SqlDateTime 溢出。必须介于 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM 之间。源错误: 
    行 147:        
    行 148:            mycon.Open();
    行 149:            returnValue = sqlCmd.ExecuteNonQuery();
    行 150:
    行 151:        }
     源文件: e:\mjx\searchina\WebSite1\App_Code\dl\dl.cs    行: 149 堆栈跟踪: 
    [SqlTypeException: SqlDateTime 溢出。必须介于 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM 之间。]
       System.Data.SqlTypes.SqlDateTime.FromTimeSpan(TimeSpan value) +331
       System.Data.SqlTypes.SqlDateTime.FromDateTime(DateTime value) +147
       System.Data.SqlTypes.SqlDateTime..ctor(DateTime value) +21
       System.Data.SqlClient.MetaType.FromDateTime(DateTime dateTime, Byte cb) +68
       System.Data.SqlClient.TdsParser.WriteValue(Object value, MetaType type, Int32 actualLength, Int32 encodingByteSize, Int32 offset, TdsParserStateObject stateObj) +1161
       System.Data.SqlClient.TdsParser.TdsExecuteRPC(_SqlRPC[] rpcArray, Int32 timeout, Boolean inSchema, SqlNotificationRequest notificationRequest, TdsParserStateObject stateObj) +4078
       System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) +1021
       System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) +314
       System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe) +413
       System.Data.SqlClient.SqlCommand.ExecuteNonQuery() +115
       dl.insertok(String bookID, String bookTitle, String bookISBN, Int32 bookPrice, String bookPublisher, String bookAuthor, String bookCoverUrl, DateTime bookDate) in e:\mjx\searchina\WebSite1\App_Code\dl\dl.cs:149[TargetInvocationException: 调用的目标发生了异常。]
       System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) +0
       System.RuntimeMethodHandle.InvokeMethodFast(Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) +72
       System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks) +358
       System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) +29
       System.Web.UI.WebControls.ObjectDataSourceView.InvokeMethod(ObjectDataSourceMethod method, Boolean disposeInstance, Object& instance) +484
       System.Web.UI.WebControls.ObjectDataSourceView.InvokeMethod(ObjectDataSourceMethod method) +39
       System.Web.UI.WebControls.ObjectDataSourceView.ExecuteInsert(IDictionary values) +738
       System.Web.UI.DataSourceView.Insert(IDictionary values, DataSourceViewOperationCallback callback) +68
       System.Web.UI.WebControls.DetailsView.HandleInsert(String commandArg, Boolean causesValidation) +395
       System.Web.UI.WebControls.DetailsView.HandleEvent(EventArgs e, Boolean causesValidation, String validationGroup) +609
       System.Web.UI.WebControls.DetailsView.OnBubbleEvent(Object source, EventArgs e) +88
       System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +35
       System.Web.UI.WebControls.DetailsViewRow.OnBubbleEvent(Object source, EventArgs e) +109
       System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +35
       System.Web.UI.WebControls.LinkButton.OnCommand(CommandEventArgs e) +86
       System.Web.UI.WebControls.LinkButton.RaisePostBackEvent(String eventArgument) +155
       System.Web.UI.WebControls.LinkButton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +7
       System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +11
       System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +172
       System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +4919 
    --------------------------------------------------------------------------------
    版本信息: Microsoft .NET Framework 版本:2.0.50727.42; ASP.NET 版本:2.0.50727.42 
      

  9.   

    你去google搜索下,断点的相关知识,说也不好说的。
      

  10.   

    试用了一下断点,虽然不完善,但知道了结果,BOOKDATE默认成了0001-1-1这样的日期,所以会报错。请问有知道解决办法的吗?就是判断一下日期是否合适。
      

  11.   

    returnValue = sqlCmd.ExecuteNonQuery();
    我记得“ExecuteNonQuery()” 撒东西都不返回啊!