我有一个用户输入SQL查询的文本框。但是,我需要创建一个程序来验证查询,然后再在数据库中执行它。
例如:
假设用户输入
SELECT A1,
A2,
A3
FROM XYZ
现在,在执行查询之前,我需要检查表A1
中是否存在A2
,A3
和XYZ
。如果没有,则应向用户显示错误消息。
我无法想办法继续下去。 那么,任何人都可以通过示例代码片段提供有关如何进一步处理的基本想法吗?
答案 0 :(得分:6)
我怀疑你是否应该这样做:
XYZ
不是表,而是视图,物化视图,存储过程 em>(取决于RDBMS)返回 cursor ?XYZ
是一个表,但是用户没有权限(grant
)来阅读该怎么办?A2
字段读取?还有其他需要考虑的案例
XYZ
可以是同义词,例如: dblink到Hadoop上的远程表,而这个Hadoop暂时停止服务所以我建议执行查询而不用进行任何初步检查,但解析并解释异常抛出(如果有的话)。
答案 1 :(得分:1)
非常合适的方法是在MS SQL中执行代码,让MS SQL找出错误。
StringBuilder query= new StringBuilder();
query.Append("BEGIN \n");
query.Append("BEGIN TRY \n");
query.Append(" -- Table does not exist; object name resolution \n");
query.Append(" -- error not caught. \n");
query.Append(" --Append the variable which holds your sql query \n");
query.Append(" --For eg.: SELECT * FROM NonexistentTable; \n");
query.Append(" END TRY \n");
query.Append(" BEGIN CATCH \n");
query.Append(" SELECT \n");
query.Append(" ERROR_NUMBER() AS ErrorNumber \n");
query.Append(" ,ERROR_MESSAGE() AS ErrorMessage; \n");
query.Append(" END CATCH \n");
query.Append("END");
使用SQLCommand的ExcecuteScalar()超出查询。
SQL Server将返回提交查询的确切错误。
答案 2 :(得分:0)
现在,在执行查询之前,我需要检查XYZ表中是否存在A1,A2和A3。
如果要检查表中是否存在值,则必须在表中查询。如果不执行查询,则无法找到表中是否存在该值。
如果您在SQL Server(,例如)中工作,那么您可以使用IF EXISTS子句,如
IF EXISTS(
SELECT *
FROM sys.columns
WHERE Name = 'A1' AND Name = 'A2' AND Name = 'A3'
AND Object_ID = Object_ID(N'XYZ'))
BEGIN
END
答案 3 :(得分:0)
可能你需要一个接一个地做。首先检查表XYZ是否存在
SELECT * FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'XYZ';
然后会出现下一个问题,即表格中的字段名称是否存在
SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'XYZ'
AND COLUMN_NAME = 'A1'
AND COLUMN_NAME = 'A2'
AND COLUMN_NAME = 'A3'