why DataColumn AllowDbNull is true even if oracle db does not allow null
- by matti
Hi. I have column SomeId in table SomeLink. When I look with tOra or Sql Plus Worksheet both state:
tOra:
Column name     Data type   Default   Null      Comment
SOMEID          INTEGER     {null}    NOT NULL   {null}
Sql Plus:
SOMEID      NOT NULL NUMBER(38)
I have authored a method that's intended to give default values to all NOT NULL fields that don't have values:
public static void GetDefaultValuesForNonNullColumns(DataRow row)
{
    foreach(DataColumn col in row.Table.Columns)
    {
        if (Convert.IsDBNull(row[col]) && !col.AllowDBNull)
        {
            if (ColumnIsNumeric(col.DataType))
                row[col] = 0;
            else if (col.DataType == typeof(DateTime))
                row[col] = DateTime.Now;
            else if (col.DataType == typeof(String))
                row[col] = string.Empty;
            else if (col.DataType == typeof(Char))
                row[col] = ' ';
            else 
                throw new Exception(string.Format("Unsupported column type: {0}", col.DataType));
        }
    }   
}
When SOMEID is handled in loop the AllowDBNull = true.
I really can't understand. The table is created in DataSet like this:
_someLinkAdptr = _dbFactory.CreateDataAdapter();
_someLinkAdptr.SelectCommand = _dbFactory.CreateCommand();
_someLinkAdptr.SelectCommand.Connection = _cnctn;
_someLinkAdptr.SelectCommand.CommandText = GetSomeLinkSelectTxtAndParams(_someLinkAdptr.SelectCommand, 
                            UndefinedValue.ToString(), UndefinedValue.ToString());
Select command returns no rows. The idea is that I can then use commandbuilder to get InsertCommand without building it myself. The row is added to dataset's table like this:
private static void CreateDocLink(int anId, int anotherId)
{
    DataRow row = _someDataSet.Tables["SomeLink"].NewRow();
    row["AnId"] = anId;
    row["AnotherId"] = anotherId;
    Utility.GetDefaultValuesForNonNullColumns(row);
    _someDataSet.Tables["SomeLink"].Rows.Add(row);
}
When DataAdapter is updated to oracle db I get:
ORA-01400: cannot insert NULL into (SOMESCHEMA.SOMELINK.SOMEID)
Cheers & BR -Matti