Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.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
带WHERE子句的VBA SQL查询_Sql_Vba_Excel_Where Clause - Fatal编程技术网

带WHERE子句的VBA SQL查询

带WHERE子句的VBA SQL查询,sql,vba,excel,where-clause,Sql,Vba,Excel,Where Clause,我正在尝试编写VBA代码,以便将SQL数据导入Excel。除了的WHERE条件外,一切正常。我想问题可能出在报价上。这是我的疑问: 子工程\u里程碑() 作为字符串的Dim v_项目 Dim cn作为ADODB.Connection 将rs设置为ADODB.Recordset 将sql设置为字符串 Set cn=New ADODB.Connection Set rs=New ADODB.Recordset v_项目=工作表(“参数”).范围(“B1”).值 “cn.Open”提供程序=x.1;数

我正在尝试编写VBA代码,以便将SQL数据导入Excel。除了
的WHERE
条件外,一切正常。我想问题可能出在报价上。这是我的疑问:

子工程\u里程碑()
作为字符串的Dim v_项目
Dim cn作为ADODB.Connection
将rs设置为ADODB.Recordset
将sql设置为字符串
Set cn=New ADODB.Connection
Set rs=New ADODB.Recordset
v_项目=工作表(“参数”).范围(“B1”).值
“cn.Open”提供程序=x.1;数据源=x;初始目录=x;集成安全=x”
cn.Open“Provider=Sx;数据源=x;初始目录=x;集成安全=x”
工作表(“工程里程碑”).范围(“A2:G5000”).清晰目录
sql=“选择A.ENGINEER\u ID,B.[说明],B.BUDGET\u APPROVED,A.MILESTONE,A.[说明],A.PCT\u COMPLETE,A.SCHEDULE\u DATE FROM X作为A.ENGINEER\u ID=B.ENGINEER\u ID上的内部连接X作为B.Project\u ID,其中B.Project\u ID=“&”&“&v\u Project&”和A.Project\u ID=“&”&v\u Project&”
开放式sql,中国
表格(“工程里程碑”)。单元格(2,1)。从记录集复制
rs.Close
cn.Close
端接头
当SQL查询有一个条件时,即…
其中B.Project_ID=“&””&v_Project&“”
(没有第二个条件->
和A.Project_ID=“&””&v_Project&“”


我对此非常陌生,因此如果有人能提供帮助,我将不胜感激……非常感谢。

您只提供了一行代码的一半,因此我只能猜测这就是您的目的:

"where B.Project_ID = '"& v_project &"'& And A.Project_ID = ' & v_project  "'"
当输入/退出多种类型的引号时,字符串可能会令人困惑,但是当您对构建字符串的问题进行故障排除时,请先删除所有变量,然后只使用硬编码的SQL字符串


一旦开始工作,开始用变量(和适当的引号)一次替换一个值。

您只提供了一行代码的一半,因此我只能猜测这就是您要尝试的:

"where B.Project_ID = '"& v_project &"'& And A.Project_ID = ' & v_project  "'"
当输入/退出多种类型的引号时,字符串可能会令人困惑,但是当您对构建字符串的问题进行故障排除时,请先删除所有变量,然后只使用硬编码的SQL字符串


一旦开始工作,开始用变量(和适当的引号)一次替换一个值。

永远不要编写像连接字符串那样的SQL代码。只需使用参数即可。例如:(假设vProject是整数)


注意:cmd是用于命令的ADODB.Command对象。

永远不要编写这样连接字符串的SQL代码。只需使用参数即可。例如:(假设vProject是整数)


注意:cmd是用于命令的ADODB.Command对象。

考虑SQL参数化,这是将值传递到SQL查询时的行业最佳实践-不仅在VBA或数据库中,而且跨所有langauge接口传递到任何数据库。此过程更具可读性和可维护性,因为您不再担心引号。Plus、 代码(SQL查询)与数据(VBA变量)分离

使用ADO,可以使用定义和设置参数

Dim v_项目作为字符串,sql作为字符串
Dim cn作为新的ADODB.连接
将rs设置为新ADODB.Recordset
Dim cmd作为新的ADODB.Command
v_项目=工作表(“参数”).范围(“B1”).值
cn.Open“Provider=Sx;数据源=x;初始目录=x;集成安全=x“
'使用QMARK占位符准备的语句
sql=“选择A.工程师ID,B[说明],B.预算批准,A.里程碑,”_
&“A.[说明],A.PCT\u完成,A.SCHEDULE\u日期”_
&“从X作为内部连接X作为A.ENGINEER\u ID=B.ENGINEER\u ID上的B”_
&其中B.Project_ID=?和A.Project_ID=?”
'命令对象
Set cmd=New ADODB.Connection
使用cmd
.ActiveConnection=cn'连接对象
.CommandText=sql
.CommandType=adCmdText
'绑定参数
.Parameters.Append.CreateParameter(“a_projid”、adVarChar、adParamInput、v_项目)
.Parameters.Append.CreateParameter(“b_projid”、adVarChar、adParamInput、v_项目)
以
'分配给记录集
设置rs=cmd.Execute
带工作表(“工程里程碑”)
.范围(“A2:G5000”).清晰内容
.单元格(2,1).从记录集复制
以
rs.Close:cn.Close
Set cmd=Nothing:Set rs=Nothing:Set cn=Nothing

考虑SQL参数化,这是将值传递到SQL查询时的行业最佳实践—不仅在VBA或您的数据库中,而且在任何数据库的所有langauge接口中都是如此。此过程更易于阅读和维护,因为您不再担心引号。此外,代码(SQL查询)与数据(VBA变量)是分开的

使用ADO,可以使用定义和设置参数

Dim v_项目作为字符串,sql作为字符串
Dim cn作为新的ADODB.连接
将rs设置为新ADODB.Recordset
Dim cmd作为新的ADODB.Command
v_项目=工作表(“参数”).范围(“B1”).值
cn.Open“Provider=Sx;数据源=x;初始目录=x;集成安全=x“
'使用QMARK占位符准备的语句
sql=“选择A.工程师ID,B[说明],B.预算批准,A.里程碑,”_
&“A.[说明],A.PCT\u完成,A.SCHEDULE\u日期”_
&“从X作为内部连接X作为A.ENGINEER\u ID=B.ENGINEER\u ID上的B”_
&其中B.Project_ID=?和A.Project_ID=?”
'命令对象
Set cmd=New ADODB.Connection
使用cmd
.ActiveConnection=cn'连接对象
.CommandText=sql
.CommandType=adCmdText
'绑定参数
.Parameters.Append.CreateParameter(“a_projid”、adVarChar、adParamInput、v_项目)
.Parameters.Append.CreateParameter(“b_projid”、adVarChar、adParamInput、v_项目)
以
'分配给记录集
设置rs=cmd.Execute
带工作表(“工程里程碑”)
.范围(“A2:G5000”).清晰内容
.单元格(2,1).从记录集复制
以
rs.Close:cn.Close
Set cmd=Nothing:Set rs=Nothing:Set cn=Nothing

正如我说过的,永远不要通过字符串连接编写SQL代码,