Set rs = command.Execute
if not rs.EOF then
'logic here
end if
Run Code Online (Sandbox Code Playgroud)
上面的代码在第2行失败,因为rs已关闭(可能oledb提供程序错误地认为它是一个insert命令,所以不需要返回任何内容).该命令是一个插入语句,如:
Insert into log(Name,Value) values("xxx", 123); select scope_identity()
Run Code Online (Sandbox Code Playgroud)
我需要在一次往返中从服务器返回身份.有任何想法吗?
PS:更新了带字段名称的插入语句(感谢Eduardo),但这不是问题.
是否有一种快速方法可以从Windows Scripting Host 操作现有 XLS文件的内容?
我们收到了客户提供的Excel模板.我们的任务是使用从Oracle数据库中获取的数据填充这些模板.
目前的方法是使用Windows Scripting Host和VBScript:
使用ADODB从Oracle获取数据:
Set db = CreateObject("ADODB.Connection")
SQL = "SELECT ..."
Set rs=db.execute(SQL)
Run Code Online (Sandbox Code Playgroud)使用VBScript在Windows Scripting Host中创建Excel对象:
Set objExcel = CreateObject("Excel.Application")
Set objWorkbook = objExcel.Workbooks.Open(xls_final)
Set objSheet = objWorkBook.Sheets(1)
Run Code Online (Sandbox Code Playgroud)然后像这样逐个单元填写模板:
If rs.EOF = False Then
rs.MoveFirst
Do Until rs.EOF
objSheet.Cells(RowNumber, 1).Value = rs("COLUMN1")
objSheet.Cells(RowNumber, 2).Value = rs("COLUMN2")
objSheet.Cells(RowNumber, 3).Value = rs("COLUMN3")
rs.MoveNext
Loop
End If
objWorkbook.Save
rs.Close
Run Code Online (Sandbox Code Playgroud)
问题是这些文件中的一些包含大量数据,并且需要花费数小时来填充它们.有更快的方法吗?
我有一个带有一些数据库控件的Delphi表单.
为了表示一个日期,我使用了TJvDBDatePickerEdit(来自JCL),它有一个很好的属性
ShowCheckBox := True;
Run Code Online (Sandbox Code Playgroud)
允许用户输入没有已知日期(DBNull).
我验证,使DatePicker归零按预期工作:
procedure Tframe.adoQueryBeforePost(DataSet: TDataSet);
begin
if (qryAuftraege.FieldByName('MyDateField').IsNull) then
begin
ShowMessage('IsNull!');
end;
end;
Run Code Online (Sandbox Code Playgroud)
消息框显示.所以ADO组件应该写的字段是varNull类型.
现在有这个管道:
TADOQuery -> TADOConnection -> MS OLE DB Provider for ODBC Drivers -> MySQL ODBC 5.1 Driver
Run Code Online (Sandbox Code Playgroud)
MySQL ODBC驱动程序现在显示在它的日志中:
UPDATE `db`.`table` SET `MyDateField`=_latin1'0004-00-00' WHERE `ID`=5 AND `MyDateField`=_latin1'2009-06-17';
Run Code Online (Sandbox Code Playgroud)
好吧,日期存储为'0004-00-00'(MySQL似乎保存这样).现在在查询条目时,它被Delphi识别为Null,但是当它下次更新时,调用:
UPDATE `bvl`.`auftraege` SET `MyDateField`=_latin1'2009-06-17' WHERE `ID`=5 AND `MyDateField` IS NULL;
Run Code Online (Sandbox Code Playgroud)
当然失败了,因为MyDateField不是NULL(至少在MySQL DB中).
这个字符串'0004-00-00'来自哪里?如果它是某个地方的错误,我可以在哪里拦截它?
我已经知道有些组件可以提供直接的MySQL连接(我假设)没有显示这种行为.
我正在尝试打开ADOConnection组件.数据库采用MDB格式.我使用JET来访问它.
每当我在我的代码中使用AdoConnection.Open时,窗口会弹出并请求userid和pass.我为userid输入"Admin"并将密码保留为空,它可以工作,但我不想弹出这个窗口.我尝试使用AdoConnection.Open('Admin','');但窗口仍然弹出.有什么建议?
当SQL批处理从例如print语句返回多个消息时,我只能使用ADO连接的Errors集合检索第一个消息.我如何获得其余的消息?
如果我运行此脚本:
Option Explicit
Dim conn
Set conn = CreateObject("ADODB.Connection")
conn.Provider = "SQLOLEDB"
conn.ConnectionString = "Data Source=(local);Integrated Security=SSPI;Initial Catalog=Master"
conn.Open
conn.Execute("print 'Foo'" & vbCrLf & "print 'Bar'" & vbCrLf & "raiserror ('xyz', 10, 127)")
Dim error
For Each error in conn.Errors
MsgBox error.Description
Next
Run Code Online (Sandbox Code Playgroud)
然后我只回到"Foo",从不"Bar"或"xyz".
有没有办法获取剩余的消息?
在我的一个客户端运行一个旧的VB应用程序.这个代码中有一个例外:
cn=GetIndexDatabaseConnectionString()
sSql="SELECT * FROM Arh_Naroc WHERE StNarocila = '" & isci & "'"
rs=CreateObject("ADODB.Recordset")
Call rs.Open(sSql,cn)
Run Code Online (Sandbox Code Playgroud)
异常发生在rs.Open()函数中."错误号码440发生了."
这是KOFAX引擎的SBL脚本,它已有很多年了.整个SW从旧的XP计算机转移到Windows 7,看起来到处都有问题.
有人可以帮我确定这里的问题.至少如果我能在msgbox中收到正确的错误消息将是最有帮助的.
编辑:这是连接字符串函数.
Function GetIndexDatabaseConnectionString
Dim objXmlDocument As Object
Dim objXmlGlobalSettingsFileParh As Object
Dim objXmlIndexDatabaseConnectionString As Object
Dim strGlobalSettingsFilePath As String
Dim strTemp As String
Const strSettingsFilePath = "C:\Data\LocalDocsDistibutingSystem\Settings.xml"
Set objXmlDocument = CreateObject("MSXML2.DOMDocument")
objXmlDocument.Load strSettingsFilePath
Set objXmlGlobalSettingsFileParh = objXmlDocument.selectSingleNode("DocsDistributingSystem/GlobalSettingsFilePath")
strGlobalSettingsFilePath = objXmlGlobalSettingsFileParh.childNodes(0).Text
Set objXmlGlobalSettingsFileParh = Nothing
Set objXmlDocument = Nothing
Set objXmlDocument = CreateObject("MSXML2.DOMDocument")
objXmlDocument.Load strGlobalSettingsFilePath
Set objXmlIndexDatabaseConnectionString = …Run Code Online (Sandbox Code Playgroud) 我有一个遗留的ASP应用程序,我需要在现代服务器上发布.它使用ADO和SQLOLEDB与MS SQL Server通信.它使用用户名和密码登录SQL.
该应用程序依赖于似乎已更改的ADO Connection对象的特殊行为.这些天(在ADODB.Connection.6中),当您向Connection提供连接字符串然后将其检索回来时,您不会获得原始字符串的精确副本; 具体来说,从中删除用户名和密码,并添加一些额外的参数.
看起来旧版本的ADO在这种情况下没有剥离凭证; 如果它应用程序将永远不会工作,它的工作原理.问题 - 这是记录在案的吗?有没有办法在新的ADO中强制执行遗留行为?
我真的不想在共享服务器上降级ADO.
编辑:只是将它隔离到一个最小的测试用例.适用于Windows 2003上的Connection.2.80(msado15.dll v.2.82.5011.0),在Windows 2008上的Connection.6上失败(dll v.6.1.7600.17036).
EDIT2:官方称,旧的MDAC 2.8(ADO是其中的一部分)在Vista及更高版本上不受支持.所以降级并不是一个真正的选择.
我一直在寻找解决方案,我发现自己空手而归.
问题是:如果列引用没有明确的标题行,是否可以针对工作表构建SQL查询?
很容易:
| A | B 1 | FirstName | LastName 2 | John | Davis 3 | Mary | Parker
SELECT [LastName] FROM [Sheet1$] WHERE [FirstName] = 'John'
- >"戴维斯"
但是,我倾向于使用无标题的CSV文件,所以如果我没有引导标题行,我该怎么办?
| A | B 1 | John | Davis 2 | Mary | Parker
SELECT ??? FROM [Sheet1$] WHERE ??? = 'John'
为了扩展这个问题,知道如何引用行号也是同样有趣的 - 如果可能的话 - 说我想找到相对于行[2]的姓氏(B列)
提前感谢我对难题的任何意见!
-B
我们正在Delphi XE5(即将成为DX)中将近200万行代码从BDE迁移到SQL Server.
我们遇到了一个大问题.
我们一直在使用ADO,但微软未能在同时具有单引号和井号的字符串上实现.Locate.例:
TADOQuery1.Locate('FieldName', '2x4'' 10#', [])
Run Code Online (Sandbox Code Playgroud)
失败了:
参数类型错误,超出可接受的范围,或彼此冲突.
Microsoft的ADO文档声明这将失败.我们可以在ADODB.pas中看到它发生.对于简单的一个变量定位和定位包含多个变量.
我们没有选择在WHERE字符串的标准查询中进行这些定位,因为它们处于紧密循环中.
问题:FireDAC有这个问题吗?有人可以帮我们一个忙,实际上尝试以上.在FireDac中定位吗?
从ADO迁移到Firedac会遇到什么令人不快的"惊喜"?
谢谢.
根据标题,创建ADODB对象或访问对象是否更好然后使用DOCMD.runsql?我通常使用Excel工作表和访问表.哪种方法更快,更灵活可靠?有一些细节是赞成还是反对?