예제 #1
0
        private PreparedSqliteInsertCommand CreateInsertCommand(SQLiteConnection conn, string extra)
        {
            Column[] cols = this.InsertColumns;
            string   insertSql;

            if (!cols.Any() && this.Columns.Count() == 1 && this.Columns[0].IsAutoInc)
            {
                insertSql = string.Format("insert {1} into \"{0}\" default values", this.TableName, extra);
            }
            else
            {
                bool replacing = string.Compare(extra, "OR REPLACE", StringComparison.OrdinalIgnoreCase) == 0;

                if (replacing)
                {
                    cols = this.InsertOrReplaceColumns;
                }

                insertSql = string.Format("insert {3} into \"{0}\"({1}) values ({2})", this.TableName,
                                          string.Join(",", (from c in cols select "\"" + c.Name + "\"").ToArray()),
                                          string.Join(",", (from c in cols select "?").ToArray()), extra);
            }

            PreparedSqliteInsertCommand insertCommand = new PreparedSqliteInsertCommand(conn);

            insertCommand.CommandText = insertSql;
            return(insertCommand);
        }
예제 #2
0
 protected internal void Dispose()
 {
     if (_insertCommand != null)
     {
         _insertCommand.Dispose();
         _insertCommand = null;
     }
 }
예제 #3
0
        public int Insert(object obj, string extra, Type objType)
        {
            if (obj == null || objType == null)
            {
                return(0);
            }

            TableMapping map = GetMapping(objType);

            if (map.PK != null && map.PK.IsAutoGuid)
            {
                PropertyInfo prop = objType.GetProperty(map.PK.PropertyName);
                if (prop != null)
                {
                    if (prop.GetValue(obj, null).Equals(Guid.Empty))
                    {
                        prop.SetValue(obj, Guid.NewGuid(), null);
                    }
                }
            }

            bool replacing = string.Compare(extra, "OR REPLACE", StringComparison.OrdinalIgnoreCase) == 0;

            TableMapping.Column[] cols = replacing ? map.InsertOrReplaceColumns : map.InsertColumns;
            object[] vals = new object[cols.Length];
            for (int i = 0; i < vals.Length; i++)
            {
                vals[i] = cols[i].GetValue(obj);
            }

            PreparedSqliteInsertCommand insertCmd = map.GetInsertCommand(this, extra);
            int count;

            try {
                count = insertCmd.ExecuteNonQuery(vals);
            } catch (SQLiteException ex) {
                if (SQLite3.ExtendedErrCode(this.Handle) == SQLite3.ExtendedResult.ConstraintNotNull)
                {
                    throw NotNullConstraintViolationException.New(ex.Result, ex.Message, map, obj);
                }
                throw;
            }

            if (map.HasAutoIncPK)
            {
                long id = SQLite3.LastInsertRowid(this.Handle);
                map.SetAutoIncPK(obj, id);
            }

            return(count);
        }
예제 #4
0
        public PreparedSqliteInsertCommand GetInsertCommand(SQLiteConnection conn, string extra)
        {
            if (_insertCommand == null)
            {
                _insertCommand      = CreateInsertCommand(conn, extra);
                _insertCommandExtra = extra;
            }
            else if (_insertCommandExtra != extra)
            {
                _insertCommand.Dispose();
                _insertCommand      = CreateInsertCommand(conn, extra);
                _insertCommandExtra = extra;
            }

            return(_insertCommand);
        }