示例#1
0
        public static void addColumn(string table, string column, SqlDbType type,
                                     Nullable <int> size, object columnValue)
        {
            if (SqlCeUtilities.columnExists(table, column))
            {
                return;
            }

            string addColumnSql = "ALTER TABLE [" + table + "] ADD COLUMN [" + column + "] " +
                                  getSqlType(type, size);
            string updateColumnSql = "UPDATE [" + table + "] SET [" + column + "] = @" +
                                     column;

            SqlCeCommand addColumnCommand    = new SqlCeCommand(addColumnSql);
            SqlCeCommand updateColumnCommand = new SqlCeCommand(updateColumnSql);

            if (size != null)
            {
                updateColumnCommand.Parameters.Add("@" + column, type, size.Value).Value = columnValue;
            }
            else
            {
                updateColumnCommand.Parameters.Add("@" + column, type).Value = columnValue;
            }

            SqlCeConnection  conn   = new SqlCeConnection(ConfigurationParameters.ConnectionString);
            string           errMsg = "Neuspesna promena baze.";
            SqlCeTransaction tr     = null;

            try
            {
                conn.Open();
                tr = conn.BeginTransaction();

                addColumnCommand.Connection  = conn;
                addColumnCommand.Transaction = tr;
                addColumnCommand.ExecuteNonQuery();

                updateColumnCommand.Connection  = conn;
                updateColumnCommand.Transaction = tr;
                updateColumnCommand.ExecuteNonQuery();

                tr.Commit();
            }
            catch (SqlCeException e)
            {
                // in Open()
                if (tr != null)
                {
                    tr.Rollback(); // TODO: this can throw Exception and InvalidOperationException
                }
                throw new InfrastructureException(errMsg, e);
            }
            catch (InvalidOperationException e)
            {
                // in ExecuteNonQuery(), ExecureScalar()
                if (tr != null)
                {
                    tr.Rollback();
                }
                throw new InfrastructureException(errMsg, e);
            }
            // za svaki slucaj
            catch (Exception)
            {
                if (tr != null)
                {
                    tr.Rollback();
                }
                throw;
            }
            finally
            {
                conn.Close();
            }
        }