Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.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
Sql server VBA查询不返回任何值_Sql Server_Vba_Adodb - Fatal编程技术网

Sql server VBA查询不返回任何值

Sql server VBA查询不返回任何值,sql-server,vba,adodb,Sql Server,Vba,Adodb,我正在尝试连接到SQL Server并提取具有特定日期范围的特定数据,这样用户只需添加他们想要提取的年份,就可以获取该年份的所有数据 该查询在SQL中工作,但只要我将其添加到VBA中,它就不会提取任何内容。有人能帮我解释一下原因吗 目前,我可以连接到数据库,我的数据记录可以正常工作,因为如果我使用较小的查询,它就可以正常工作 选项显式 子SQL Server() Dim conn作为ADODB连接 Dim服务器名称为字符串 Dim数据库名称为字符串 将用户ID设置为字符串 将密码设置为字符串 作

我正在尝试连接到SQL Server并提取具有特定日期范围的特定数据,这样用户只需添加他们想要提取的年份,就可以获取该年份的所有数据

该查询在SQL中工作,但只要我将其添加到VBA中,它就不会提取任何内容。有人能帮我解释一下原因吗

目前,我可以连接到数据库,我的数据记录可以正常工作,因为如果我使用较小的查询,它就可以正常工作

选项显式
子SQL Server()
Dim conn作为ADODB连接
Dim服务器名称为字符串
Dim数据库名称为字符串
将用户ID设置为字符串
将密码设置为字符串
作为ADODB.Recordset的Dim数据
Server_Name=“*******””在此处输入您的服务器名称
Database_Name=“*******””在此处输入您的数据库名称
User_ID=“*****”在此处输入您的用户ID
Password=“*****”在此处输入您的密码
Set conn=新的ADODB.连接
Set Data=New ADODB.Recordset
conn.ConnectionString=“Provider=SQLNCLI10;Server=“&Server\u Name&”Database=“&Database\u Name&”Uid=“&User\u ID&”Pwd=“&Password&;”
康涅狄格州公开赛
转到CloseConnection时出错
有数据
.ActiveConnection=conn
.Source=GetYearString
.LockType=adLockReadOnly
.CursorType=adOpenForwardOnly
打开
以
表(“表3”)。范围(“D4:O4”)。从记录集数据复制
错误转到0
数据,关闭
紧密连接:
关闭连接
端接头
函数GetYearString()作为字符串
将年份设置为整数
将SQLString设置为字符串
年份=Application.InputBox(“输入所选年份?”,类型:=1)
SQLString=“DECLARE@testtable”
SQLString=SQLString&“
SQLString=SQLString&“ID INT-IDENTITY(1,1),”
SQLString=SQLString&“值浮动”
SQLString=SQLString&“
SQLString=SQLString&“声明@InputDate-DATETIME”
SQLString=SQLString&“SET@InputDate=”&Year&“-01-01”
SQLString=SQLString&“而@InputDate=@MonthStartDate和DateAdd(小时,2,UTC时间)
您在SQL字符串构造中犯了两个错误:

  • 你忘了新台词了
  • 您混合使用SQL和变量
第一个问题很容易解决。我更喜欢使用以下方法在VBA中创建多行字符串:

str = Join(Array( _
    "line", _
    "line", _
    "line" _
), vbNewLine)
第二个错误是SQL注入漏洞的主要原因,原则上,绝对不要使用字符串连接来构建变量SQL

此对象存在
ADODB.Command
对象。它采用带有
占位符和单独查询参数的固定字符串。它将以这样一种方式组合查询和参数,您将永远不需要担心转义,同时具有类型安全性

选项显式
Dim conn作为新的ADODB连接
子连接SQLServer()
Dim服务器名称为字符串
Dim数据库名称为字符串
将用户ID设置为字符串
将密码设置为字符串
Server_Name=“*******””在此处输入您的服务器名称
Database_Name=“*******””在此处输入您的数据库名称
User_ID=“*****”在此处输入您的用户ID
Password=“*****”在此处输入您的密码
conn.ConnectionString=“Provider=SQLNCLI10;Server=“&Server\u Name&”Database=“&Database\u Name&”Uid=“&User\u ID&”Pwd=“&Password&;”
康涅狄格州公开赛
端接头
子填充页()
将年份设置为整数
如果连接状态为adStateOpen,则连接SQLServer()
年份=Application.InputBox(“输入所选年份?”,类型:=1)
如果年份>0,则
表格(“Sheet3”)。范围(“D4:O4”)。从记录集复制GetYear(year)
如果结束
端接头
函数GetYear(年份为整数)为ADODB.Recordset
'TODO为“conn为空”添加检查
'TODO为“conn.State adStateOpen”添加检查
使用新的ADODB.Command
Set.ActiveConnection=conn
.ActiveConnection.CursorLocation=adUseClient
.CommandType=adCmdText
.CommandText=加入(数组(_
声明@Test表(“_
“ID INT IDENTITY(1,1),”_
“价值浮动”_
")", _
“声明@year INT”_
“声明@InputDate DATETIME”_
“声明@MonthStartDate DATETIME”_
“设定年份=?”_
“设置@InputDate=CAST(@year+'-01-01'作为日期时间)”_
“而@InputDate=@MonthStartDate和DateAdd(小时,2,UTC时间)

注意:@SeanLange的评论是正确的,您的SQL不应该包含插入的while循环。您应该将其修改为基于集合的语句。

SQL语句中可能存在某种错误。检查
CloseConnection
标签中对象的详细信息。还要记住,您连接的字符串没有任何空格。您将得到如下语法:
BEGINDECLARE
DATETIMESELECT
。您有
错误转到CloseConnection
,因此不会报告错误。只有当您打算实际执行某些操作时,才可以使用错误处理来删除该行并发现真正的错误。还要学习使用调试器并逐步完成代码。请尝试打印SQL字符串-字词之间缺少空格!为什么要用while循环呢?没有n