通过VBA将值动态传递给SQL Server

通过VBA将值动态传递给SQL Server,sql,sql-server,excel,vba,Sql,Sql Server,Excel,Vba,免责声明:我是VBA新手 我希望通过Excel工作表上的字段传递SQL查询(30881570)中的值。我试过几种不同的方法 Private Sub cmdImport\u Click() 调用cmdClear\u单击 Dim conn作为新ADODB.Connection,cmd作为新ADODB.Command,rs作为新ADODB.Recordset 与康涅狄格州 .ConnectionString=_ “Provider=SQLOLEDB;”&_ “数据源=PRGTAPPDBSWC019;”

免责声明:我是VBA新手

我希望通过Excel工作表上的字段传递SQL查询(30881570)中的值。我试过几种不同的方法

Private Sub cmdImport\u Click()
调用cmdClear\u单击
Dim conn作为新ADODB.Connection,cmd作为新ADODB.Command,rs作为新ADODB.Recordset
与康涅狄格州
.ConnectionString=_
“Provider=SQLOLEDB;”&_
“数据源=PRGTAPPDBSWC019;”&_
“初始目录=DETEP;”和_
“集成安全=SSPI;”
打开
以
使用cmd
.ActiveConnection=conn
.CommandText=“从[dbo].[tbl\u PMHeader]中选择*,其中[PMHeader\u PM\u NUM]=“30881570”
.CommandType=adCmdText
以
设置rs.Source=cmd
美国公开赛
'需要从指定范围开始填充标题行吗
对于intColIndex=0到rs.Fields.Count-1
范围(“B1”).Offset(0,intColIndex).Value=rs.Fields(intColIndex).Name
下一个
'这是将数据表复制到的位置
ActiveSheet.Range(“B2”).CopyFromRecordset rs
工作表(“表1”)。栏(“B:BB”)。自动调整
工作表(“表1”).范围(“A25”).公式=“=COUNTA(B:B)-1”
端接头

看起来您已经在传递该值作为查询的
WHERE
语句的条件

如果您询问如何将其替换为工作表中的值,有一种方法:

.CommandText = "SELECT * FROM [dbo].[tbl_PMHeader] " & _
    "WHERE [PMHeader_PM_NUM] = '" & Sheets("mySheet").Range("A1") & "'"
…其中您的工作表名为
mySheet
,值位于单元格
A1

这是最简单的方法,可供受信任方内部使用,但如果该值中有任何
单引号,则会出现错误

在最坏的情况下,此方法会使您面临攻击。根据您的需要(以及这是否只是学校作业),您最好使用参数查询


另见:
  • MSDN博客:
  • MSDN博客:
Private Sub cmdImport\u Click()
Dim conn作为新的ADODB连接
Dim cmd作为新的ADODB.Command
将rs设置为新ADODB.Recordset
作为字符串的Dim sqlStr
与康涅狄格州
.ConnectionString=_
“Provider=SQLOLEDB;”&_
“数据源=PRGTAPPDBSWC019;”&_
“初始目录=DETEP;”和_
“集成安全=SSPI;”
打开
以
订单号=图纸(“图纸1”)。范围(“A22”)
strSql=“从[dbo].[tbl_PMHeader]中选择*”&_
“其中[PMHeader\u PM\u NUM]=”&订单号
使用cmd
.ActiveConnection=conn
.CommandText=strSql
.CommandType=adCmdText
以
'调用cmdClear\u单击
设置rs.Source=cmd
美国公开赛
'需要从指定范围开始填充标题行吗
对于intColIndex=0到rs.Fields.Count-1
范围(“B1”).Offset(0,intColIndex).Value=rs.Fields(intColIndex).Name
下一个
'这是将数据表复制到的位置
ActiveSheet.Range(“B2”).CopyFromRecordset rs
工作表(“表1”)。栏(“B:BB”)。自动调整
工作表(“表1”).范围(“A25”).公式=“=COUNTA(B:B)-1”
端接头

您“必须传递值”是什么意思?这是一个参数(一个用作查询条件的值吗?)。因为在我看来,您已经在这样做了?现在发生了什么?你有什么错误吗?您是否尝试过单步通过代码检查变量值(或使用
Debug.Print
语句)?感谢您的回答。你的方式不会给我任何错误。但是你知道为什么它不给我一个空白表吗?我的意思是它给我一个空白表,而不是一个50多岁的记录。我建议使用参数化查询,而不是构建SQL字符串。@SidneyBookKeart可能没有与你指定的条件匹配的记录,但是,如果不知道您要做什么以及您的数据是什么样子的(即,您是否使用了正确的数据类型作为标准?)就不可能确切地知道。您好,谢谢您的帮助。我终于成功了。现在尝试一些错误处理。我不能让它工作。当用户不提供条目时,我试图向用户显示一个错误。我该怎么做呢。我理解我们需要和if-then语句,但考虑到我的代码,我应该把它放在哪里呢。再次感谢!谢谢你的帮助。我终于成功了。现在尝试一些错误处理。我不能让它工作。当用户不提供条目时,我试图向用户显示一个错误。我该怎么做呢。我知道我们需要一个if-then语句,但是考虑到我的代码,我应该把它放在哪里呢。再次感谢!