-2

DOB(生年月日)と(参加日)の2つのフィールドがあります。ユーザーが日付を入力した場合、データベースに挿入->日付、そうでない場合は挿入->null

プロパティを次のように定義しました

  public DateTime DOB
    {
        get;
        set;
    }
    public DateTime DOJ
    {
        get;
        set;
    }

今 save_click イベントで

        IFormatProvider provider = new System.Globalization.CultureInfo("en-CA", true);
        String datetime = txtDOB.Text.Trim();
        DateTime date = DateTime.Parse(datetime, provider, System.Globalization.DateTimeStyles.NoCurrentDateDefault);
        objEmp.DOB = date;

        provider = new System.Globalization.CultureInfo("en-CA", true);
        datetime = txtDOJ.Text.Trim();
        date = DateTime.Parse(datetime, provider, System.Globalization.DateTimeStyles.NoCurrentDateDefault);
        objEmp.DOJ = date;

class.cs

        param[7] = new Service.SqlParameter();
        param[7].ParameterName = "@DOB";
        param[7].Value = DOB;
        param[7].SqlDbType = Service.SqlDbType.DateTime;

        param[8] = new Service.SqlParameter();
        param[8].ParameterName = "@DOJ";
        param[8].Value = DOJ;
        param[8].SqlDbType = Service.SqlDbType.DateTime;

ユーザーが日付を挿入しなかった場合は、null を挿入する必要があります...しかし、このコードでは、 ストア プロシージャのエラーが発生しています

@FK_EmployeeTypeID Numeric(18,0),
    @EmployeeName NVARCHAR(50), 
    @CellNo  NVARCHAR(50),  
    @PhNo  NVARCHAR(50),    
    @Address  NVARCHAR(Max),    
    @Email  NVARCHAR(50),   
    @DOB DATETIME,
    @DOJ DATETIME,
    @DOR NVARCHAR(12),
    @Status NVARCHAR(50),
    @Remarks NVARCHAR(Max)

AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    BEGIN TRY
        BEGIN TRANSACTION Employee_Insert
    INSERT 
    INTO
    Employee
    (
        FK_EmployeeTypeID,
        EmployeeName,   
        CellNo, 
        PhNo,   
        Address,    
        Email,  
        DOB,
        DOJ,
        DOR,
        Status,
        Remarks

    )
    VALUES
    (

        @FK_EmployeeTypeID,
        @EmployeeName,  
        @CellNo,    
        @PhNo,  
        @Address,   
        @Email, 
        @DOB,
        @DOJ,
        @DOR,
        @Status,
        @Remarks
    )

        COMMIT TRANSACTION Employee_Insert
    SELECT '1'
    END TRY
    BEGIN CATCH
        SELECT 'Error : ' + ERROR_MESSAGE()
        ROLLBACK TRANSACTION Employee_Insert
    END CATCH

ウェブサービス

[WebMethod]
    public string InsUpdDel(string Conn, string ProcName, SqlParameter[] p)
    {
        try
        {
            using (SqlConnection cn = new SqlConnection(Conn))
            {
                if (cn.State == ConnectionState.Open || cn.State == ConnectionState.Broken || cn.State == ConnectionState.Connecting || cn.State == ConnectionState.Executing || cn.State == ConnectionState.Fetching)
                    cn.Close();
                cn.Open();
                SqlCommand cmd = new SqlCommand(ProcName, cn);

                cmd.CommandType = CommandType.StoredProcedure;

                foreach (SqlParameter param in p)
                {
                    cmd.Parameters.Add(param);
                }
                SqlDataReader dr = cmd.ExecuteReader();
                dr.Read();
                if (dr[0].ToString() == "1")
                {
                    return "1";
                }
                else
                {
                    return dr[0].ToString();
                }
                dr.Close();
                cn.Close();
            }
        }
        catch (Exception ex)
        {
            return "Error : " + ex.Message.ToString();
        }
4

4 に答える 4

1

最初に、日付列が null 値を受け入れるかどうかを確認する必要があります。
そうでない場合は、null を許可します。

そして、あなたは使用することができます

command.Parameters.AddWithValue("@param", DBNull.Value);

すべてを組み合わせると、このようになります

 param[8] = new Service.SqlParameter();
 param[8].ParameterName = "@DOJ";
 param[8].Value = DOJ==null?DBNull.Value:DOJ;
 param[8].SqlDbType = Service.SqlDbType.DateTime;

そして、あなたの財産はこのようでなければなりません

public DateTime? DOJ
{
    get;
    set;
}
于 2013-02-22T06:21:57.373 に答える
1

コードを機能させるには、3 つの変更を加える必要があります。

変更 1:まず、DateTime 変数をDateTime にしますか?

public DateTime? DOB { get; set; }
public DateTime? DOJ { get; set; }

変更 2:代わりに DateTime.TryParse を使用する

DateTime DOB;
IFormatProvider provider = new System.Globalization.CultureInfo("en-CA", true);
String datetime = txtDOB.Text.Trim();
DateTime.TryParse(datetime, provider, System.Globalization.DateTimeStyles.NoCurrentDateDefault, out DOB);
if (DOB != DateTime.MinValue)
{
    objEmp.DOB = null; 
}
else
{
    objEmp.DOB = date;
}

DOJ についても同じことを行います。

変更 3:また、datetime の値が null の場合は、DOB の値を sql パラメータに代入するときに null チェックを行い、DOB が null の場合は代入するようにしてください。DBNull.Value

例えば ​​:

param[7].ParameterName = "@DOB";
if(DOB == null)
{
    param[7].Value = DBNull.Value;
}
else
{
    param[7].Value = DOB;   
}
param[7].SqlDbType = Service.SqlDbType.DateTime;

はい、Stackoverflow へようこそ!

于 2013-02-22T06:22:07.083 に答える
1

このコードは、SQLの日時フィールドにnull値を挿入するために機能します

cmd.Parameters.AddWithValue("@from_date", SqlDbType.DateTime).Value = DBNull.Value;
于 2013-05-14T07:10:07.907 に答える
0

プロパティを null 可能にする

public DateTime? DOB
    {
        get;
        set;
    }
    public DateTime? DOJ
    {
        get;
        set;
    }

コードを次のようにします

IFormatProvider provider = new System.Globalization.CultureInfo("en-CA", true);
        String datetime = txtDOB.Text.Trim();

if(DateTime.TryParse(datetime, provider, System.Globalization.DateTimeStyles.NoCurrentDateDefault, out date))
{
  objEmp.DOB = date;
}
于 2013-02-22T06:20:13.857 に答える