我是数据库新手,并从我们的数据库人员那里得到了这个查询。不幸的是他的最后一天是昨天。当我在Oracle SQL Developer中运行查询时,它可以在不到一秒的时间内返回20条记录,但是当我在Excel VBA中尝试它时,它会给我第一个运行时错误'-2147217900(80040e14)'行上的自动化错误。打开StrQuery,cnn“。SQL查询中的Excel VBA自动化错误
这是我的代码。
'Initializes variables
Dim cnn As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim ConnectionString As String
Dim StrQuery As String
'Setup the connection string for accessing MS SQL database
ConnectionString = "Provider=OraOLEDB.Oracle;Password=XXXXX;User ID=XXXXX;Data Source=XXXXX;"
'Opens connection to the database
cnn.Open ConnectionString
'Timeout error in seconds for executing the entire query
cnn.CommandTimeout = 90
'Query String
StrQuery = "SELECT "
StrQuery = StrQuery & "distinct dbo.mfg_order.mfg_order_name, "
StrQuery = StrQuery & "dbo.mfg_order.mfg_bill_letter, "
StrQuery = StrQuery & "dbo.mfg_order.mfg_order_name || '-' || dbo.mfg_order.mfg_bill_letter as mfg_order_bill, "
StrQuery = StrQuery & "dbo.pcb_header.position_seq_nbr || '00', "
StrQuery = StrQuery & "D2.mfg_catg as catg,D2.mfg_catg_value as catgvalue "
StrQuery = StrQuery & "FROM "
StrQuery = StrQuery & "dbo.sales_order, "
StrQuery = StrQuery & "dbo.planned_shipment, "
StrQuery = StrQuery & "dbo.eco_include_exclude, "
StrQuery = StrQuery & "dbo.mfg_note_header, "
StrQuery = StrQuery & "dbo.pcb_subset, "
StrQuery = StrQuery & "dbo.pcb_detail D2, "
StrQuery = StrQuery & "dbo.pcb_header, "
StrQuery = StrQuery & "dbo.mfg_order "
StrQuery = StrQuery & "WHERE "
StrQuery = StrQuery & "(dbo.mfg_order.mfg_order_name = dbo.pcb_header.mfg_order_name) and "
StrQuery = StrQuery & "(dbo.mfg_order.mfg_bill_letter = dbo.pcb_header.mfg_bill_letter) and "
StrQuery = StrQuery & "(dbo.mfg_order.mfg_order_revision = dbo.pcb_header.mfg_order_revision) and "
StrQuery = StrQuery & "(dbo.mfg_order.planned_shipment_nbr = dbo.planned_shipment.planned_shipment_nbr (+)) and "
StrQuery = StrQuery & "(dbo.mfg_order.sales_ord_id = dbo.planned_shipment.sales_ord_id (+)) and "
StrQuery = StrQuery & "(dbo.mfg_order.sales_ord_id = dbo.sales_order.sales_ord_id (+)) and "
StrQuery = StrQuery & "(dbo.pcb_header.pcb_header_id = dbo.pcb_subset.pcb_header_id (+)) and "
StrQuery = StrQuery & "(dbo.mfg_order.mfg_order_name = dbo.eco_include_exclude.mfg_order_name (+)) and "
StrQuery = StrQuery & "(dbo.mfg_order.mfg_bill_letter = dbo.eco_include_exclude.mfg_bill_letter (+)) and "
StrQuery = StrQuery & "(dbo.mfg_order.mfg_order_revision = dbo.eco_include_exclude.mfg_order_revision (+)) and "
StrQuery = StrQuery & "(dbo.mfg_order.mfg_order_name = dbo.mfg_note_header.mfg_order_name (+)) and "
StrQuery = StrQuery & "(dbo.mfg_order.mfg_bill_letter = dbo.mfg_note_header.mfg_bill_letter (+) ) and "
StrQuery = StrQuery & "(dbo.mfg_order.mfg_order_revision = dbo.mfg_note_header.mfg_order_revision (+)) and "
StrQuery = StrQuery & "(dbo.pcb_header.pcb_header_id = D2.pcb_header_id) and "
StrQuery = StrQuery & "dbo.mfg_order.bu_mfg_loc_id = 5 AND "
StrQuery = StrQuery & "dbo.pcb_header.prod_code='0050' AND "
StrQuery = StrQuery & "dbo.mfg_order.mfg_order_type = 'SO' and "
StrQuery = StrQuery & "dbo.pcb_header.mfg_prod_grp = 'FN05' AND "
StrQuery = StrQuery & "(D2.mfg_catg = 'FSIZ') AND "
StrQuery = StrQuery & "D2.MFG_CATG_VALUE='28FB' AND "
StrQuery = StrQuery & "dbo.mfg_order.MFG_BILL_LETTER='A' AND "
StrQuery = StrQuery & "LENGTH(dbo.mfg_order.MFG_ORDER_NAME)=7;"
'Check Query
Debug.Print StrQuery
'Performs the actual query
rst.Open StrQuery, cnn
'Dumps all the results from the StrQuery into cell A2 of the first sheet in the active workbook
'Sheets(1).Range("A2").CopyFromRecordset rst
End Sub
调试给我查询:
SELECT distinct dbo.mfg_order.mfg_order_name, dbo.mfg_order.mfg_bill_letter, dbo.mfg_order.mfg_order_name || '-' || dbo.mfg_order.mfg_bill_letter as mfg_order_bill, dbo.pcb_header.position_seq_nbr || '00', D2.mfg_catg as catg,D2.mfg_catg_value as catgvalue FROM dbo.sales_order, dbo.planned_shipment, dbo.eco_include_exclude, dbo.mfg_note_header, dbo.pcb_subset, dbo.pcb_detail D2, dbo.pcb_header, dbo.mfg_order WHERE (dbo.mfg_order.mfg_order_name = dbo.pcb_header.mfg_order_name) and (dbo.mfg_order.mfg_bill_letter = dbo.pcb_header.mfg_bill_letter) and (dbo.mfg_order.mfg_order_revision = dbo.pcb_header.mfg_order_revision) and (dbo.mfg_order.planned_shipment_nbr = dbo.planned_shipment.planned_shipment_nbr (+)) and (dbo.mfg_order.sales_ord_id = dbo.planned_shipment.sales_ord_id (+)) and (dbo.mfg_order.sales_ord_id = dbo.sales_order.sales_ord_id (+)) and (dbo.pcb_header.pcb_header_id = dbo.pcb_subset.pcb_header_id (+)) and (dbo.mfg_order.mfg_order_name = dbo.eco_include_exclude.mfg_order_name (+)) and (dbo.mfg_order.mfg_bill_letter = dbo.eco_include_exclude.mfg_bill_letter (+)) and (dbo.mfg_order.mfg_order_revision = dbo.eco_include_exclude.mfg_order_revision (+)) and (dbo.mfg_order.mfg_order_name = dbo.mfg_note_header.mfg_order_name (+)) and (dbo.mfg_order.mfg_bill_letter = dbo.mfg_note_header.mfg_bill_letter (+) ) and (dbo.mfg_order.mfg_order_revision = dbo.mfg_note_header.mfg_order_revision (+)) and (dbo.pcb_header.pcb_header_id = D2.pcb_header_id) and dbo.mfg_order.bu_mfg_loc_id = 5 AND dbo.pcb_header.prod_code='0050' AND dbo.mfg_order.mfg_order_type = 'SO' and dbo.pcb_header.mfg_prod_grp = 'FN05' AND (D2.mfg_catg = 'FSIZ') AND D2.MFG_CATG_VALUE='28FB' AND dbo.mfg_order.MFG_BILL_LETTER='A' AND LENGTH(dbo.mfg_order.MFG_ORDER_NAME)=7;
这是多一点的人可读的(无论是在SQL开发人员,这些工作之一):
SELECT
distinct dbo.mfg_order.mfg_order_name,
dbo.mfg_order.mfg_bill_letter,
dbo.mfg_order.mfg_order_name || '-' || dbo.mfg_order.mfg_bill_letter as mfg_order_bill,
dbo.pcb_header.position_seq_nbr || '00',
D2.mfg_catg as catg,D2.mfg_catg_value as catgvalue
FROM
dbo.sales_order,
dbo.planned_shipment,
dbo.eco_include_exclude,
dbo.mfg_note_header,
dbo.pcb_subset,
dbo.pcb_detail D2,
dbo.pcb_header,
dbo.mfg_order
WHERE
(dbo.mfg_order.mfg_order_name = dbo.pcb_header.mfg_order_name) and
(dbo.mfg_order.mfg_bill_letter = dbo.pcb_header.mfg_bill_letter) and
(dbo.mfg_order.mfg_order_revision = dbo.pcb_header.mfg_order_revision) and
(dbo.mfg_order.planned_shipment_nbr = dbo.planned_shipment.planned_shipment_nbr (+)) and
(dbo.mfg_order.sales_ord_id = dbo.planned_shipment.sales_ord_id (+)) and
(dbo.mfg_order.sales_ord_id = dbo.sales_order.sales_ord_id (+)) and
(dbo.pcb_header.pcb_header_id = dbo.pcb_subset.pcb_header_id (+)) and
(dbo.mfg_order.mfg_order_name = dbo.eco_include_exclude.mfg_order_name (+)) and
(dbo.mfg_order.mfg_bill_letter = dbo.eco_include_exclude.mfg_bill_letter (+)) and
(dbo.mfg_order.mfg_order_revision = dbo.eco_include_exclude.mfg_order_revision (+)) and
(dbo.mfg_order.mfg_order_name = dbo.mfg_note_header.mfg_order_name (+)) and
(dbo.mfg_order.mfg_bill_letter = dbo.mfg_note_header.mfg_bill_letter (+) ) and
(dbo.mfg_order.mfg_order_revision = dbo.mfg_note_header.mfg_order_revision (+)) and
(dbo.pcb_header.pcb_header_id = D2.pcb_header_id) and
dbo.mfg_order.bu_mfg_loc_id = 5 AND
dbo.pcb_header.prod_code='0050' AND
dbo.mfg_order.mfg_order_type = 'SO' and
dbo.pcb_header.mfg_prod_grp = 'FN05' AND
(D2.mfg_catg = 'FSIZ') AND
D2.MFG_CATG_VALUE='28FB' AND
dbo.mfg_order.MFG_BILL_LETTER='A' AND
LENGTH(dbo.mfg_order.MFG_ORDER_NAME)=7;
是否查询选择任何罕见的数据类型,例如'LONG','CLOB','TIMESTAMP'? –
一切都是一个字符串或一个整数。 –
您是否为32位安装了Oracle客户端和oledb提供程序? –