При попытке выбрать столбец типа BLOB SQLStatement выбрасывает RangeError # 2006: предоставленный индекс выходит за пределы - PullRequest
2 голосов
/ 30 августа 2010
var imageData:ByteArray = new ByteArray();
var headshotStatement:SQLStatement = new SQLStatement();
headshotStatement.sqlConnection = dbConnection;
var headshotStr:String = "SELECT headshot FROM ac_images WHERE id = " + idx;
headshotStatement.text = headshotStr;
headshotStatement.execute();

Ошибка указывает на последнюю строку в этом блоке.Я нашел несколько ссылок в Интернете, где люди не могут выбрать большой двоичный объект с помощью AS3, в который были вставлены данные из внешней программы, что является моей точной ситуацией.

Точная трассировка ошибки:

RangeError: Error #2006: The supplied index is out of bounds.
at flash.data::SQLStatement/internalExecute()
at flash.data::SQLStatement/execute()
at edu.bu::DataManager/getHeadshotImageData()[omitted/DataManager.as:396]
at edu.bu::CustomStudentProfileEditorWindow/editStudent()[omitted/CustomStudentProfileEditorWindow.mxml:194]
at edu.bu::CustomStudentProfileEditorWindow/profileEditor_completeHandler()[omitted/CustomStudentProfileEditorWindow.mxml:37]
at edu.bu::CustomStudentProfileEditorWindow/___CustomStudentProfileEditorWindow_Window1_creationComplete()[omitted/CustomStudentProfileEditorWindow.mxml:9]
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at mx.core::UIComponent/dispatchEvent()[E:\dev\4.x\frameworks\projects\framework\src\mx\core\UIComponent.as:12528]
at mx.core::UIComponent/set initialized()[E:\dev\4.x\frameworks\projects\framework\src\mx\core\UIComponent.as:1627]
at mx.managers::LayoutManager/doPhasedInstantiation()[E:\dev\4.x\frameworks\projects\framework\src\mx\managers\LayoutManager.as:759]
at mx.managers::LayoutManager/doPhasedInstantiationCallback()[E:\dev\4.x\frameworks\projects\framework\src\mx\managers\LayoutManager.as:1072]

Есть идеи, что может быть не так с данными, вызывающими удушение AS3?

Редактировать: Я пытался вставить те же данные в поле двоичного типа, используя SQLiteМенеджер 3.5 для OS X с тем же результатом.Я работаю с JPG, собираюсь попробовать другие форматы изображений, хотя я не могу догадаться, какой из предоставленных индексов выходит за пределы, учитывая, что попытка перейти к определению просто утверждает, что он получен из SWC, и я могуне вижуВцепившись в соломинку, прежде чем я распространю данные в zip-архиве и распакую их на лету, чего я не хочу делать.

Edit 2, Workaround Edition: А пока яМы написали быстрое окно MXML, которое запрашивает изображения и вставляет данные в базу данных.Хотелось бы знать, почему другое приложение не может хранить BLOB-данные способом, понятным SQLStatement.По сути, я настраиваю несколько кнопок, которые запрашивают пути файлов к нужным изображениям в базе данных, считывая их с помощью readBytes () в ByteArray, и сохраняя их в базе данных SQLite с помощью SQLStatement.Затем я могу без труда прочитать изображение обратно.

Редактировать 3: Вот изображение структуры таблицы.Обратите внимание, что эта же таблица успешно используется, когда Flash выполняет вставку образа базы данных, в отличие от какого-либо другого инструмента, который правильно сохраняет данные в поле BLOB для любого другого приложения, кроме Flash ...

Table

Ответы [ 3 ]

3 голосов
/ 19 июня 2012

Из документов Air поддерживается CAST для добавления BLOB-объектов без AMF, начиная с Air 2.5. У меня была та же проблема с полем базы данных / блоба, созданным в python и использованным в Air, и это решило ее для меня.

пример из документов:

stmt.text = "SELECT CAST(data AS ByteArray) AS data FROM pictures;"; 
stmt.execute(); 
var result:SQLResult = stmt.getResult(); 
var bytes:ByteArray = result.data[0].data;

http://help.adobe.com/en_US/as3/dev/WSd47bd22bdd97276f1365b8c112629d7c47c-8000.html

2 голосов
/ 20 июня 2011

Я нашел ваш вопрос, потому что столкнулся с той же проблемой.

Я наконец-то смог исправить и решить мою проблему, может, вам стоит взглянуть на мое решение, может быть, это поможет вам решить ваше: Какие первые байты в столбце BLOB-объектов SQlite Adobe AIR? Blob Sizeinfo?

Это вина Adobe AIR и AMF (ActionScript Message Format), которые пытаются сохранить объект ByteArray как отформатированный двоичный файл. Поэтому он добавляет первый байт 12, который является TypeCode для ByteArray, за которым следует целое число int-29 для size-length и, наконец, необработанные данные.

Таким образом, если вы хотите сохранить данные двоичного двоичного объекта в sqlite, который должен быть прочитан Adobe AIR, вы должны добавить эту информацию, чтобы позволить Adobe Air преобразовать все обратно в ByteArray.

0 голосов
/ 21 июня 2011

Спасибо за подсказку, я объяснил, как писать байты AMF с использованием Java в этой теме: Что такое первые байты в столбце BLOB-объектов SQlite Adobe AIR? Blob Sizeinfo?

Надеюсь, это поможет,

Фабьен

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...