Make System.Web.Script.Serialization.JavaScriptSerializer.ConvertToType(Type, object...
[mono.git] / mcs / class / Npgsql / Npgsql / NpgsqlParameter.cs
old mode 100755 (executable)
new mode 100644 (file)
index 27c45fd..af0271f
@@ -1,23 +1,24 @@
 // created on 18/5/2002 at 01:25
 
 // Npgsql.NpgsqlParameter.cs
-// 
+//
 // Author:
 //     Francisco Jr. (fxjrlists@yahoo.com.br)
 //
 //     Copyright (C) 2002 The Npgsql Development Team
+//     npgsql-general@gborg.postgresql.org
+//     http://gborg.postgresql.org/project/npgsql/projdisplay.php
 //
-
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
 // License as published by the Free Software Foundation; either
 // version 2.1 of the License, or (at your option) any later version.
-// 
+//
 // This library is distributed in the hope that it will be useful,
 // but WITHOUT ANY WARRANTY; without even the implied warranty of
 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 // Lesser General Public License for more details.
-// 
+//
 // You should have received a copy of the GNU Lesser General Public
 // License along with this library; if not, write to the Free Software
 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
 using System;
 using System.Data;
+using System.ComponentModel;
+using NpgsqlTypes;
+
+#if WITHDESIGN
+using Npgsql.Design;
+#endif
+
 
 namespace Npgsql
 {
-       ///<summary>
-       /// This class represents a parameter to a command that will be sent to server
-       ///</summary>
-       public sealed class NpgsqlParameter : IDbDataParameter, IDataParameter
-       {
-       
-    // Logging related values
-    private static readonly String CLASSNAME = "NpgsqlParameter";
+    ///<summary>
+    /// This class represents a parameter to a command that will be sent to server
+    ///</summary>
+    #if WITHDESIGN
+    [TypeConverter(typeof(NpgsqlParameterConverter))]
+    #endif
     
-               // Fields to implement IDbDataParameter interface.
-               private byte                            precision;
-               private byte                            scale;
-               private Int32                           size;
-               
-               // Fields to implement IDataParameter
-               private DbType                          type;
-               private ParameterDirection      direction;
-               private Boolean                         is_nullable;
-               private String                          name;
-               private String                          source_column;
-               private DataRowVersion          source_version;
-               private Object                          value;
-               
-               
-               
-               // Constructors
-               // [TODO] Implement other constructors.
-               
-               public NpgsqlParameter()
-               {
-                       
-               }
-               
-               public NpgsqlParameter(String parameterName, DbType parameterType)
-               {
-                       name = parameterName;
-                       type = parameterType;
-               }
-               
-               public NpgsqlParameter(String parameterName, DbType parameterType, Int32 size, String sourceColumn)
-               {
-                       name = parameterName;
-                       type = parameterType;
-                       this.size = size;
-                       source_column = sourceColumn;
-                       direction = ParameterDirection.Input;
-               }
-               // Implementation of IDbDataParameter
-               
-               public Byte Precision
-               {
-                       get
-                       {
-                               return precision;
-                       }
-                       
-                       set
-                       {
-                               precision = value;
-                               NpgsqlEventLog.LogMsg("Set " + CLASSNAME + ".Precision = " + value, LogLevel.Normal);
-                       }
-               }
-               
-               public Byte Scale
-               {
-                       get
-                       {
-                               return scale;
-                       }
-                       
-                       set
-                       {
-                               scale = value;
-                               NpgsqlEventLog.LogMsg("Set " + CLASSNAME + ".Scale = " + value, LogLevel.Normal);
-                       }
-               }
-               
-               public Int32 Size
-               {
-                       get
-                       {
-                               return size;
-                       }
-                       
-                       set
-                       {
-                               size = value;
-                               NpgsqlEventLog.LogMsg("Set " + CLASSNAME + ".Size = " + value, LogLevel.Normal);
-                       }
-               }
-               
-               public DbType DbType
-               {
-                       get
-                       {
-                               return type;
-                       }
-                       
-                       // [TODO] Validate data type.
-                       set
-                       {
-                               type = value;
-                               NpgsqlEventLog.LogMsg("Set " + CLASSNAME + ".DbType = " + value, LogLevel.Normal);
-                       }
-               }
-               
-               public ParameterDirection Direction
-               {
-                       get
-                       {
-                               NpgsqlEventLog.LogMsg("Get " + CLASSNAME + ".Direction", LogLevel.Normal);
-                               return direction;
-                       }
-                       
-                       set
-                       {
-                               direction = value;
-                               NpgsqlEventLog.LogMsg("Set " + CLASSNAME + ".Direction = " + value, LogLevel.Normal);
-                       }
-               }
-               
-               public Boolean IsNullable
-               {
-                       get
-                       {
-                               return is_nullable;
-                       }
-                       
-                       set
-                       {
-                               is_nullable = value;
-                               NpgsqlEventLog.LogMsg("Set " + CLASSNAME + ".IsNullable = " + value, LogLevel.Normal);
-                       }
-               }
-               
-               public String ParameterName
-               {
-                       get
-                       {
-                               NpgsqlEventLog.LogMsg("Get " + CLASSNAME + ".ParameterName", LogLevel.Normal);
-                               return name;
-                       }
-                       
-                       set
-                       {
-                               name = value;
-                               NpgsqlEventLog.LogMsg("Set " + CLASSNAME + ".ParameterName = " + value, LogLevel.Normal);
-                       }
-               }
+    public sealed class NpgsqlParameter : MarshalByRefObject, IDbDataParameter, IDataParameter, ICloneable
+    {
+
+        // Logging related values
+        private static readonly String CLASSNAME = "NpgsqlParameter";
+
+        // Fields to implement IDbDataParameter interface.
+        private byte                               precision = 0;
+        private byte                               scale = 0;
+        private Int32                              size = 0;
+
+        // Fields to implement IDataParameter
+        //private NpgsqlDbType                             npgsqldb_type = NpgsqlDbType.Text;
+        //private DbType                    db_type = DbType.String;
+        private NpgsqlNativeTypeInfo   type_info;
+        private ParameterDirection         direction = ParameterDirection.Input;
+        private Boolean                                    is_nullable = false;
+        private String                             name = String.Empty;
+        private String                             source_column = String.Empty;
+        private DataRowVersion             source_version = DataRowVersion.Current;
+        private Object                             value = DBNull.Value;
+        private System.Resources.ResourceManager resman;
+        
+        
+        /// <summary>
+
+        /// Initializes a new instance of the <see cref="Npgsql.NpgsqlParameter">NpgsqlParameter</see> class.
+        /// </summary>
+        public NpgsqlParameter()
+        {
+            resman = new System.Resources.ResourceManager(this.GetType());
+            NpgsqlEventLog.LogMethodEnter(LogLevel.Debug, CLASSNAME, CLASSNAME);
+            //type_info = NpgsqlTypesHelper.GetNativeTypeInfo(typeof(String));
+        }
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="Npgsql.NpgsqlParameter">NpgsqlParameter</see>
+        /// class with the parameter name and a value of the new <b>NpgsqlParameter</b>.
+        /// </summary>
+        /// <param name="parameterName">The name of the parameter to map.</param>
+        /// <param name="value">An <see cref="System.Object">Object</see> that is the value of the <see cref="Npgsql.NpgsqlParameter">NpgsqlParameter</see>.</param>
+        /// <remarks>
+        /// <p>When you specify an <see cref="System.Object">Object</see>
+        /// in the value parameter, the <see cref="System.Data.DbType">DbType</see> is
+        /// inferred from the .NET Framework type of the <b>Object</b>.</p>
+        /// <p>When using this constructor, you must be aware of a possible misuse of the constructor which takes a DbType parameter.
+        /// This happens when calling this constructor passing an int 0 and the compiler thinks you are passing a value of DbType.
+        /// Use <code> Convert.ToInt32(value) </code> for example to have compiler calling the correct constructor.</p>
+        /// </remarks>
+        public NpgsqlParameter(String parameterName, object value)
+        {
+            resman = new System.Resources.ResourceManager(this.GetType());
+            NpgsqlEventLog.LogMethodEnter(LogLevel.Debug, CLASSNAME, CLASSNAME, parameterName, value);
+
+            this.ParameterName = parameterName;
+            this.value = value;
+
+            if ((this.value == null) || (this.value == DBNull.Value) )
+            {
+                // don't really know what to do - leave default and do further exploration
+                // Default type for null values is String.
+                this.value = DBNull.Value;
+                type_info = NpgsqlTypesHelper.GetNativeTypeInfo(typeof(String));
+                return;
+            }
+            else
+            {
+                type_info = NpgsqlTypesHelper.GetNativeTypeInfo(value.GetType());
+                if (type_info == null)
+                {
+                    throw new InvalidCastException(String.Format(resman.GetString("Exception_ImpossibleToCast"), value.GetType()));
+                }
+                
+                
+
+            }
+        }
                
-               public String SourceColumn 
+               /// <summary>
+               /// Internal constructor to handle parameter creation from CommandBuilder passing a NpgsqlNativeTypeInfo directly.
+               /// </summary>
+               internal NpgsqlParameter(String parameterName, NpgsqlNativeTypeInfo type_info)
                {
-                       get
-                       {
-                               NpgsqlEventLog.LogMsg(CLASSNAME + ".get_SourceColumn" + value, LogLevel.Normal);
-                               return source_column;
-                       }
+                       resman = new System.Resources.ResourceManager(this.GetType());
+                       NpgsqlEventLog.LogMethodEnter(LogLevel.Debug, CLASSNAME, CLASSNAME, parameterName, value, type_info);
                        
-                       set
-                       {
-                               source_column = value;
-                               NpgsqlEventLog.LogMsg("Set " + CLASSNAME + ".SourceColumn = " + value, LogLevel.Normal);
-                       }
-               }
-               
-               public DataRowVersion SourceVersion
-               {
-                       get
-                       {
-                               NpgsqlEventLog.LogMsg(CLASSNAME + ".get_SourceVersion = " + value, LogLevel.Normal);
-                               return source_version;
-                       }
+                       this.ParameterName = parameterName;
+            this.value = DBNull.Value;
                        
-                       set
-                       {
-                               source_version = value;
-                               NpgsqlEventLog.LogMsg("Set " + CLASSNAME + ".SourceVersion = " + value, LogLevel.Normal);
-                       }
+                       this.type_info = (type_info == null) ? NpgsqlTypesHelper.GetNativeTypeInfo(typeof(String)) : type_info;
                }
                
-               public Object Value
-               {
-                       get
-                       {
-                               NpgsqlEventLog.LogMsg("Get " + CLASSNAME + ".Value", LogLevel.Normal);
-                               return value;
-                       }
-                       
-                       // [TODO] Check and validate data type.
-                       set
-                       {
-                               this.value = value;
-                               NpgsqlEventLog.LogMsg("Set " + CLASSNAME + ".Value", LogLevel.Normal);
-                       }
-               }
-                               
-       }
+        /// <summary>
+        /// Initializes a new instance of the <see cref="Npgsql.NpgsqlParameter">NpgsqlParameter</see>
+        /// class with the parameter name and the data type.
+        /// </summary>
+        /// <param name="parameterName">The name of the parameter to map.</param>
+        /// <param name="parameterType">One of the <see cref="System.Data.DbType">DbType</see> values.</param>
+        public NpgsqlParameter(String parameterName, NpgsqlDbType parameterType) : this(parameterName, parameterType, 0, String.Empty)
+        {}
+
+
+        public NpgsqlParameter(String parameterName, DbType parameterType) : this(parameterName, NpgsqlTypesHelper.GetNativeTypeInfo(parameterType).NpgsqlDbType, 0, String.Empty)
+        {}
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="Npgsql.NpgsqlParameter">NpgsqlParameter</see>
+        /// class with the parameter name, the <see cref="System.Data.DbType">DbType</see>, and the size.
+        /// </summary>
+        /// <param name="parameterName">The name of the parameter to map.</param>
+        /// <param name="parameterType">One of the <see cref="System.Data.DbType">DbType</see> values.</param>
+        /// <param name="size">The length of the parameter.</param>
+        public NpgsqlParameter(String parameterName, NpgsqlDbType parameterType, Int32 size) : this(parameterName, parameterType, size, String.Empty)
+        {}
+
+        public NpgsqlParameter(String parameterName, DbType parameterType, Int32 size) : this(parameterName, NpgsqlTypesHelper.GetNativeTypeInfo(parameterType).NpgsqlDbType, size, String.Empty)
+        {}
+
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="Npgsql.NpgsqlParameter">NpgsqlParameter</see>
+        /// class with the parameter name, the <see cref="System.Data.DbType">DbType</see>, the size,
+        /// and the source column name.
+        /// </summary>
+        /// <param name="parameterName">The name of the parameter to map.</param>
+        /// <param name="parameterType">One of the <see cref="System.Data.DbType">DbType</see> values.</param>
+        /// <param name="size">The length of the parameter.</param>
+        /// <param name="sourceColumn">The name of the source column.</param>
+        public NpgsqlParameter(String parameterName, NpgsqlDbType parameterType, Int32 size, String sourceColumn)
+        {
+
+            resman = new System.Resources.ResourceManager(this.GetType());
+
+            NpgsqlEventLog.LogMethodEnter(LogLevel.Debug, CLASSNAME, CLASSNAME, parameterName, parameterType, size, source_column);
+
+            this.ParameterName = parameterName;
+            
+            type_info = NpgsqlTypesHelper.GetNativeTypeInfo(parameterType);
+            if (type_info == null)
+                throw new InvalidCastException(String.Format(resman.GetString("Exception_ImpossibleToCast"), parameterType));
+
+            this.size = size;
+            source_column = sourceColumn;
+
+
+        }
+
+        public NpgsqlParameter(String parameterName, DbType parameterType, Int32 size, String sourceColumn) : this(parameterName, NpgsqlTypesHelper.GetNativeTypeInfo(parameterType).NpgsqlDbType, size, sourceColumn)
+    {}
+
+
+
+        /// <summary>
+        /// Initializes a new instance of the <see cref="Npgsql.NpgsqlParameter">NpgsqlParameter</see>
+        /// class with the parameter name, the <see cref="System.Data.DbType">DbType</see>, the size,
+        /// the source column name, a <see cref="System.Data.ParameterDirection">ParameterDirection</see>,
+        /// the precision of the parameter, the scale of the parameter, a
+        /// <see cref="System.Data.DataRowVersion">DataRowVersion</see> to use, and the
+        /// value of the parameter.
+        /// </summary>
+        /// <param name="parameterName">The name of the parameter to map.</param>
+        /// <param name="parameterType">One of the <see cref="System.Data.DbType">DbType</see> values.</param>
+        /// <param name="size">The length of the parameter.</param>
+        /// <param name="sourceColumn">The name of the source column.</param>
+        /// <param name="direction">One of the <see cref="System.Data.ParameterDirection">ParameterDirection</see> values.</param>
+        /// <param name="isNullable"><b>true</b> if the value of the field can be null, otherwise <b>false</b>.</param>
+        /// <param name="precision">The total number of digits to the left and right of the decimal point to which
+        /// <see cref="Npgsql.NpgsqlParameter.Value">Value</see> is resolved.</param>
+        /// <param name="scale">The total number of decimal places to which
+        /// <see cref="Npgsql.NpgsqlParameter.Value">Value</see> is resolved.</param>
+        /// <param name="sourceVersion">One of the <see cref="System.Data.DataRowVersion">DataRowVersion</see> values.</param>
+        /// <param name="value">An <see cref="System.Object">Object</see> that is the value
+        /// of the <see cref="Npgsql.NpgsqlParameter">NpgsqlParameter</see>.</param>
+        public NpgsqlParameter (String parameterName, NpgsqlDbType parameterType, Int32 size, String sourceColumn, ParameterDirection direction, bool isNullable, byte precision, byte scale, DataRowVersion sourceVersion, object value)
+        {
+
+            resman = new System.Resources.ResourceManager(this.GetType());
+
+            this.ParameterName = parameterName;
+            this.Size = size;
+            this.SourceColumn = sourceColumn;
+            this.Direction = direction;
+            this.IsNullable = isNullable;
+            this.Precision = precision;
+            this.Scale = scale;
+            this.SourceVersion = sourceVersion;
+            this.Value = value;
+
+            if (this.value == null)
+            {
+                this.value = DBNull.Value;
+                type_info = NpgsqlTypesHelper.GetNativeTypeInfo(typeof(String));
+            }
+            else
+            {
+                type_info = NpgsqlTypesHelper.GetNativeTypeInfo(parameterType);
+                if (type_info == null)
+                    throw new InvalidCastException(String.Format(resman.GetString("Exception_ImpossibleToCast"), parameterType));
+            }
+
+        }
+
+        public NpgsqlParameter (String parameterName, DbType parameterType, Int32 size, String sourceColumn, ParameterDirection direction, bool isNullable, byte precision, byte scale, DataRowVersion sourceVersion, object value) : this(parameterName, NpgsqlTypesHelper.GetNativeTypeInfo(parameterType).NpgsqlDbType, size, sourceColumn, direction, isNullable, precision, scale, sourceVersion, value)
+    {}
+
+        // Implementation of IDbDataParameter
+        /// <summary>
+        /// Gets or sets the maximum number of digits used to represent the
+        /// <see cref="Npgsql.NpgsqlParameter.Value">Value</see> property.
+        /// </summary>
+        /// <value>The maximum number of digits used to represent the
+        /// <see cref="Npgsql.NpgsqlParameter.Value">Value</see> property.
+        /// The default value is 0, which indicates that the data provider
+        /// sets the precision for <b>Value</b>.</value>
+        [Category("Data"), DefaultValue((Byte)0)]
+        public Byte Precision
+        {
+            get
+            {
+                NpgsqlEventLog.LogPropertyGet(LogLevel.Debug, CLASSNAME, "Precision");
+                return precision;
+            }
+
+            set
+            {
+                NpgsqlEventLog.LogPropertySet(LogLevel.Normal, CLASSNAME, "Precision", value);
+                precision = value;
+            }
+        }
+
+        /// <summary>
+        /// Gets or sets the number of decimal places to which
+        /// <see cref="Npgsql.NpgsqlParameter.Value">Value</see> is resolved.
+        /// </summary>
+        /// <value>The number of decimal places to which
+        /// <see cref="Npgsql.NpgsqlParameter.Value">Value</see> is resolved. The default is 0.</value>
+        [Category("Data"), DefaultValue((Byte)0)]
+        public Byte Scale
+        {
+            get
+            {
+                NpgsqlEventLog.LogPropertyGet(LogLevel.Debug, CLASSNAME, "Scale");
+                return scale;
+            }
+
+            set
+            {
+                NpgsqlEventLog.LogPropertySet(LogLevel.Normal, CLASSNAME, "Scale", value);
+                scale = value;
+            }
+        }
+
+        /// <summary>
+        /// Gets or sets the maximum size, in bytes, of the data within the column.
+        /// </summary>
+        /// <value>The maximum size, in bytes, of the data within the column.
+        /// The default value is inferred from the parameter value.</value>
+        [Category("Data"), DefaultValue(0)]
+        public Int32 Size
+        {
+            get
+            {
+                NpgsqlEventLog.LogPropertyGet(LogLevel.Debug, CLASSNAME, "Size");
+                return size;
+            }
+
+            set
+            {
+                NpgsqlEventLog.LogPropertySet(LogLevel.Normal, CLASSNAME, "Size", value);
+                size = value;
+            }
+        }
+
+        /// <summary>
+        /// Gets or sets the <see cref="System.Data.DbType">DbType</see> of the parameter.
+        /// </summary>
+        /// <value>One of the <see cref="System.Data.DbType">DbType</see> values. The default is <b>String</b>.</value>
+        [Category("Data"), RefreshProperties(RefreshProperties.All), DefaultValue(DbType.String)]
+        public DbType DbType
+        {
+            get
+            {
+                NpgsqlEventLog.LogPropertyGet(LogLevel.Debug, CLASSNAME, "DbType");
+                return TypeInfo.DbType;
+            }
+
+            // [TODO] Validate data type.
+            set
+            {
+                NpgsqlEventLog.LogPropertySet(LogLevel.Normal, CLASSNAME, "DbType", value);
+                type_info = NpgsqlTypesHelper.GetNativeTypeInfo(value);
+                if (type_info == null)
+                    throw new InvalidCastException(String.Format(resman.GetString("Exception_ImpossibleToCast"), value));
+
+            }
+        }
+
+        /// <summary>
+        /// Gets or sets the <see cref="System.Data.DbType">DbType</see> of the parameter.
+        /// </summary>
+        /// <value>One of the <see cref="System.Data.DbType">DbType</see> values. The default is <b>String</b>.</value>
+        [Category("Data"), RefreshProperties(RefreshProperties.All), DefaultValue(NpgsqlDbType.Text)]
+        public NpgsqlDbType NpgsqlDbType
+        {
+            get
+            {
+                NpgsqlEventLog.LogPropertyGet(LogLevel.Debug, CLASSNAME, "DbType");
+
+                return TypeInfo.NpgsqlDbType;
+            }
+
+            // [TODO] Validate data type.
+            set
+            {
+                NpgsqlEventLog.LogPropertySet(LogLevel.Normal, CLASSNAME, "DbType", value);
+                type_info = NpgsqlTypesHelper.GetNativeTypeInfo(value);
+                if (type_info == null)
+                    throw new InvalidCastException(String.Format(resman.GetString("Exception_ImpossibleToCast"), value));
+
+            }
+        }
+
+
+
+        internal NpgsqlNativeTypeInfo TypeInfo
+        {
+            get
+            {
+               if (type_info == null)
+                       type_info = NpgsqlTypesHelper.GetNativeTypeInfo(typeof(String));
+                return type_info;
+            }
+        }
+
+        /// <summary>
+        /// Gets or sets a value indicating whether the parameter is input-only,
+        /// output-only, bidirectional, or a stored procedure return value parameter.
+        /// </summary>
+        /// <value>One of the <see cref="System.Data.ParameterDirection">ParameterDirection</see>
+        /// values. The default is <b>Input</b>.</value>
+        [Category("Data"), DefaultValue(ParameterDirection.Input)]
+        public ParameterDirection Direction
+        {
+            get
+            {
+                NpgsqlEventLog.LogPropertyGet(LogLevel.Normal, CLASSNAME, "Direction");
+                return direction;
+            }
+
+            set
+            {
+                NpgsqlEventLog.LogPropertySet(LogLevel.Normal, CLASSNAME, "Direction", value);
+                direction = value;
+            }
+        }
+
+        /// <summary>
+        /// Gets or sets a value indicating whether the parameter accepts null values.
+        /// </summary>
+        /// <value><b>true</b> if null values are accepted; otherwise, <b>false</b>. The default is <b>false</b>.</value>
+        
+        #if WITHDESIGN
+        [EditorBrowsable(EditorBrowsableState.Advanced), Browsable(false), DefaultValue(false), DesignOnly(true)]
+        #endif
+        
+        public Boolean IsNullable
+        {
+            get
+            {
+                NpgsqlEventLog.LogPropertyGet(LogLevel.Debug, CLASSNAME, "IsNullable");
+                return is_nullable;
+            }
+
+            set
+            {
+                NpgsqlEventLog.LogPropertySet(LogLevel.Normal, CLASSNAME, "IsNullable", value);
+                is_nullable = value;
+            }
+        }
+
+        /// <summary>
+        /// Gets or sets the name of the <see cref="Npgsql.NpgsqlParameter">NpgsqlParameter</see>.
+        /// </summary>
+        /// <value>The name of the <see cref="Npgsql.NpgsqlParameter">NpgsqlParameter</see>.
+        /// The default is an empty string.</value>
+        [DefaultValue("")]
+        public String ParameterName
+        {
+            get
+            {
+                NpgsqlEventLog.LogPropertyGet(LogLevel.Normal, CLASSNAME, "ParameterName");
+                return name;
+            }
+
+            set
+            {
+                name = value;
+                if (value == null)
+                    name = String.Empty;
+                if ( (name.Equals(String.Empty)) || ((name[0] != ':') && (name[0] != '@')) )
+                    name = ':' + name;
+
+                NpgsqlEventLog.LogPropertySet(LogLevel.Normal, CLASSNAME, "ParameterName", value);
+            }
+        }
+
+        /// <summary>
+        /// Gets or sets the name of the source column that is mapped to the
+        /// <see cref="System.Data.DataSet">DataSet</see> and used for loading or
+        /// returning the <see cref="Npgsql.NpgsqlParameter.Value">Value</see>.
+        /// </summary>
+        /// <value>The name of the source column that is mapped to the
+        /// <see cref="System.Data.DataSet">DataSet</see>. The default is an empty string.</value>
+        [Category("Data"), DefaultValue("")]
+        public String SourceColumn
+        {
+            get
+            {
+                NpgsqlEventLog.LogPropertyGet(LogLevel.Normal, CLASSNAME, "SourceColumn");
+                return source_column;
+            }
+
+            set
+            {
+                NpgsqlEventLog.LogPropertySet(LogLevel.Normal, CLASSNAME, "SourceColumn", value);
+                source_column = value;
+            }
+        }
+
+        /// <summary>
+        /// Gets or sets the <see cref="System.Data.DataRowVersion">DataRowVersion</see>
+        /// to use when loading <see cref="Npgsql.NpgsqlParameter.Value">Value</see>.
+        /// </summary>
+        /// <value>One of the <see cref="System.Data.DataRowVersion">DataRowVersion</see> values.
+        /// The default is <b>Current</b>.</value>
+        [Category("Data"), DefaultValue(DataRowVersion.Current)]
+        public DataRowVersion SourceVersion
+        {
+            get
+            {
+                NpgsqlEventLog.LogPropertyGet(LogLevel.Normal, CLASSNAME, "SourceVersion");
+                return source_version;
+            }
+
+            set
+            {
+                NpgsqlEventLog.LogPropertySet(LogLevel.Normal, CLASSNAME, "SourceVersion", value);
+                source_version = value;
+            }
+        }
+
+        /// <summary>
+        /// Gets or sets the value of the parameter.
+        /// </summary>
+        /// <value>An <see cref="System.Object">Object</see> that is the value of the parameter.
+        /// The default value is null.</value>
+        [TypeConverter(typeof(StringConverter)), Category("Data")]
+        public Object Value
+        {
+            get
+            {
+                NpgsqlEventLog.LogPropertyGet(LogLevel.Normal, CLASSNAME, "Value");
+                return value;
+            }
+
+            // [TODO] Check and validate data type.
+            set
+            {
+                NpgsqlEventLog.LogPropertySet(LogLevel.Normal, CLASSNAME, "Value", value);
+
+                this.value = value;
+                if ((this.value == null) || (this.value == DBNull.Value) )
+                {
+                    // don't really know what to do - leave default and do further exploration
+                    // Default type for null values is String.
+                    this.value = DBNull.Value;
+                    if (type_info == null)
+                        type_info = NpgsqlTypesHelper.GetNativeTypeInfo(typeof(String));
+
+                }
+                else
+                {
+                    if (type_info == null)
+                    {
+                        type_info = NpgsqlTypesHelper.GetNativeTypeInfo(value.GetType());
+                        if (type_info == null)
+                               throw new InvalidCastException(String.Format(resman.GetString("Exception_ImpossibleToCast"), value.GetType()));
+                        
+                    }
+
+                }
+            }
+        }
+
+        /// <summary>
+        /// Creates a new <see cref="Npgsql.NpgsqlParameter">NpgsqlParameter</see> that
+        /// is a copy of the current instance.
+        /// </summary>
+        /// <returns>A new <see cref="Npgsql.NpgsqlParameter">NpgsqlParameter</see> that is a copy of this instance.</returns>
+        object System.ICloneable.Clone()
+        {
+            return new NpgsqlParameter(this.ParameterName, this.NpgsqlDbType,  this.Size, this.SourceColumn, this.Direction, this.IsNullable, this.Precision, this.Scale, this.SourceVersion, this.Value);
+        }
+
+
+    }
 }