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
184 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
5 Comments
 
LVL 7

Expert Comment

by:jackiechen858
ID: 12088952
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
ID: 12090008
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
ID: 12091276
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
ID: 12096344
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
ID: 12102885
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

Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

This article describes relatively difficult and non-obvious issues that are likely to arise when creating COM class in Visual Studio and deploying it by professional MSI-authoring tools. It is assumed that the reader is already familiar with the cla…
Wouldn’t it be nice if you could test whether an element is contained in an array by using a Contains method just like the one available on List objects? Wouldn’t it be good if you could write code like this? (CODE) In .NET 3.5, this is possible…
Nobody understands Phishing better than an anti-spam company. That’s why we are providing Phishing Awareness Training to our customers. According to a report by Verizon, only 3% of targeted users report malicious emails to management. With compan…
The Email Laundry PDF encryption service allows companies to send confidential encrypted  emails to anybody. The PDF document can also contain attachments that are embedded in the encrypted PDF. The password is randomly generated by The Email Laundr…

726 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