Страницы

3.12.13

AS3 (Note #2) :: Error #2044: Unhandled SQL ErrorEvent:. error=3132, operation=execute , message=Error #3132: Data type mismatch. , details=

Пишу приложение на Adobe AIR, которое активное взаимодействует в асинхронном режиме с локальной базой SQLite3.

Ошибка компилятора:
Error #2044: Unhandled SQL ErrorEvent:. error=3132, operation=execute , message=Error #3132: Data type mismatch. , details=

Ошибка возникала когда данные из ОБЪЕКТА загружал в БД.

ОБЪЕКТ представлял собой набор следующих данных:

qualificationOBJ:Object = {id:new Array(),idq:new Number(),inst:new Array(),trade:new Array(),spec:new Array(),diplnum:new Array(),dipldate:new Array(),linename:new Array()};

Код загрузки данных:



function OBJ_to_SQL(){
var i = 0;
var to= qualificationOBJ.linename.length-1;
var sqlCommIns:String = new String();
var sqlSubCommVal:String = new String();
var qualificationSQL:SQLStatement = new SQLStatement();
qualificationSQL.sqlConnection = _connection;
qualificationSQL.itemClass = BDitem; /* - класс с приват переменными для защиты БД от несанкционированных команд*/
for (var qname in qualificationOBJ) /*пробегаемся по содержимому ОБЪЕКТА*/
{
if (qname != "linename")
{
sqlCommIns += qname+", "; /*Формируем пол команды INSERT(...)*/
sqlSubCommVal += "@"+qname+", "; /*Перечисляем переменные VARIBLES(...)*/
if (qualificationOBJ[qname] is Array)
{
qualificationSQL.parameters["@"+qname] = qualificationOBJ[qname][i];
}
else
{
qualificationSQL.parameters["@"+qname] = qualificationOBJ[qname];
}
}
}
qualificationSQL.text ="INSERT INTO qualification("+sqlCommIns.slice(0, sqlCommIns.length-2)+") VALUES("+sqlSubCommVal.slice(0, sqlSubCommVal.length-2)+")";
qualificationSQL.addEventListener(SQLEvent.RESULT, nextUploadComm);
qualificationSQL.execute();
function nextUploadComm(event:SQLEvent):void 
/*Дождались ответа БД и продолжаем загрузку Данных из ОБЪЕКТА*/
{
sqlCommIns = new String();
sqlSubCommVal = new String();
i+=1;
if (i<=to)
{
for (var nqname in qualificationOBJ)
{
if (nqname != "linename")
{
sqlCommIns += nqname+", ";
sqlSubCommVal += "@"+nqname+", ";
if (qualificationOBJ[nqname] is Array)
{
qualificationSQL.parameters["@"+nqname] = qualificationOBJ[nqname][i];
trace ("qualificationOBJ[nqname][i] = " + qualificationOBJ[nqname][i]);
}
else
{
qualificationSQL.parameters["@"+nqname] = qualificationOBJ[nqname];
}
}
}
qualificationSQL.text ="INSERT INTO qualification("+sqlCommIns.slice(0, sqlCommIns.length-2)+") VALUES("+sqlSubCommVal.slice(0, sqlSubCommVal.length-2)+")";
qualificationSQL.execute();
}
else
{
trace (":: END_OF_execute ::");
}
}

В итоге компилятор дает ошибку возможно по причине того, что qualificationSQL.parameters["@"+nqname] не видит тип данных при выгрузке из массивов ОБЪЕКТА. Для одномерного объекта (понимайте это пожалуйста как ОБЪЕКТ без массивов) часть кода с for in прекрасно работала... Но как вылезли массивы, вылезла ошибка.

Пришлось явно указать на тип данных:

/* P.S.:*/
var i = 0;
var to= qualificationOBJ.linename.length-1;
qualificationSQL.text ="INSERT INTO qualification(id, idq, inst, trade, spec, diplnum, dipldate) VALUES(@id, @idq, @inst, @trade, @spec, @diplnum, @dipldate)";
qualificationSQL.parameters["@id"] = qualificationOBJ.id[i] as int;
qualificationSQL.parameters["@idq"] = qualificationOBJ.idq as int;
qualificationSQL.parameters["@inst"] = qualificationOBJ.inst[i] as String;
qualificationSQL.parameters["@trade"] = qualificationOBJ.trade[i] as String;
qualificationSQL.parameters["@spec"] = qualificationOBJ.spec[i] as String;
qualificationSQL.parameters["@diplnum"] = qualificationOBJ.diplnum[i] as String;
qualificationSQL.parameters["@dipldate"] = qualificationOBJ.dipldate[i] as Date;
qualificationSQL.addEventListener(SQLEvent.RESULT, nextUploadComm);
qualificationSQL.execute();

/* и т. д.*/