Javascript 缩短循环的动态SQL查询
我有一个函数,它构建一个sql查询,然后将其插入到客户端轻型sql中 我想我已经习惯了很多for循环,我该如何缩短它呢Javascript 缩短循环的动态SQL查询,javascript,sql,Javascript,Sql,我有一个函数,它构建一个sql查询,然后将其插入到客户端轻型sql中 我想我已经习惯了很多for循环,我该如何缩短它呢 function insert(dataBase,table,row){ var j = 0; var sqlQueryArray = []; sqlQueryArray[j++] = 'INSERT INTO '; sqlQueryArray[j++] = table sqlQueryArray[j++] = ' (' f
function insert(dataBase,table,row){
var j = 0;
var sqlQueryArray = [];
sqlQueryArray[j++] = 'INSERT INTO ';
sqlQueryArray[j++] = table
sqlQueryArray[j++] = ' ('
for (var i = row.length - 2; i >= 0; i--){
sqlQueryArray[j++] = row[i].id + ',';
};
sqlQueryArray[j++] = row[(row.length - 1)].id + '';
sqlQueryArray[j++] = ')'
var sqlQueryString = ' VALUES ';
for (var i = row.length - 2; i >= 0; i--){
sqlQueryArray[j++] = '?, ';
};
sqlQueryArray[j++] = '?';
sqlQueryArray[j++] = ');'
for (var i = 0; i < sqlQueryArray.length; i++){
sqlQueryString += sqlQueryArray[i];
}
var rowArray = []
for (var i = row.length - 1; i >= 0; i--){
rowArray[i] = row[i].val;
};
dataBase.openDatabase.transaction(
function (transaction) {
transaction.executeSql(sqlQueryString,
rowArray,
dataBase.nullSQLHandler, dataBase.QueryError);
}
);
}
函数插入(数据库、表、行){
var j=0;
var sqlQueryArray=[];
sqlQueryArray[j++]='插入';
sqlQueryArray[j++]=表
sqlQueryArray[j++]='('
对于(var i=row.length-2;i>=0;i--){
sqlQueryArray[j++]=行[i].id+',';
};
sqlQueryArray[j++]=row[(row.length-1)].id++;
sqlQueryArray[j++]=')'
var sqlQueryString='VALUES';
对于(var i=row.length-2;i>=0;i--){
sqlQueryArray[j++]='?,';
};
sqlQueryArray[j++]='?';
sqlQueryArray[j++]=');'
对于(var i=0;i=0;i--){
行数组[i]=行[i].val;
};
dataBase.openDatabase.transaction(
职能(事务){
executeSql(sqlQueryString,
行数组,
dataBase.nullSQLHandler,dataBase.QueryError);
}
);
}
当在应用程序中创建动态SQL时,会释放一些东西,吃掉孩子
出于许多安全性和性能原因(更不用说可读性/可维护性),您确实应该为此使用参数化SP。首先,我认为您最好不要手动跟踪索引(
j++
)。使用sqlQueryArray.push()在sqlQueryArray
的末尾插入元素
然后,为了简化代码,您可以创建一个函数,该函数返回一个自定义SQL,将
行作为参数传递给您,使用该函数,您可以生成带有所有?
标记的INSERT INTO
子句。假设您使用的是相对较新的浏览器,您可以执行以下操作:
var insertStatement =
'INSERT INTO ' + table +
' (' + rows.map(function (row) { return row.id; }).join(', ') + ')' +
' VALUES (' + rows.map(function () { return '?'; }).join(', ') + ')';
您是否应该这样做留给读者作为练习:)
编辑:我刚刚在对另一个答案的评论中注意到,您正在将此消息发送到服务器执行。您绝对不应该这样做,因为用户可以轻松提交自己的SQL并对您的数据库造成各种破坏。您不应该信任通过网络接收的任何数据。您的权利我可能会将查询大楼更多地发送到服务器。这将使sql更加异步。哦。。。您正在将查询发送到服务器以执行?现在我正在客户端执行,但服务器是node.js服务器。因此,我可能只发送(表、行)并获取一个带有值数组的字符串。进入客户端sql的大多数信息都是通过ssl套接字从服务器发送的。我试图使它非常自动化,加上客户端将是一个移动电话。我认为将大部分繁重的工作发送到服务器可能会占用客户机的负载。