Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.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连接中出错_Sql Server_Vba_Excel_Database Connection - Fatal编程技术网

Sql server &引用;“应用程序定义或对象定义”;VBA-SQL连接中出错

Sql server &引用;“应用程序定义或对象定义”;VBA-SQL连接中出错,sql-server,vba,excel,database-connection,Sql Server,Vba,Excel,Database Connection,我正在尝试为SQL连接编写EXE Vba代码。代码首先会打开与服务器的连接,然后它会将4列表格(范围(“C22:G81”))从我的Excel工作表复制到SQL server(我现在只是尝试发送数字表格作为测试,我不发送任何列名) 很长一段时间以来,我一直试图解决“应用程序定义或对象定义”错误。我得到连接字符串strCon=“Provider=Microsoft.ACE.OLEDB.12.0;Data Source=“&strName&“Extended Properties=”“Excel 12

我正在尝试为SQL连接编写EXE Vba代码。代码首先会打开与服务器的连接,然后它会将4列表格(
范围(“C22:G81”)
)从我的Excel工作表复制到SQL server(我现在只是尝试发送数字表格作为测试,我不发送任何列名)

很长一段时间以来,我一直试图解决“应用程序定义或对象定义”错误。我得到连接字符串
strCon=“Provider=Microsoft.ACE.OLEDB.12.0;Data Source=“&strName&“Extended Properties=”“Excel 12.0;”的错误。

我甚至尝试了另一个带有密码选项的版本,比如
strCon=“Provider=Microsoft.ACE.OLEDB.12.0;Data Source=“&strName&“Extended Properties=”“Excel 12.0;Jet-OLEDB:Database password='passwd';”

但我也犯了同样的错误。我是SQL编码方面的新手。我想知道我是否错过了一些重要的事情

Lasly,我不知道这是否与此错误有关,但我在SQL server中为Excel中的4列手动创建了4列。我是否需要编写一些特定的内容,以便Excel工作表中的这4列在SQL server中找到正确的列

先谢谢你

守则:

Private Sub-insining()
将我的工作簿设置为工作簿
将rs设置为新ADODB.Recordset
Dim conn作为新的ADODB连接
Dim ServerName为字符串,DataBaseName为字符串,strSQL为字符串
Set conn=新的ADODB.连接
ServerName=“E45c7642”
DataBaseName=“表”
'指定OLE DB提供程序
连接提供程序=“sqloledb”
'设置SQLOLEDB连接属性
conn.Properties(“数据源”).Value=ServerName
conn.Properties(“初始目录”).Value=DataBaseName
'Windows NT身份验证。
conn.Properties(“集成安全”).Value=“SSPI”
康涅狄格州公开赛
将有效工作表设置为工作表
像射程一样的模糊的头部跑偏
变暗数据范围作为范围
暗淡的颜色范围
将LastRange变暗为Range
将strName设置为字符串,strCon设置为字符串
strName=ThisWorkbook.FullName
Application.ScreenUpdating=False
Set ValidSheet=thishworkbook.Sheets(“Sheet2”)'
设置表头偏差=有效表范围(“C20:G21”)
Set ColRange=HeaderRange.Find(标题,xlother)
设置LastRange=ColRange.End(xlDown)
Set DataRange=ValidSheet.Range(“C22:G81”)'这就是我试图传输的内容,只传输没有列名的数值
strCon=“Provider=Microsoft.ACE.OLEDB.12.0;数据源=”&strName_
&“扩展属性=”“Excel 12.0;”
连接开放式strCon
strSQL=“从[”&ValidSheet.Name&“$”&Replace(数据范围,“$”,“”)和“]”中选择*
rs.Open strSQL、dbclass、adOpenStatic、adLockReadOnly
arrData=rs.GetRows
rs.Close
关闭连接
设置rs=无
设置连接=无
设置ValidSheet=Nothing
端接头
在得到“连接字符串”的相同错误后,我更改了策略,并使用dbclass过程打开连接。因此,新代码如下所示。(我从一个家伙那里找到了这个代码,但他现在正在度假,所以我不能问他)

它自动获取连接(dbclass)属性,这些属性保存在主工作簿中。这段代码没有给出任何错误,但它不会将列从Excel复制到数据库。我尝试了不同版本的sql查询,比如
sql=。。。。值('result')
SQL=。。。。值(结果)
,但再次没有结果,没有错误

Private Sub Testing_Click()

 Dim FindColValues() As Double
 Dim ValidBook As Workbook
 Dim ValidSheet As Worksheet

 Dim DataRange As Range

 Dim dataa  As Range 

    Application.ScreenUpdating = False

       TheSheet = "Sheet2"
       Set ValidSheet = Worksheets(TheSheet)

       Set DataRange = ValidSheet.Range("C21:C81")

  ' Below creating an array "result(it)" from the seleced range.
   For Each dataa In DataRange
       ReDim Preserve result(it)
       result(it) = dataa.Value
       it = it + 1
   Next

 ' Below is just an alternative array for "in case"  
   arrData = ValidSheet.Range("C22:G81").Value

  SQL = "INSERT INTO Table_test (Column1) VALUES ('result()');"

  dbclass.ExecuteSQL SQL

End Sub
下面是由其他函数自动读取的dbclass连接属性:

 Private Sub Workbook_Open()
   Dim connOk As Boolean
   Dim rs As New ADODB.Recordset
   Dim MyWorkBook As Workbook
   Dim CurSheet As Worksheet

   Set dbclass = New clsDB

   dbclass.Database = "Tables"
   dbclass.ConnectionType = SqlServer
   dbclass.DataSource = "E45c7642"
   dbclass.UserId = Application.UserName

   connOk = dbclass.OpenConnection(False, True)

   If connOk = False Then
   MsgBox "Cannot connect"

   Else
      MsgBox "The server is connected"

   End If

End Sub

最后,我发现了第二个代码的问题。正如我之前所写的,在我的替代代码(第二个代码)中,我在VBA中没有得到任何错误,但它没有将我的表保存到服务器中

现在我知道了原因,因为我的实际值是“逗号”格式的,但服务器保存的值是“点”格式的。因此,我添加了
Str(value)
以将“逗号”值转换为“点”值,它现在可以工作了:

....
SQL = "INSERT INTO Table_test (Column1) VALUES (" & Str(result(1)) & ")"
dbclass.ExecuteSQL SQL

End Sub

为什么要打开
dbclass
两次?此外,您还需要使用
“…=”“Excel 12.0”“;”
@Bond结束您的连接字符串,谢谢您的提示。现在,我删除了第一个连接行
dbclass.Open
,并在末尾添加了两个引号,正如您所显示的
“..=”“Excel 12.0”“;”
。但是,我仍然得到相同的错误。你能编辑你的问题并用你的新代码更新它吗?我也不清楚为什么要将属性分配给
dbclass
并使用连接字符串。您通常会使用其中一个。它们可能会引起彼此之间的冲突。看起来您可能正在尝试创建SQL和Excel连接?如果是这样,您将需要两个
ADODB.Connection
对象。如果您是在Excel VBA中编写的,我认为使用ADO获取数据不会有任何好处。只需使用arrData=ValidSheet.Range(“C22:G81”).值。这将使您转换
rs.GetRows
提供给您的内容,但您并没有对arrData执行任何操作。这引出了我的下一点:我本来希望看到一个INSERT INTO sql语句将数据放入表中,但我没有看到。感谢迪克和@Bond的贡献,就像我说的,作为一个新手,我可能会犯一些基本错误。但是,连接查询仍然存在相同的错误。现在我编辑了我的问题,我添加了另一个dbclass编码尝试。它不会给出任何错误,但不会将表从Excel复制到服务器。你们能看一下吗?