C#中解决插入数据库的某个字段类型为datetime 去掉默认值1900-01-01

在类的成员变量(全局变量)中,DateTime的默认值为: 0001-1-1 0:00:00

 

注:局部变量必须赋值才能使用

 

 

 

  继承于System.ValueType的全是值(Struct)类型的:  
              System.ArgIterator  
              System.Boolean  
              System.Byte  
              System.Char  
              System.Collections.DictionaryEntry  
              System.Collections.Specialized.BitVector32  
              System.Collections.Specialized.BitVector32.Section  
              System.Configuration.Assemblies.AssemblyHash  
              System.Data.OracleClient.OracleBinary  
              System.Data.OracleClient.OracleBoolean  
              System.Data.OracleClient.OracleDateTime  
              System.Data.OracleClient.OracleMonthSpan  
              System.Data.OracleClient.OracleNumber  
              System.Data.OracleClient.OracleString  
              System.Data.OracleClient.OracleTimeSpan  
              System.Data.SqlTypes.SqlBinary  
              System.Data.SqlTypes.SqlBoolean  
              System.Data.SqlTypes.SqlByte  
              System.Data.SqlTypes.SqlDateTime  
              System.Data.SqlTypes.SqlDecimal  
              System.Data.SqlTypes.SqlDouble  
              System.Data.SqlTypes.SqlGuid  
              System.Data.SqlTypes.SqlInt16  
              System.Data.SqlTypes.SqlInt32  
              System.Data.SqlTypes.SqlInt64  
              System.Data.SqlTypes.SqlMoney  
              System.Data.SqlTypes.SqlSingle  
              System.Data.SqlTypes.SqlString  
              System.DateTime  
              System.Decimal  
              System.Diagnostics.CounterSample  
              System.Diagnostics.SymbolStore.SymbolToken  
              System.Double  
              System.Drawing.CharacterRange  
              System.Drawing.Color  
              System.Drawing.Point  
              System.Drawing.PointF  
              System.Drawing.Rectangle  
              System.Drawing.RectangleF  
              System.Drawing.Size  
              System.Drawing.SizeF  
              System.EnterpriseServices.BOID  
              System.EnterpriseServices.XACTTRANSINFO  
              System.Enum  
              System.Guid  
              System.Int16  
              System.Int32  
              System.Int64  
              System.IntPtr  
              System.IO.WaitForChangedResult  
              System.Reflection.Emit.EventToken  
              System.Reflection.Emit.FieldToken  
              System.Reflection.Emit.Label  
              System.Reflection.Emit.MethodToken  
              System.Reflection.Emit.OpCode  
              System.Reflection.Emit.ParameterToken  
              System.Reflection.Emit.PropertyToken  
              System.Reflection.Emit.SignatureToken  
              System.Reflection.Emit.StringToken  
              System.Reflection.Emit.TypeToken  
              System.Reflection.InterfaceMapping  
              System.Reflection.ParameterModifier  
              System.Runtime.InteropServices.ArrayWithOffset  
              System.Runtime.InteropServices.BIND_OPTS  
              System.Runtime.InteropServices.BINDPTR  
              System.Runtime.InteropServices.CONNECTDATA  
              System.Runtime.InteropServices.DISPPARAMS  
              System.Runtime.InteropServices.ELEMDESC  
              System.Runtime.InteropServices.ELEMDESC.DESCUNION  
              System.Runtime.InteropServices.EXCEPINFO  
              System.Runtime.InteropServices.FILETIME  
              System.Runtime.InteropServices.FUNCDESC  
              System.Runtime.InteropServices.GCHandle  
              System.Runtime.InteropServices.HandleRef  
              System.Runtime.InteropServices.IDLDESC  
              System.Runtime.InteropServices.PARAMDESC  
              System.Runtime.InteropServices.STATSTG  
              System.Runtime.InteropServices.TYPEATTR  
              System.Runtime.InteropServices.TYPEDESC  
              System.Runtime.InteropServices.TYPELIBATTR  
              System.Runtime.InteropServices.VARDESC  
              System.Runtime.InteropServices.VARDESC.DESCUNION  
              System.Runtime.Serialization.SerializationEntry  
              System.Runtime.Serialization.StreamingContext  
              System.RuntimeArgumentHandle  
              System.RuntimeFieldHandle  
              System.RuntimeMethodHandle  
              System.RuntimeTypeHandle  
              System.SByte  
              System.Security.Cryptography.DSAParameters  
              System.Security.Cryptography.RSAParameters  
              System.Single  
              System.Threading.LockCookie  
              System.Threading.NativeOverlapped  
              System.TimeSpan  
              System.TypedReference  
              System.UInt16  
              System.UInt32  
              System.UInt64  
              System.UIntPtr  
              System.Void  
              System.Web.UI.WebControls.FontUnit  
              System.Web.UI.WebControls.Unit  
              System.Windows.Forms.BindingMemberInfo  
              System.Windows.Forms.DataGridCell  
              System.Windows.Forms.LinkArea  
              System.Windows.Forms.Message

 

 

 

 

在我的一个程序里遇到这样一个问题?
在数据库中的某个字段类型为 datetime     
页面上对应该字段的为一个text文本输入框,意思是输入时间。
string strId =txtId.Text.Trim();
string strName=txtName.Text.Trim();
string strPwd=txtPwd.Text.Trim();
string strExpiry=txtTime.Text.Trim(); //时间
  
System.Data.SqlClient.SqlParameter []parmCustomers = new SqlParameter[3];
parmCustomers[0] = new SqlParameter( "@C_Id", strId );
parmCustomers[1] = new SqlParameter( "@Name", strName );
parmCustomers[2] = new SqlParameter( "@Pwd", strPwd );  
parmCustomers[3] = new SqlParameter("@Date",strExpiry);//如果现文本里没有输入时间

SqlServerDatabase obj = new SqlServerDatabase();
if ( obj.RunProc( "proc_AddUser", parmCustomers ) == 1 )  // 添加成功
{
    Response.Write("<script type='text/javascript'>alert('Add Success!')</script>");
}
上段程序当然可以添加成功,  
问题是当txtTime.Text什么都没输入的时候,数据库中的这个字段仍然会存储   1900-01-01   00:00:00.000  
于是我就在parmCustomers[3] = new SqlParameter("@Date", " " )写入空字符串 或是 null ,可问题插入后数据库里还是显示1900-01-01  

以下是解决办法:
于是加了判断:   //注 数据库里时间字段要设置永许为空

 

string strExpiry=this.txtTime.Text.Trim();

 

System.Data.SqlClient.SqlParameter []parmCustomers = new SqlParameter[3];
parmCustomers[0] = new SqlParameter( "@C_Id", strId );
parmCustomers[1] = new SqlParameter( "@Name", strName );
parmCustomers[2] = new SqlParameter( "@Pwd", strPwd );  
  
if(strExpiry.ToString()=="")
{
    parmCustomers[3] = new SqlParameter("@Date",DBNull.Value);//如果文本框的时间为空的话就吧 strExpiry 改为 DBNull.Value 就OK了
}
else
{
    parmCustomers[3] = new SqlParameter("@Date",strExpiry);//有值时
}
SqlServerDatabase obj = new SqlServerDatabase();
if ( obj.RunProc( "proc_AddUser", parmCustomers ) == 1 )  // 添加成功
{
    Response.Write("<script type='text/javascript'>alert('Add Success!')</script>");
}
如果是Sql语句直接插入的话 
insert into AddUser (name,pwd)values('test','123')
date字段 就不要写入到插入的Sql语句里 这样数据库里的值就为空了。。。

 

-------------------------------------无敌分割线-----------------------------------------
DateTime是结构体,他不能直接被赋值成 null, 我建议是赋值成以下的方法
DateTime s = default( DateTime );
或是
DateTime s = DateTime.MinValue;

或是

DateTime s=DateTime.MaxValue; //DateTime最大值为:9999-12-31 23:59:59 

 

 


比较的时候直接if(s == DateTime.MinValue;)// 到了显示的时候,判断一下,如果是s == DateTime.MinValue 就可以在数据库传参的时候赋值为DBNull.value

 

 

 

 

posted @ 2009-12-30 14:56  唔愛吃蘋果  阅读(13994)  评论(1编辑  收藏  举报