2010-03-16 45 views
0

我正在使用C#并开发一个winform应用程序。我有一个具有项目属性的项目类。在datetime列和整数列中插入空值

项目类的构造函数如下:

newProject = new Project(GCD_ID.IsNull() ? (int?)null : Convert.ToInt32(GCD_ID), txt_Proj_Desc.Text, txt_Prop_Name.Text, ST.ID.ToString().IsNull() ? null: ST.ID.ToString(), cmbCentre.Text, 
            SEC.ID.ToString().IsNull() ? null : SEC.ID.ToString(), cmbZone.Text, 
            FD.ID.ToString().IsNull() ? null : FD.ID.ToString(), DT.ID.ToString().IsNull() ? null : DT.ID.ToString(), OP.ID.ToString().IsNull() ? null : OP.ID.ToString(), T.ID.ToString().IsNull() ? null : T.ID.ToString(), 
            CKV.ID.ToString().IsNull() ? null : CKV.ID.ToString(), STAT.ID.ToString().IsNull() ? null : STAT.ID.ToString(), MW.IsNull() ? (Double?)null : Convert.ToDouble(MW), 
            txt_Subject.Text, Ip_Num.IsNull() ? (int?)null : Convert.ToInt32(Ip_Num), H1N_ID.IsNull() ? (int?)null : Convert.ToInt32(H1N_ID), 
            NOMS_Slip_Num.IsNull() ? (int?)null : Convert.ToInt32(NOMS_Slip_Num), NMS_Updated.IsNull() ? (DateTime?)null : Convert.ToDateTime(NMS_Updated), 
            Received_Date.IsNull() ? (DateTime?)null : Convert.ToDateTime(Received_Date), Actual_IS_Date.IsNull() ? (DateTime?)null : Convert.ToDateTime(Actual_IS_Date), 
            Scheduled_IS_Date.IsNull() ? (DateTime?)null : Convert.ToDateTime(Scheduled_IS_Date), UpSt.ID.ToString().IsNull() ? null : UpSt.ID.ToString(), 
            UpFd.ID.ToString().IsNull() ? null : UpFd.ID.ToString(), txtHVCircuit.Text, cmbbxSIA.Text); 

我的问题是,我不能将值插入数据库时​​的日期时间变量和整型变量是空的。所有这些数据都从表格上的文本框中分配给变量..

bELOW是数据库函数,它接收所有变量并将它们插入到数据库中。

public static void createNewProject(int? GCD_ID, string Project_Desc, string Proponent_Name, int Station_ID, string OpCentre, int Sector_ID, string PLZone, int Feeder, int DxTx_ID, int OpControl_ID, int Type_ID, int ConnKV_ID, int Status_ID, double? MW, string Subject, int? Ip_Num, int? H1N_ID, int? NOMS_Slip_Num, DateTime? NMS_Updated, DateTime? Received_Date, DateTime? Actual_IS_Date, DateTime? Scheduled_IS_Date, int UP_Station_ID, int UP_Feeder_ID, string @HV_Circuit, string SIA_Required) 
    { 
     SqlConnection conn = null; 
     try 
     { 
      //Takes in all the employee details to be added to the database. 
      conn = new SqlConnection(databaseConnectionString); 
      conn.Open(); 
      SqlCommand cmd = new SqlCommand("createNewProject", conn); 
      cmd.CommandType = CommandType.StoredProcedure; 
      cmd.Parameters.Add(new SqlParameter("GCD_ID", GCD_ID)); 
      cmd.Parameters.Add(new SqlParameter("Project_Desc", MiscFunctions.Capitalize(Project_Desc))); 
      cmd.Parameters.Add(new SqlParameter("Proponent_Name", MiscFunctions.Capitalize(Proponent_Name))); 
      cmd.Parameters.Add(new SqlParameter("Station_ID", Station_ID)); 
      cmd.Parameters.Add(new SqlParameter("OpCentre", OpCentre)); 
      cmd.Parameters.Add(new SqlParameter("Sector_ID", Sector_ID)); 
      cmd.Parameters.Add(new SqlParameter("PLZone", PLZone)); 
      cmd.Parameters.Add(new SqlParameter("Feeder", Feeder)); 
      cmd.Parameters.Add(new SqlParameter("DxTx_ID", DxTx_ID)); 
      cmd.Parameters.Add(new SqlParameter("OpControl_ID", OpControl_ID)); 
      cmd.Parameters.Add(new SqlParameter("Type_ID", Type_ID)); 
      cmd.Parameters.Add(new SqlParameter("ConnKV_ID", ConnKV_ID)); 
      cmd.Parameters.Add(new SqlParameter("Status_ID", Status_ID)); 
      cmd.Parameters.Add(new SqlParameter("MW", MW)); 
      cmd.Parameters.Add(new SqlParameter("Subject", Subject)); 
      cmd.Parameters.Add(new SqlParameter("Ip_Num", Ip_Num)); 
      cmd.Parameters.Add(new SqlParameter("H1N_ID", H1N_ID)); 
      cmd.Parameters.Add(new SqlParameter("NOMS_Slip_Num", NOMS_Slip_Num)); 
      cmd.Parameters.Add(new SqlParameter("NMS_Updated", NMS_Updated)); 
      cmd.Parameters.Add(new SqlParameter("Received_Date", Received_Date)); 
      cmd.Parameters.Add(new SqlParameter("Actual_IS_Date", Actual_IS_Date)); 
      cmd.Parameters.Add(new SqlParameter("Scheduled_IS_Date", Scheduled_IS_Date)); 
      cmd.Parameters.Add(new SqlParameter("UP_Station_ID", UP_Station_ID)); 
      cmd.Parameters.Add(new SqlParameter("UP_Feeder_ID", UP_Feeder_ID)); 
      cmd.Parameters.Add(new SqlParameter("HV_Circuit", HV_Circuit)); 
      cmd.Parameters.Add(new SqlParameter("SIA_Required", SIA_Required)); 
      cmd.ExecuteNonQuery(); 
     } 
     catch (Exception e) //returns if error incurred. 
     { 
      MessageBox.Show("Error occured in createNewProject" + Environment.NewLine + e.ToString()); 
     } 
     finally 
     { 
      if (conn != null) 
      { 
       conn.Close(); 
      } 
     } 
    } 

我的问题是,我如何在数据库中插入值。 请请帮忙

回答

4

您是否收到错误,指出该参数缺失?如果是这样,对于每个具有空值的参数,请改为使用DBNull.Value。

所以这样做,或者它的一些变化:

if(H1N_ID != null) 
{ 
    cmd.Parameters.Add(new SqlParameter("H1N_ID",HIN_ID); 
} 
else 
{ 
    cmd.Parameters.Add(new SqlParameter("H1N_ID",DBNull.Value); 
} 

此外,任何时候你正在阅读这些领域从数据库到你的对象,您应检查DBNull.Value值,将其转换成空值。

0

您需要检查值是否为空,如果是,则插入System.DBNull.Value而不是值。

<编辑> 除此之外,我建议你创建一个结构(结构),以容纳所有数据的单一数据类型的内部而不是用bajillion参数的函数签名。 < /编辑>

1

难道你只是在插入到数据库之前检查null,并使用一些合理的默认值,而不是?

public static void createNewProject(int? GCD_ID........) 
{ 
    if(!GCD_ID.HasValue) 
    { 
     GCD_ID = 0; 
    } 
    ......... 

    if(!Received_Date.HasValue) 
    { 
     Received_Date = DateTime.Today; 
    } 
    ....... 
} 

PS:你是否考虑过把所有这些单独的值到数据传输对象(例如NewProjectDTO,只是路过的那个类的一个实例

public class NewProjectDTO 
{ 
    int GCD_ID { get; set; } 
    string Project_Desc { get; set; } 
    string Proponent_Name { get; set; } 
    ....... (and so on) 
} 

public static void createNewProject(NewProjectDTO newProjectValues) 
{ 
..... 
} 

只要你有超过3,4参数,你应该真的考虑把这些放入某种传输DTO!

另外,如果你有这样一个对象,你甚至可能会添加一些逻辑,例如r在保存之前用合理的默认值替换NULL值...

+1

+1 - 提到DTO的。 – JonH 2010-03-16 17:53:51

+0

我不想插入默认值...但无效 – reggie 2010-03-16 18:09:08

+0

@reggie - 所以看到我的回应。 – JonH 2010-03-16 19:14:57

0

你确定你的数据库允许你插入的列中有空值吗?如果不是,则需要更改DB以支持空值或为每个类型插入默认值。