Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Access中的SQL查询提示消息框要求更改表名_Sql_Ms Access_Onclick_Messagebox - Fatal编程技术网

Access中的SQL查询提示消息框要求更改表名

Access中的SQL查询提示消息框要求更改表名,sql,ms-access,onclick,messagebox,Sql,Ms Access,Onclick,Messagebox,在Access中运行SQL查询之前,是否有方法提示您输入要查询的表名?例如,假设列将始终保持不变。这些列可以称为“Fruit”和“Date”。但是,表名可能会根据批号而改变。例如,表名可以是“BatchNO_1”或“BatchNO_2”或“BatchNO_3”等。因此,假设我有一个SQL,如: select Fruit, Date from BatchNO_1 where Fruit = "Apples" 是否有一种方法可以提示我输入表名,并让SQL使用我输入的表名执行查询?否。表名不能作

在Access中运行SQL查询之前,是否有方法提示您输入要查询的表名?例如,假设列将始终保持不变。这些列可以称为“Fruit”和“Date”。但是,表名可能会根据批号而改变。例如,表名可以是“BatchNO_1”或“BatchNO_2”或“BatchNO_3”等。因此,假设我有一个SQL,如:

select Fruit, Date from BatchNO_1 where Fruit = "Apples"  

是否有一种方法可以提示我输入表名,并让SQL使用我输入的表名执行查询?

否。表名不能作为参数传递给查询。您必须自己构造查询

Dim tableName作为字符串,sql作为字符串
tableName=InputBox(“请输入表格名称”)
如果表名为“”,则
sql=“选择水果,日期从[”&tableName&“],其中水果='Apples'”
'TODO:在此处执行查询
如果结束
例如,您可以更改现有查询的查询文本,如下所示:

SELECT Fruit, Date
FROM Batch
WHERE
   Fruit = "Apples"
   AND BatchNo = [Enter Batch No];
CurrentDb.querydfs(“myQuery”).SQL=SQL
或者您可以像这样执行查询

Dim db作为DAO.Database,rs作为DAO.Recordset
Set db=CurrentDb
Set rs=db.OpenRecordset(sql)
直到R.EOF为止
调试。打印rs!水果和水果!日期
下一个
环
rs.关闭:设置rs=无
db.Close:设置db=Nothing

通过将批号放在表名中而不是列中,可以在模式中对数据进行编码。这不是最佳实践,因此在我看来,正确的答案是更改数据库设计

创建一个包含当前
BatchNo
表中所有列的
BatchNo
表,但添加一个名为
BatchNo
的列作为主键的一部分。将BatchNo表中的所有数据加载到此表中,然后删除这些表。那么您的查询将直接如下所示:

SELECT Fruit, Date
FROM Batch
WHERE
   Fruit = "Apples"
   AND BatchNo = [Enter Batch No];
不要将数据放在表名中。这不是建立数据库的方式

简单地解释一下,您当前的设计违反最佳实践的原因正是因为您现在面临的问题——为了使用这样的设计并尝试以合理的、数据驱动的方式执行操作,您必须做一些诡计和奇怪的事情


通过让用户输入表名,如果您不小心将用户提供的表名与允许的表名白名单进行比较,也会造成SQL注入的危险。虽然这在Access中可能不是什么大事,但它仍然走上了错误的道路,除了专业的数据库工作之外,它还在接受其他方面的培训。如果你想发展自己的职业生涯,那就很遗憾,在你开始学习正确的做事方法之前,你必须先放弃一大堆东西。

是的,你是对的;但是,有时数据是在其他地方生成的。例如,每个批次可以在单独的CSV文件中交付。将批次导入到单独的表中比将其导入到单个表中更容易。就个人而言,我更喜欢将它们导入到单个表中。特别是当模式变得更复杂时,这是必须的。无论将数据导入单独表的难度有多大,这对数据库的可用性造成的损害都会阻止它被推荐为可行的解决方案。导入到单个表只是一件必须做的事情。