/// <summary>
        /// Gets the string to insert values into the SQL table.
        /// </summary>
        ///
        /// <remarks>
        /// <example>
        /// <code>
        /// INSERT INTO BCPTest VALUES
        /// (
        /// 'string',
        /// 'string',
        /// NULL,
        /// NULL
        /// ),
        /// (
        /// 'string',
        /// 'string',
        /// NULL,
        /// NULL
        /// )
        /// </code>
        /// </example>
        /// </remarks>
        ///
        /// <param name="columns">List of SQL types.</param>
        /// <param name="rows">Values.</param>
        /// <returns>SQL insert into table string.</returns>
        static private string GetInsertIntoString(List <IBCPSerialization> columns, IEnumerable <object> rows)
        {
            StringBuilder insertIntoString = new StringBuilder();

            if (rows.Count() == 0)
            {
                return(string.Empty);
            }

            insertIntoString.AppendLine("INSERT INTO BCPTest VALUES");

            for (int i = 0; i < rows.Count(); i++)
            {
                int modulo = i % columns.Count();
                if (modulo == 0 && i > 0)
                {
                    insertIntoString.AppendLine("),");
                }
                if (modulo > 0)
                {
                    insertIntoString.AppendLine(",");
                }
                if (modulo == 0)
                {
                    insertIntoString.Append("(");
                }

                IBCPSerialization column = columns[modulo];
                object            row    = rows.ElementAt(i);

                // FIXME Is there a better way than casting every type?
                // Don't forget to add new SQL types here and to modify the unit tests accordingly
                if (column is SQLBinary)
                {
                    SQLBinary sql   = (SQLBinary)column;
                    byte[]    value = (byte[])row;
                    if (value == null)
                    {
                        insertIntoString.Append("NULL");
                    }
                    else
                    {
                        insertIntoString.AppendFormat(
                            "CAST('{0}' AS binary({1}))",
                            Encoding.Default.GetString(value), sql.Length);
                    }
                }
                else if (column is SQLChar)
                {
                    string value = (string)row;
                    if (value == null)
                    {
                        insertIntoString.Append("NULL");
                    }
                    else
                    {
                        insertIntoString.AppendFormat("'{0}'", value);
                    }
                }
                else if (column is SQLInt)
                {
                    int?value = (int?)row;
                    if (!value.HasValue)
                    {
                        insertIntoString.Append("NULL");
                    }
                    else
                    {
                        insertIntoString.AppendFormat("{0}", value.Value);
                    }
                }
                else if (column is SQLNChar)
                {
                    string value = (string)row;
                    if (value == null)
                    {
                        insertIntoString.Append("NULL");
                    }
                    else
                    {
                        insertIntoString.AppendFormat("'{0}'", value);
                    }
                }
                else if (column is SQLNVarChar)
                {
                    string value = (string)row;
                    if (value == null)
                    {
                        insertIntoString.Append("NULL");
                    }
                    else
                    {
                        insertIntoString.AppendFormat("'{0}'", value);
                    }
                }
                else if (column is SQLVarBinary)
                {
                    SQLVarBinary sql   = (SQLVarBinary)column;
                    byte[]       value = (byte[])row;

                    if (value == null)
                    {
                        insertIntoString.Append("NULL");
                    }
                    else
                    {
                        if (sql.Length == SQLVarBinary.MAX)
                        {
                            insertIntoString.AppendFormat(
                                "CAST('{0}' AS varbinary(max))",
                                Encoding.Default.GetString(value));
                        }
                        else
                        {
                            insertIntoString.AppendFormat(
                                "CAST('{0}' AS varbinary({1}))",
                                Encoding.Default.GetString(value), sql.Length);
                        }
                    }
                }
                else if (column is SQLVarChar)
                {
                    string value = (string)row;
                    if (value == null)
                    {
                        insertIntoString.Append("NULL");
                    }
                    else
                    {
                        insertIntoString.AppendFormat("'{0}'", value);
                    }
                }
                else if (column is SQLNText)
                {
                    string value = (string)row;
                    if (value == null)
                    {
                        insertIntoString.Append("NULL");
                    }
                    else
                    {
                        insertIntoString.AppendFormat("'{0}'", value);
                    }
                }
                else if (column is SQLText)
                {
                    string value = (string)row;
                    if (value == null)
                    {
                        insertIntoString.Append("NULL");
                    }
                    else
                    {
                        insertIntoString.AppendFormat("'{0}'", value);
                    }
                }
                else if (column is SQLXml)
                {
                    XmlDocument value = (XmlDocument)row;
                    if (value == null)
                    {
                        insertIntoString.Append("NULL");
                    }
                    else
                    {
                        insertIntoString.AppendFormat("'{0}'", value.DocumentElement.OuterXml);
                    }
                }
                else if (column is SQLReal)
                {
                    float?value = (float?)row;
                    if (!value.HasValue)
                    {
                        insertIntoString.Append("NULL");
                    }
                    else
                    {
                        insertIntoString.AppendFormat("{0}", value.Value);
                    }
                }
                else if (column is SQLFloat)
                {
                    if (row is float)
                    {
                        // Don't treat null case here
                        float?value = (float?)row;
                        insertIntoString.AppendFormat("{0}", value.Value);
                    }
                    else
                    {
                        // If we don't know, let's cast it to double
                        // if value is null then double? will work, not float?
                        // More explanations inside SQLFloat
                        double?value = (double?)row;
                        if (!value.HasValue)
                        {
                            insertIntoString.Append("NULL");
                        }
                        else
                        {
                            insertIntoString.AppendFormat("{0}", value.Value);
                        }
                    }
                }
                else if (column is SQLUniqueIdentifier)
                {
                    Guid?value = (Guid?)row;
                    if (!value.HasValue)
                    {
                        insertIntoString.Append("NULL");
                    }
                    else
                    {
                        insertIntoString.AppendFormat("'{0}'", value.Value);
                    }
                }
                else if (column is SQLBigInt)
                {
                    long?value = (long?)row;
                    if (!value.HasValue)
                    {
                        insertIntoString.Append("NULL");
                    }
                    else
                    {
                        insertIntoString.AppendFormat("{0}", value.Value);
                    }
                }
                else if (column is SQLDateTime)
                {
                    DateTime?value = (DateTime?)row;
                    if (!value.HasValue)
                    {
                        insertIntoString.Append("NULL");
                    }
                    else
                    {
                        insertIntoString.AppendFormat("'{0}'", value.Value);
                    }
                }
                else if (column is SQLDateTime2)
                {
                    DateTime?value = (DateTime?)row;
                    if (!value.HasValue)
                    {
                        insertIntoString.Append("NULL");
                    }
                    else
                    {
                        insertIntoString.AppendFormat("'{0}'", value.Value);
                    }
                }
                else if (column is SQLDate)
                {
                    DateTime?value = (DateTime?)row;
                    if (!value.HasValue)
                    {
                        insertIntoString.Append("NULL");
                    }
                    else
                    {
                        insertIntoString.AppendFormat("'{0}'", value.Value);
                    }
                }
                else if (column is SQLTime)
                {
                    DateTime?value = (DateTime?)row;
                    if (!value.HasValue)
                    {
                        insertIntoString.Append("NULL");
                    }
                    else
                    {
                        insertIntoString.AppendFormat("'{0}'", value.Value);
                    }
                }
                else
                {
                    System.Diagnostics.Trace.Assert(false);
                }
            }

            insertIntoString.Append(")");

            return(insertIntoString.ToString());
        }
        /// <summary>
        /// Gets the string to create the SQL table.
        /// </summary>
        ///
        /// <remarks>
        /// <example>
        /// <code>
        /// CREATE TABLE BCPTest (
        /// col0 xml,
        /// col1 xml,
        /// col2 nvarchar(max),
        /// col3 varbinary(max)
        /// )
        /// </code>
        /// </example>
        /// </remarks>
        ///
        /// <param name="columns">List of SQL types.</param>
        /// <returns>SQL create table string.</returns>
        static private string GetCreateTableString(IEnumerable <IBCPSerialization> columns)
        {
            StringBuilder createTableString = new StringBuilder();

            createTableString.AppendLine("CREATE TABLE BCPTest (");

            int columnNumber = 0;

            foreach (IBCPSerialization column in columns)
            {
                createTableString.AppendFormat("col{0} ", columnNumber++);

                // FIXME Is there a better way than casting every type?
                // Don't forget to add new SQL types here and to modify the unit tests accordingly
                if (column is SQLBinary)
                {
                    SQLBinary sql = (SQLBinary)column;
                    createTableString.AppendFormat("binary({0})", sql.Length);
                }
                else if (column is SQLChar)
                {
                    SQLChar sql = (SQLChar)column;
                    createTableString.AppendFormat("char({0})", sql.Length);
                }
                else if (column is SQLInt)
                {
                    SQLInt sql = (SQLInt)column;
                    createTableString.Append("int");
                }
                else if (column is SQLNChar)
                {
                    SQLNChar sql = (SQLNChar)column;
                    createTableString.AppendFormat("nchar({0})", sql.Length);
                }
                else if (column is SQLNVarChar)
                {
                    SQLNVarChar sql = (SQLNVarChar)column;
                    if (sql.Length == SQLNVarChar.MAX)
                    {
                        createTableString.Append("nvarchar(max)");
                    }
                    else
                    {
                        createTableString.AppendFormat("nvarchar({0})", sql.Length);
                    }
                }
                else if (column is SQLVarBinary)
                {
                    SQLVarBinary sql = (SQLVarBinary)column;
                    if (sql.Length == SQLVarBinary.MAX)
                    {
                        createTableString.Append("varbinary(max)");
                    }
                    else
                    {
                        createTableString.AppendFormat("varbinary({0})", sql.Length);
                    }
                }
                else if (column is SQLVarChar)
                {
                    SQLVarChar sql = (SQLVarChar)column;
                    if (sql.Length == SQLVarChar.MAX)
                    {
                        createTableString.Append("varchar(max)");
                    }
                    else
                    {
                        createTableString.AppendFormat("varchar({0})", sql.Length);
                    }
                }
                else if (column is SQLNText)
                {
                    SQLNText sql = (SQLNText)column;
                    createTableString.Append("ntext");
                }
                else if (column is SQLText)
                {
                    SQLText sql = (SQLText)column;
                    createTableString.Append("text");
                }
                else if (column is SQLXml)
                {
                    SQLXml sql = (SQLXml)column;
                    createTableString.Append("xml");
                }
                else if (column is SQLReal)
                {
                    SQLReal sql = (SQLReal)column;
                    createTableString.Append("real");
                }
                else if (column is SQLFloat)
                {
                    SQLFloat sql = (SQLFloat)column;
                    createTableString.Append("float");
                }
                else if (column is SQLUniqueIdentifier)
                {
                    SQLUniqueIdentifier sql = (SQLUniqueIdentifier)column;
                    createTableString.Append("uniqueidentifier");
                }
                else if (column is SQLBigInt)
                {
                    SQLBigInt sql = (SQLBigInt)column;
                    createTableString.Append("bigint");
                }
                else if (column is SQLDateTime)
                {
                    SQLDateTime sql = (SQLDateTime)column;
                    createTableString.Append("datetime");
                }
                else if (column is SQLDateTime2)
                {
                    SQLDateTime2 sql = (SQLDateTime2)column;
                    createTableString.Append("datetime2");
                }
                else if (column is SQLDate)
                {
                    SQLDate sql = (SQLDate)column;
                    createTableString.Append("date");
                }
                else if (column is SQLTime)
                {
                    SQLTime sql = (SQLTime)column;
                    createTableString.Append("time");
                }
                else
                {
                    System.Diagnostics.Trace.Assert(false);
                }

                if (columnNumber < columns.Count())
                {
                    createTableString.AppendLine(",");
                }
            }

            createTableString.Append(")");

            return(createTableString.ToString());
        }
Beispiel #3
0
 /// <summary>
 /// Writes a SQL binary.
 /// </summary>
 public void WriteBinary(byte[] value, ushort length)
 {
     SQLBinary.Write(_writer, value, length);
 }