簡體   English   中英

在datetime列和integer列中插入空值

[英]inserting null values in datetime column and integer column

我正在使用C#並開發Winform應用程序。 我有一個具有項目屬性的項目類。

項目類的構造函數如下:

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);

我的問題是,當datetime變量和整數變量為null時,無法將值插入數據庫。 所有這些數據都從表單上的文本框分配給變量。

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();
            }
        }
    }

我的問題是,如何將值插入數據庫。 請幫忙

您是否收到錯誤消息,指出缺少該參數? 如果是這樣,對於具有空值的每個參數,請改用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值並將其轉換為null。

您不能在插入數據庫之前只是檢查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中!

另外,如果您有這樣的對象,則甚至可以向其添加一些邏輯,例如在保存它之前用合理的默認值替換NULL值。

您需要檢查該值是否為null,如果是,則插入System.DBNull.Value而不是該值。

<EDIT>除此之外,我建議您創建一個結構(struct)以將所有數據保存在一個數據類型內,而不要使用帶有數十億個參數的函數簽名。 </ EDIT>

您確定數據庫插入的列中允許空值嗎? 如果不是,則需要更改數據庫以支持空值或為每種類型插入默認值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM