我正在研究一个查询SQL数据库的Excel应用程序.查询可能需要很长时间才能运行(20-40分钟).如果我错过了编码,可能需要很长时间才能出错或达到断点.我可以将结果保存到工作表中,当我使用记录集时,事情会爆炸.
当我调试跳过查询数据库时(第一次之后),有没有办法将数据加载到ADODB.Recordset?
我会用这样的东西吗?
我知道我在想这个,但我想检查单个记录中的单个值/字段.例如,我想知道主键为33的记录中"closedDate"字段的值是否为null.
我想的是:
dim db as DAO.Database
dim rs as DAO.Recordset
set db = CurrentDb
set rs = db.OpenRecordset("record_holdData")
If not isNull(rs.Fields("closedDate")) then
'do nothing
Else
'add a close date
End If
Run Code Online (Sandbox Code Playgroud)
但我不认为这是对的.它没有指定记录号.在应用程序中,表单通过绑定到相关记录来打开,但我不认为CurrentDb考虑到这一点而是引用整个表.
所以我的问题是,如何以这种方式打开记录集并仅在该特定记录中引用该字段?
在下面的代码中,我尝试使用Command对象中的ADODB打开记录集,但它告诉我记录集不可更新.我很难做到这一点.
当我尝试使用.Open方法和Command.Execute,传递adOpen {Static | Dynamic},adLock {Optimistic | Pessimistic}时,它给出了以下错误:
运行时错误'3001'
参数类型错误,超出可接受范围或彼此冲突.
Dim cmdActionLog As ADODB.Command
Function LogAction(ActionID As Integer, Optional StartedOn As Date, Optional EndedOn As Date, Optional SuccessFlag As Boolean = True)
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
rs.LockType = adLockOptimistic
rs.CursorType = adOpenStatic
rs.Open cmdActionLog.Execute(Parameters:=Array(ActionID)), , adOpenStatic, adLockOptimistic
'Set rs = cmdActionLog.Execute(Parameters:=Array(ActionID))
If Not rs.EOF Then
If StartedOn Then rs!LAST_STARTED_ON = StartedOn
If EndedOn Then rs!LAST_ENDED_ON = StartedOn
rs!SUCCESS_FLAG = SuccessFlag
rs.Update
Else
Debug.Print "No action …Run Code Online (Sandbox Code Playgroud) 我在模型中添加了一些字段,stock.move然后导入CSV文件以创建一些记录.我查看了所有行,然后逐个创建记录,如下所示:
lot_id = self._get_lot_id(
n, row, product_id, picking_type_id,
box_quantity, product_uom_qty
)
move = {
'auto_lot_name': False,
'box_quantity': 2,
'client_order_ref': '581002',
'date': datetime.datetime(2017, 6, 24, 19, 55, 52, 372648),
'invoice_state': '2binvoiced',
'location_dest_id': 9,
'location_id': 12,
'name': 'Product name',
'partner_id': 487,
'partner_shipping_id': 488,
'picking_type_id': 2,
'price_unit': 4.0,
'pricelist_id': 1,
'product_code': u'36033',
'product_id': 3,
'product_uom': 3,
'product_uom_qty': 6.0,
'restrict_lot_id': 12222, # lot_id
'tax_id': [(4, 67)]
}
result = self.env['stock.move'].create(move)
Run Code Online (Sandbox Code Playgroud)
如果方法需要,我会创建批次_get_lot_id.如果已经创建了批次,则返回id.这很好用
它非常简单并且可以很好地工作很多次,但有时我会得到以下错误,尽管我restrict_lot_id只在字典中填充了一个id.看起来它正在追加前一个循环的批次ID.怎么可能?我的数据库坏了吗?
File "/[ ... ]/import_moves/models/stock_picking_import_wizard.py", line 129, …Run Code Online (Sandbox Code Playgroud) 我已经搜索了高低,以获得以此格式返回查询结果的原因以及如何转换为列表的答案.
data = cursor.fetchall()
当我打印数据时,它会导致:(('car',),('boat',),('plane',),('truck',))
我希望将结果列为["汽车","船","飞机","卡车"]列表
通常,我使用以下语句连接到db;
rs.open"query",db,1,3
现在我试过(没有游标)
rs.open"query",db
新的一个带来了巨大的性能提升.
所以我想问你是否我没有设置游标,游标是默认的吗?
在 Access 2010 中制作一个表单。我正在尝试制作一个移动到下一条记录的按钮(如果它在最后,则是第一个),但是因为我想考虑其他用户对已发生的数据集的更新同时,我会在转到下一条记录之前重新查询表单。
我正在使用以下代码,改编自这篇 SO 帖子:
Private Sub NextRec_Click()
Dim currentID As Long
currentID = Me.id.Value
'Here is where the requery brings the form back to the first record
Me.Requery
With Me.RecordsetClone
.FindFirst "id=" & currentID
If Not .NoMatch Then
If Me.Dirty Then
Me.Dirty = False
End If
Me.Bookmark = .Bookmark
End If
End With
If Me.CurrentRecord < Me.Recordset.RecordCount Then
DoCmd.GoToRecord , , acNext
Else
DoCmd.GoToRecord , , acFirst
End If
End Sub
Run Code Online (Sandbox Code Playgroud)
它工作正常,除了.requery导致表单在返回到当前记录然后返回到下一条记录之前短暂返回到第一条记录。我不希望它这样做 - …
我使用以下代码从我的数据表中选择数据:
DataRow[] result = table.Select("Size >= 230 AND Sex = 'm'");
Run Code Online (Sandbox Code Playgroud)
现在我更改datarow-array结果中的数据,我想更新我的数据表(datatable应该得到更改).哪种方法最简单?
在VB6中,我可以简单地在记录集上设置一个过滤器,编辑我的行并简单地保存我的更改.使用DataTables有类似的方法吗?
编辑:
我还有一个问题.什么,如果我想添加一个新行,我想重用相同的代码?
例如:
filteredRows = myDataset.Tables[0].Select("select where id = 1");
if (filteredRow.Lenght == 0) {
filteredRows = myDataset.Tables[0].NewRow();
}
// I wanna use this code, no matter if I edit a row, or if it is a new row.
filteredRows[index]["Name"] = "Max";
filteredRows[index]["Address"] = "Random Address";
filteredRows[index]["WhatEver"] = "...";
//...
Run Code Online (Sandbox Code Playgroud)
我试过这种方式,但它不会影响原始数据集.
警告:经典 ASP 领先。:)
我正在处理一个旧的经典 ASP 应用程序,但我遇到了一个奇怪的 ADODB.Recordset 对象。
我有一个包含特定字段的 SQL2012 数据库表。我们称之为AnnoyingField。它在 SQL 中的数据类型是“日期”。
ASP 在表上打开一个带有 SELECT 的 ADODB.Recordset 来收集字段,然后执行一些循环来完成它的工作:
For each Field in rs.Fields
typeid = rs(Field.Name).Type
'do stuff based on type
Run Code Online (Sandbox Code Playgroud)
出于某种原因,AnnoyingField的类型返回为 202 (nvarchar),而不是日期的预期类型之一(133 甚至 7)。这在代码中导致了一些问题。
我用另一个“日期时间”类型的字段进行了测试,记录集代码返回了日期时间字段的预期类型.. 135。
任何人都知道为什么“日期”字段作为 nvarchar 返回?
在这种情况下,可能无法将数据库字段从日期更改为日期时间,即使这可能是获取预期数据的逻辑路径。
我正在寻找的东西对我来说似乎很简单,但我的谷歌失败了。
我想要一个允许我运行任何查询并获取 json 格式结果的方法。
诀窍是我不希望结果需要 java 对象作为过程的一部分(DTO、VO 等)。
有什么快速/简单/干净的方法可以做到这一点吗?