public override object ExecuteScalar()
        {
            if (OpenReader != null)
            {
                throw new InvalidOperationException(Strings.OpenReaderExists);
            }
            if (_connection == null ||
                _connection.State != ConnectionState.Open)
            {
                throw new InvalidOperationException(Strings.FormatCallRequiresOpenConnection("ExecuteScalar"));
            }
            if (string.IsNullOrWhiteSpace(_commandText))
            {
                throw new InvalidOperationException(Strings.FormatCallRequiresSetCommandText("ExecuteScalar"));
            }

            ValidateTransaction();
            Prepare();
            Bind();

            object result    = null;
            var    gotResult = false;

            foreach (var handle in _handles)
            {
                try
                {
                    var rc = NativeMethods.sqlite3_step(handle);
                    if (rc != Constants.SQLITE_DONE &&
                        rc != Constants.SQLITE_ROW)
                    {
                        MarshalEx.ThrowExceptionForRC(rc);
                    }

                    var hasResults = NativeMethods.sqlite3_stmt_readonly(handle) != 0;

                    if (!gotResult && hasResults)
                    {
                        if (rc == Constants.SQLITE_ROW)
                        {
                            var declaredType = NativeMethods.sqlite3_column_decltype(handle, 0);
                            var sqliteType   = (SQLiteType)NativeMethods.sqlite3_column_type(handle, 0);
                            var map          = SQLiteTypeMap.FromDeclaredType(declaredType, sqliteType);
                            var value        = ColumnReader.Read(map.SQLiteType, handle, 0);

                            result = map.FromInterop(value);
                        }

                        gotResult = true;
                    }
                }
                finally
                {
                    var rc = NativeMethods.sqlite3_reset(handle);
                    MarshalEx.ThrowExceptionForRC(rc);
                }
            }

            return(result);
        }
        internal void Bind(IEnumerable <StatementHandle> handles)
        {
            Debug.Assert(handles != null, "handles is null.");
            if (_parameterName == null)
            {
                throw new InvalidOperationException(Strings.FormatRequiresSet("ParameterName"));
            }
            if (_value == null)
            {
                throw new InvalidOperationException(Strings.FormatRequiresSet("Value"));
            }

            foreach (var handle in handles)
            {
                var index = NativeMethods.sqlite3_bind_parameter_index(handle, _parameterName);
                if (index != 0)
                {
                    var typeMap = SQLiteTypeMap.FromClrType(_value.GetType());
                    switch (typeMap.SQLiteType)
                    {
                    case SQLiteType.Integer:
                        var rc = NativeMethods.sqlite3_bind_int64(handle, index, (long)typeMap.ToInterop(_value));
                        MarshalEx.ThrowExceptionForRC(rc);
                        break;

                    case SQLiteType.Float:
                        rc = NativeMethods.sqlite3_bind_double(handle, index, (double)typeMap.ToInterop(_value));
                        MarshalEx.ThrowExceptionForRC(rc);
                        break;

                    case SQLiteType.Text:
                        rc = NativeMethods.sqlite3_bind_text(handle, index, (string)typeMap.ToInterop(_value));
                        MarshalEx.ThrowExceptionForRC(rc);
                        break;

                    case SQLiteType.Blob:
                        rc = NativeMethods.sqlite3_bind_blob(handle, index, (byte[])typeMap.ToInterop(_value));
                        MarshalEx.ThrowExceptionForRC(rc);
                        break;

                    case SQLiteType.Null:
                        rc = NativeMethods.sqlite3_bind_null(handle, index);
                        MarshalEx.ThrowExceptionForRC(rc);
                        break;

                    default:
                        Debug.Assert(false, "Unexpected value.");
                        break;
                    }
                }
            }

            _bound = true;
        }
예제 #3
0
        public override RelationalTypeMapping GetTypeMapping(
            string specifiedType, string storageName, Type propertyType, bool isKey, bool isConcurrencyToken)
        {
            var map = SQLiteTypeMap.FromClrType(propertyType);

            if (specifiedType != null)
            {
                map = SQLiteTypeMap.FromDeclaredType(specifiedType, map.SQLiteType);
            }

            // TODO: Leverage base implementation more
            return(new RelationalTypeMapping(map.DeclaredTypes.First(), map.DbType));
        }
예제 #4
0
        public override T GetFieldValue <T>(int ordinal)
        {
            CheckClosed("GetFieldValue");

            if (typeof(T) == typeof(object))
            {
                return((T)GetValue(ordinal));
            }

            var map   = SQLiteTypeMap.FromClrType <T>();
            var value = ColumnReader.Read(map.SQLiteType, _currentHandle, ordinal);

            return((T)map.FromInterop(value));
        }
예제 #5
0
        public override RelationalTypeMapping GetTypeMapping(
            string specifiedType, string storageName, Type propertyType, bool isKey, bool isConcurrencyToken)
        {
            // TODO: This is a hacky implementation for getting the DbType to use.

            var baseMapping = base.GetTypeMapping(specifiedType, storageName, propertyType, isKey, isConcurrencyToken);

            if (specifiedType != null)
            {
                return(new RelationalTypeMapping(specifiedType, baseMapping.StoreType));
            }

            var types = SQLiteTypeMap.FromClrType(Nullable.GetUnderlyingType(propertyType) ?? propertyType)
                        .DeclaredTypes;

            Contract.Assert(types.Any(), "types is empty.");

            return(new RelationalTypeMapping(types.First(), baseMapping.StoreType));
        }
        public override IValueGeneratorFactory Select(IProperty property)
        {
            if (property.ValueGenerationOnAdd == ValueGenerationOnAdd.Client)
            {
                // If INTEGER PRIMARY KEY column...
                var keyProperties = property.EntityType.GetKey().Properties;
                if (keyProperties.Count == 1 &&
                    keyProperties[0] == property)
                {
                    // TODO: Consider using RelationalTypeMapper service
                    var integerClrType = SQLiteTypeMap.FromDeclaredType("INTEGER", SQLiteType.Integer).ClrType;
                    if (property.PropertyType == integerClrType ||
                        string.Equals(property.ColumnType(), "INTEGER", StringComparison.OrdinalIgnoreCase))
                    {
                        // NOTE: This assumes no WITHOUT ROWID tables
                        return(_tempFactory);
                    }
                }
            }

            return(base.Select(property));
        }
예제 #7
0
 private SQLiteTypeMap GetTypeMap(int ordinal)
 {
     return(SQLiteTypeMap.FromDeclaredType(GetDataTypeName(ordinal), GetSQLiteType(ordinal)));
 }