Sql server VBA查询不返回任何值
我正在尝试连接到SQL Server并提取具有特定日期范围的特定数据,这样用户只需添加他们想要提取的年份,就可以获取该年份的所有数据 该查询在SQL中工作,但只要我将其添加到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()
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和变量
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