Solved

Deafulting int and float Index values to Null instead of 0 when data entry user enters leaves the field blank through screen

Posted on 2004-09-17
5
180 Views
Last Modified: 2012-05-05
Can anybody please help me how to get rid of this problem the values are defaulting to value '0' when data entry user leaves the field blank with this below code.
I need to leave as Nulls in the database values. the feilds in the dtabase are set Allow Null set to Yes.

using System;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using CSIFramework;
using CSIFramework.Database;

namespace EasyAccess.Framework
{
     /// <summary>
     /// IndexValue Data Layer Class
     /// </summary>
     public class IndexValue : IDataLayerModifiable
     {
          #region Private Members
          private Int64 m_iIndexValueID = -1;
          private IndexName m_inIndexName;
          private Int64 m_iDocID = -1;

          private string m_strStringVal = null;
          private Int64 m_intIntVal = 0;
          private double m_dblFloatVal = 0;
          private DateTime m_dtDateVal = new DateTime(0);


          private DateTime     m_dtCreateDate     = new DateTime(0);
          private long          m_lngCreatedBy     = 0;
          private DateTime     m_dtModifyDate     = new DateTime(0);
          private long          m_lngModifiedBy     = 0;

        private string          m_strConnection = "";

          private DataProvider provider = null;


          #endregion

          #region Constructors

          /// <summary>
          /// ctor used for adding a new IndexValue, etc, when IndexValue is not available from database
          /// </summary>
          /// <param name="strConnection"></param>
          public IndexValue(string strConnection)
          {
               m_strConnection = strConnection;
               provider = new DataProvider(m_strConnection, DataProvider.DBType.SqlServer);
          }


          /// <summary>
          /// ctor used for adding a new IndexValue, when IndexName is established
          /// </summary>
          /// <param name="inSelected"></param>
          /// <param name="strConnection"></param>
          public IndexValue(IndexName inSelected, string strConnection) : this(strConnection)
          {
               m_strConnection = strConnection;
               provider = new DataProvider(m_strConnection, DataProvider.DBType.SqlServer);
               IndexName = inSelected;
          }
          /// <summary>
          /// ctor initializing IndexValue based on IndexValueID and connection
          /// </summary>
          /// <param name="iIndexValueID"></param>
          /// <param name="strConnection"></param>
          public IndexValue(Int64 iIndexValueID, string strConnection) : this(strConnection)
          {
               m_iIndexValueID = iIndexValueID;
               Load();
          }

          #endregion

          #region Properties

          /// <summary>
          /// Index value is editable by default, but can be made readonly
          /// </summary>
          public bool Editable = true;

          /// <summary>
          /// IndexValueID field
          /// </summary>
          public Int64 IndexValueID
          {
               get { return m_iIndexValueID; }
               set { m_iIndexValueID = value; }
          }
          /// <summary>
          /// Referenced IndexName member
          /// </summary>
          public IndexName IndexName
          {
               get { return m_inIndexName; }
               set { m_inIndexName = value; }
          }

          /// <summary>
          /// DocID field
          /// </summary>
          public Int64 DocID
          {
               get { return m_iDocID; }
               set { m_iDocID = value; }
          }


          /// <summary>
          /// Gets or Sets Value of Index based on Variable Type
          /// </summary>
          public object Value
          {
               get
               {
                    object val = null;//null if all null
                    if (m_strStringVal != null)
                         val = m_strStringVal;
                    else if(m_intIntVal != 0)
                         val = m_intIntVal;
                    else if(m_dblFloatVal != 0)
                         val = m_dblFloatVal;
                    else if(m_dtDateVal != DateTime.MinValue)
                         val = m_dtDateVal;
                    return val;
               }
               set
               {
                    switch(IndexName.IndexType)
                    {
                         case IndexType.String:
                              if (value.ToString()!=null)
                                   m_strStringVal = Convert.ToString(value);
                              break;
                         case IndexType.Int:
                              if (value.ToString()!=null && value.ToString()!=string.Empty)
                                   m_intIntVal = Convert.ToInt32(value);
                              break;
                         case IndexType.Float:
                              if (value.ToString()!=null && value.ToString()!=string.Empty)
                                   m_dblFloatVal = Convert.ToDouble(value);
                              break;
                         case IndexType.DateTime:
                              if (value.ToString()!=null && value.ToString()!=string.Empty)
                                   m_dtDateVal = Convert.ToDateTime(value);
                              else
                                   m_dtDateVal = System.DateTime.Now;//workaround for SQL Server not accepting dates less than 1753
                              break;
                         default:
                              throw new Exception("Unknown IndexType: " + IndexName.IndexType.ToString());
                    }
               }
          }

          #endregion

          #region IDataLayer Members

          /// <summary>
          /// CreateDate field
          /// </summary>
          public virtual DateTime CreateDate
          {
               get { return m_dtCreateDate; }
          }

          /// <summary>
          /// CreatedBy field
          /// </summary>
          public virtual long CreatedBy
          {
               get { return m_lngCreatedBy; }
               set { m_lngCreatedBy = value; }
          }

          /// <summary>
          /// ModifyDate field
          /// </summary>
          public virtual DateTime ModifyDate
          {
               get { return m_dtModifyDate; }
               set { m_dtModifyDate = value; }
          }

          /// <summary>
          /// ModifiedBy field
          /// </summary>
          public virtual long ModifiedBy
          {
               get { return m_lngModifiedBy; }
               set { m_lngModifiedBy = value; }
          }
         
          /// <summary>
          /// Loads IndexValue from Database assuming an IndexValueID
          /// </summary>
          public void Load()
          {
               if (m_iIndexValueID > 0)
               {
                    IDataReader dr = null;
                    try
                    {
                         SqlParameter [] param=new SqlParameter[1]; // number of parameters
                         param[0] = new SqlParameter("@IndexValueID",m_iIndexValueID);
                         dr = provider.ExecuteReader("usp_IndexValueGetByID",param);
                         if (dr.Read())
                         {
                              m_iIndexValueID = dr.GetInt64(0);
                              m_inIndexName = new IndexName(dr.GetInt32(1),m_strConnection);
                              m_iDocID = dr.GetInt64(2);
                              //these fields are null-permitted
                              if (!dr.IsDBNull(3))
                                   m_strStringVal = dr.GetString(3);
                              if (!dr.IsDBNull(4))
                                   m_intIntVal = dr.GetInt64(4);
                              if (!dr.IsDBNull(5))
                                   m_dblFloatVal = dr.GetDouble(5);//SQL float gets mapped to .NET double
                              if (!dr.IsDBNull(6))
                                   m_dtDateVal = dr.GetDateTime(6);

                              m_dtCreateDate     = dr.GetDateTime(7);
                              m_lngCreatedBy     = dr.GetInt32(8);
                              m_dtModifyDate     = dr.GetDateTime(9);
                              m_lngModifiedBy     = dr.GetInt32(10);

                              Editable =     dr.GetBoolean(11);
                         }
                         else
                         {
                              throw new CSIException("IndexValue", "Load()", "Record for IndexValueID " + m_iIndexValueID + " not found.");
                         }
                    }
                    catch(Exception ex)
                    {
                         throw new CSIException("IndexValue", "Load()", ex.Message);
                    }
                    finally
                    {
                         if (!dr.IsClosed)
                         {
                              dr.Close();
                         }
                         dr = null;
                    }
               }
               else
               {
                    throw new CSIException( "IndexValue", "Load()", "Invalid IndexValueID, unable to load: " + m_iIndexValueID);
               }
          }

          /// <summary>
          /// Loads IndexValue from Database based on an IndexValueID
          /// </summary>
          /// <param name="iIndexValueID"></param>
          public void Load(int iIndexValueID)
          {
               m_iIndexValueID = iIndexValueID;
               Load();
          }
         
          /// <summary>
          /// Resets IndexValue
          /// </summary>
          public void Clear( )
          {
               m_iIndexValueID = -1;
               IndexName = null;
               m_iDocID = -1;
               m_strStringVal = string.Empty;
               m_intIntVal = 0;
               m_dblFloatVal = 0;
               m_dtDateVal = new DateTime(0);
               
               m_dtCreateDate     = new DateTime(0);
               m_lngCreatedBy     = 0;
               m_dtModifyDate     = new DateTime(0);
               m_lngModifiedBy     = 0;
          }

          #endregion

          #region IDataLayerModifiable Members

          /// <summary>
          /// Adds a new IndexValue to database
          /// </summary>
          public void Add( )
          {
               if (IndexName !=null && Editable)
               {
                    try
                    {
                         /*
                              CREATE PROCEDURE usp_IndexValueAdd
                              (
                                   @IndexNameID INT,
                                   @DocID BIGINT,
                                   @StringVal VARCHAR(2000) = NULL,
                                   @IntVal BIGINT = NULL,
                                   @FloatVal FLOAT = NULL,
                                   @DateVal DATETIME = NULL,
                                   @UserID INT
                              ) AS
                         */

                         SqlParameter [] param=new SqlParameter[8]; // number of parameters
                         
                         param[0] = new SqlParameter("@IndexNameID",m_inIndexName.IndexNameID);
                         param[1] = new SqlParameter("@DocID", m_iDocID);
                         param[2] = new SqlParameter("@StringVal",m_inIndexName.IndexType!=IndexType.String?(object)DBNull.Value:m_strStringVal);
                         param[3] = new SqlParameter("@IntVal", m_inIndexName.IndexType!=IndexType.Int?(object)DBNull.Value:m_intIntVal);
                         param[4] = new SqlParameter("@FloatVal",m_inIndexName.IndexType!=IndexType.Float?(object)DBNull.Value:m_dblFloatVal);
                         //param[3] = new SqlParameter("@IntVal", m_inIndexName.IndexType!=IndexType.Int?(object)DBNull.Value:null);
                         //param[4] = new SqlParameter("@FloatVal",m_inIndexName.IndexType!=IndexType.Float?(object)DBNull.Value:null);
                         param[5] = new SqlParameter("@DateVal", m_inIndexName.IndexType!=IndexType.DateTime?(object)DBNull.Value:Convert.ToDateTime(m_dtDateVal.ToShortDateString()));
                         param[6] = new SqlParameter("@UserID", m_lngCreatedBy);
                         
                         param[7] = new SqlParameter( "@ReturnValue", SqlDbType.Int, 4, ParameterDirection.ReturnValue, false, 0, 0, string.Empty, DataRowVersion.Default, null);
                         

                         provider.ExecuteNonQuery("usp_IndexValueAdd",param);
                   
                         m_iIndexValueID = Convert.ToInt64(param[7].Value);
                         //re-read values
                         Load();

                    }
                   
                    catch(Exception ex)
                    {
                         throw new CSIException("IndexValue", "Add()", ex.Message);
                    }
                    finally
                    {
                         
                    }

               }
               else
               {
                    throw new CSIException( "IndexValue", "Add()", "Invalid IndexName, unable to add: " + IndexName);
               }
          }

          /// <summary>
          /// Updates current IndexValue in the Database and refreshes itself
          /// </summary>
          public void Update()
          {
               if (m_iIndexValueID > 0 && Editable)
               {
                    try
                    {
                         /*
                         *    
                              CREATE PROCEDURE usp_IndexValueUpdate
                              (
                                   @IndexValueID BIGINT,
                                   @IndexNameID INT,
                                   @DocID BIGINT,
                                   @StringVal VARCHAR(2000) = NULL,
                                   @IntVal BIGINT = NULL,
                                   @FloatVal FLOAT = NULL,
                                   @DateVal DATETIME = NULL,
                                   @UserID INT
                              ) AS
                         */

                         SqlParameter [] param=new SqlParameter[8]; // number of parameters
                         
                         param[0] = new SqlParameter("@IndexValueID",m_iIndexValueID);
                         param[1] = new SqlParameter("@IndexNameID",m_inIndexName.IndexNameID);
                         param[2] = new SqlParameter("@DocID", m_iDocID);

                         param[3] = new SqlParameter("@StringVal",m_inIndexName.IndexType!=IndexType.String?(object)DBNull.Value:m_strStringVal);
                         param[4] = new SqlParameter("@IntVal", m_inIndexName.IndexType!=IndexType.Int?(object)DBNull.Value:m_intIntVal);
                         param[5] = new SqlParameter("@FloatVal",m_inIndexName.IndexType!=IndexType.Float?(object)DBNull.Value:m_dblFloatVal);
                         param[6] = new SqlParameter("@DateVal", m_inIndexName.IndexType!=IndexType.DateTime?(object)DBNull.Value:m_dtDateVal);

                         param[7] = new SqlParameter("@UserID", m_lngModifiedBy);

                         provider.ExecuteNonQuery("usp_IndexValueUpdate",param);
                   
                         //re-read values
                         Load();

                    }
                   
                    catch(Exception ex)
                    {
                         throw new CSIException("IndexValue", "Update()", ex.Message);
                    }
                    finally
                    {
                         
                    }

               }
               else
               {
                    throw new CSIException( "IndexValue", "Update()", "Invalid IndexValueID, unable to update: " + m_iIndexValueID);
               }
          }
          /// <summary>
          /// Deletes an IndexValue assuming IndexValueID
          /// </summary>
          public void Delete( )
          {
               //TODO: Finish Delete()
               return;
          }

          #endregion

          #region IDisposable Members

          public virtual void Dispose()
          {
               //Dispose of any objects
          }

          #endregion

          #region Overloaded Methods
          /// <summary>
          /// When the object is implicitly converted to string, ToString is called
          /// </summary>
          /// <returns>contents of the object</returns>
          public override string ToString()
          {
                return "IndexValue: " + (m_iIndexValueID==-1?Constants.NULL:Convert.ToString(m_iIndexValueID)) +
                         " IndexName: [" +  m_inIndexName + "]" +
                         " DocID: " +  (m_iDocID==-1?Constants.NULL:Convert.ToString(m_iDocID)) +
                         
                         " StringVal: " + (m_inIndexName.IndexType!=IndexType.String?Constants.NULL:Convert.ToString(m_strStringVal)) +
                         " IntVal: " + (m_inIndexName.IndexType!=IndexType.Int?Constants.NULL:Convert.ToString(m_intIntVal)) +
                         " FloatVal: " + (m_inIndexName.IndexType!=IndexType.Float?Constants.NULL:Convert.ToString(m_dblFloatVal)) +
                         " DateVal: " + (m_inIndexName.IndexType!=IndexType.DateTime?Constants.NULL:Convert.ToString(m_dtDateVal)) +

                         " CreateDate: " + (m_dtCreateDate==new DateTime(0)?Constants.NULL:Convert.ToString(m_dtCreateDate)) +
                         " CreatedBy: " + (m_lngCreatedBy==0?Constants.NULL:Convert.ToString(m_lngCreatedBy)) +
                         " ModifyDate: " + (m_dtModifyDate==new DateTime(0)?Constants.NULL:Convert.ToString(m_dtModifyDate)) +
                        " ModifiedBy: " + (m_lngModifiedBy==0?Constants.NULL:Convert.ToString(m_lngModifiedBy)) +
                         " Editable: " + Editable;
          }
          #endregion

     }
}


I'll really appreciate your help.
It is kind of urgent.

Thanks
Manasa
0
Comment
Question by:manasa355
5 Comments
 
LVL 7

Expert Comment

by:jackiechen858
Comment Utility
can't you change the feild value in the store precedure? I think it's much easy.

if ( @filed = 0)
    @field = null
0
 
LVL 9

Expert Comment

by:tinchos
Comment Utility
Hi Manasa

int and floats cannot take null values.

Instead what you can do is to set them with -1 as a value, or any other invalid entry and when parsing the data entry use

int data = -1;

(data == -1)? NULL : data;

something like this

hope this helps

Tincho

0
 
LVL 7

Expert Comment

by:jackiechen858
Comment Utility
It can be done on the SQL server end.

CREATE TABLE [dbo].[t1] (
      [f1] [int] NULL
)
GO

CREATE PROCEDURE sp_testvalue
      @f1 INT
AS
if ( @f1=0)
    select @f1=null
insert into t1 (f1) values ( @f1)
GO

exec sp_testvalue 0


0
 
LVL 28

Expert Comment

by:mmarinov
Comment Utility
Hi jackiechen858,

there is another approach:
a standart procedure in such cases is to use ( for every parameter ) - add an aditional parameter
this parameter is used to tell if the parameter for which is user has to be get on the insert/update query or not

example :

create procedure spInsert
(
    @par [int] = Null
    @par_default [bit] = 0
)
as

update tablename
set
    [par_column] = Case @par_default when 0 Then IsNull (@par, [par_column]) When 1 Then @par End

this will update with value of @par when par_default is 1 and when it is 0 it will keeps the value from the table

B..M
0
 
LVL 15

Accepted Solution

by:
praneetha earned 485 total points
Comment Utility
Hi,

i hope this is what you are looking for...

if(m_intIntVal.ToString().Length!=0)
myCommand.Parameters.Add("@m_intIntVal", SqlDbType.Int)Value = m_intIntVal.ToString(). ;
else
myCommand.Parameters.Add("@m_intIntVal", SqlDbType.Int).Value = Convert.DBNull;

if user did not enter anything on the screen then length of it is zero...then you pass Convert.DBNull as an parameter value...

this is the C# code...i hope you can convert this to vb.net...

good luck
0

Featured Post

Find Ransomware Secrets With All-Source Analysis

Ransomware has become a major concern for organizations; its prevalence has grown due to past successes achieved by threat actors. While each ransomware variant is different, we’ve seen some common tactics and trends used among the authors of the malware.

Join & Write a Comment

Suggested Solutions

Flash (http://en.wikipedia.org/wiki/Adobe_Flash) has evolved over the years to where it has become a masterful tool for displaying content screen.  It has excellent layout placement, UI precision as well as rendering capabilities. This, along with t…
For those of you who don't follow the news, or just happen to live under rocks, Microsoft Research released a beta SDK (http://www.microsoft.com/en-us/download/details.aspx?id=27876) for the Xbox 360 Kinect. If you don't know what a Kinect is (http:…
This video gives you a great overview about bandwidth monitoring with SNMP and WMI with our network monitoring solution PRTG Network Monitor (https://www.paessler.com/prtg). If you're looking for how to monitor bandwidth using netflow or packet s…
When you create an app prototype with Adobe XD, you can insert system screens -- sharing or Control Center, for example -- with just a few clicks. This video shows you how. You can take the full course on Experts Exchange at http://bit.ly/XDcourse.

743 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

15 Experts available now in Live!

Get 1:1 Help Now