if (expDate!=System.DataTime.MinValue) { return false; }
if (expDate!=System.DataTime.MinValue) { return false; }
是 个 WebService ,有个Datetime输入参数 ,如果直接点击 调用 而不输入值 报错:System.ArgumentException: Cannot convert to System.DateTime. Parameter name: type ---> System.FormatException: String was not recognized as a valid DateTime. at System.DateTimeParse.Parse(String s, DateTimeFormatInfo dtfi, DateTimeStyles styles
TO timmy3310(Tim) :解释很合理,其实我也想到了这一层。但我总觉得这是一个设计上的缺陷,DateTime应该象 其他值类型一样有个初始值的(MinValue?1-1-1)。以避免歧义.......逼得我不得不用String来传递日期格式的参数或者搞’曲线救国‘用重载来解决还有上次的那个typeof和GetType的说法,也是勉强,总觉得是设计时的bug。既然我已经添加引用了,那么也就是知道版本和路径了,为什么一定要指定那些信息----呵呵,有些钻牛角尖了当然你的解释是相当精彩的~~~~~~~绕梁三日啊!!!
不知道斑竹发现堆栈没有: System.ArgumentException: Cannot convert to System.DateTime. Parameter name: type ---> System.FormatException: String was not recognized as a valid DateTime. at System.DateTimeParse.Parse(String s, DateTimeFormatInfo dtfi, DateTimeStyles styles) at System.DateTime.Parse(String s, IFormatProvider provider, DateTimeStyles styles) at System.DateTime.Parse(String s, IFormatProvider provider) at System.Convert.ToDateTime(String value, IFormatProvider provider) at System.String.System.IConvertible.ToDateTime(IFormatProvider provider) at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider) at System.Web.Services.Protocols.ScalarFormatter.FromString(String value, Type type) --- End of inner exception stack trace --- at System.Web.Services.Protocols.ScalarFormatter.FromString(String value, Type type) at System.Web.Services.Protocols.ValueCollectionParameterReader.Read(NameValueCollection collection) at System.Web.Services.Protocols.HtmlFormParameterReader.Read(HttpRequest request) at System.Web.Services.Protocols.HttpServerProtocol.ReadParameters() at System.Web.Services.Protocols.WebServiceHandler.Invoke() at System.Web.Services.Protocols.WebServiceHandler.CoreProcessRequest()在这个堆栈里可以看出,出错是在System.Web.Services.Protocols.WebServiceHandler.Invoke这个方法里,也就是说这个错误只有在客户端catch,但是在客户端catch是不能从根本上解决问题的。web方法在调用前传入的参数都是String类型,在Invoke方法里会检测这些参数与本身要调用的webservice方法的参数是否一致,如果不同,调用Convert里提供的ChangeType将参数转换到需要的类型对象。所以如果不能转换的话,就会出异常。从String到DateTime用的是Parse方法,所以才会报那样的错。因此,斑竹如果要避免这个错误出现的话,最好将webservice方法的参数由原来的DateTime改成String,然后在这个方法里调用Parse方法来转换,并且catch这个异常,如果错误的话,斑竹就可以进行自己的处理了。
{
return false;
}
{
return false;
}
Parameter name: type ---> System.FormatException: String was not recognized as a valid DateTime.
at System.DateTimeParse.Parse(String s, DateTimeFormatInfo dtfi, DateTimeStyles styles
{
Convert.ToDateTime(expDate);
}
catch
{
expDate = DateTime.Now;
}
涉及DateTime的传递,我全部是用String来实现的(要格式化)如果参数表中一定要用到DateTime类型,那么请重载此方法
public void A(String strIN)
{
.......
}
public void A(String strIN,DateTime dateIN)
{
.......
}BTW,对于此类型我也有个疑惑的地方。大家可以试一下,在DataSet中的DateTime类型的字段是可以为DBNull.Value的。记得不是很清,是做上上上个项目时发现的(1.0 Framework下时)现在我用1.1 :)
DataSet当中的数据是以object类型保存,值类型(包括结构类型)会进行Boxing操作,所以可以赋为DBNull.Value,DataSet当中保存的ColumnType会在数据更新的时候进行检查,这和编译时的类型检查不同
其他值类型一样有个初始值的(MinValue?1-1-1)。以避免歧义.......逼得我不得不用String来传递日期格式的参数或者搞’曲线救国‘用重载来解决还有上次的那个typeof和GetType的说法,也是勉强,总觉得是设计时的bug。既然我已经添加引用了,那么也就是知道版本和路径了,为什么一定要指定那些信息----呵呵,有些钻牛角尖了当然你的解释是相当精彩的~~~~~~~绕梁三日啊!!!
客户端可以这样调用
Validate("AAA");
也可以这样调用
Validate("AAA",new DateTime(1900,1,1));更详细的请见原帖,另外建议将此帖加入FAQ
[WebMethod]
public DateTime test(DateTime i) {
return i;
}可以改成这样试试
[WebMethod]
public DateTime test(String i) {
try{
return DateTime.Parse(i);
}catch(Exception e){
return DateTime.MinValue
}
}
[WebMethod]
public DateTime test(DateTime i) {
return i;
}可以改成这样试试
[WebMethod]
public DateTime test(String i) {
try{
return DateTime.Parse(i);
}catch(Exception e){
return DateTime.MinValue;
}
}
System.ArgumentException: Cannot convert to System.DateTime.
Parameter name: type ---> System.FormatException: String was not recognized as a valid DateTime.
at System.DateTimeParse.Parse(String s, DateTimeFormatInfo dtfi, DateTimeStyles styles)
at System.DateTime.Parse(String s, IFormatProvider provider, DateTimeStyles styles)
at System.DateTime.Parse(String s, IFormatProvider provider)
at System.Convert.ToDateTime(String value, IFormatProvider provider)
at System.String.System.IConvertible.ToDateTime(IFormatProvider provider)
at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider)
at System.Web.Services.Protocols.ScalarFormatter.FromString(String value, Type type)
--- End of inner exception stack trace ---
at System.Web.Services.Protocols.ScalarFormatter.FromString(String value, Type type)
at System.Web.Services.Protocols.ValueCollectionParameterReader.Read(NameValueCollection collection)
at System.Web.Services.Protocols.HtmlFormParameterReader.Read(HttpRequest request)
at System.Web.Services.Protocols.HttpServerProtocol.ReadParameters()
at System.Web.Services.Protocols.WebServiceHandler.Invoke()
at System.Web.Services.Protocols.WebServiceHandler.CoreProcessRequest()在这个堆栈里可以看出,出错是在System.Web.Services.Protocols.WebServiceHandler.Invoke这个方法里,也就是说这个错误只有在客户端catch,但是在客户端catch是不能从根本上解决问题的。web方法在调用前传入的参数都是String类型,在Invoke方法里会检测这些参数与本身要调用的webservice方法的参数是否一致,如果不同,调用Convert里提供的ChangeType将参数转换到需要的类型对象。所以如果不能转换的话,就会出异常。从String到DateTime用的是Parse方法,所以才会报那样的错。因此,斑竹如果要避免这个错误出现的话,最好将webservice方法的参数由原来的DateTime改成String,然后在这个方法里调用Parse方法来转换,并且catch这个异常,如果错误的话,斑竹就可以进行自己的处理了。