我一直在使用cmd.Parameters.AddWithValue,而没有指定DBType(int,varchar,...)来运行查询.查看SQL事件探查器之后,使用此方法运行的查询似乎比指定数据类型时运行速度慢很多.
为了让您了解它的速度有多慢,这是一个例子.该查询是对单个表的简单查找,并且where语句中的列已编制索引.指定数据类型时,某个查询运行大约0 MS(对于要测量的sql server来说太小),并且需要41次读取.当我删除DBType时,它可能需要大约200毫秒,并且10000次读取才能完成查询.
我不确定它是仅仅是SQL Profiler误报的值,还是这些值实际上是正确的,但它是可重现的,因为我可以添加和删除DBType,它将产生SQL Profiler中给出的值.
有没有其他人遇到这个问题,并有一个简单的方法来解决它.我意识到我可以在我的代码中添加数据类型,但这似乎要添加很多东西,如果有更简单的方法来修复它,那将非常感激.
[编辑]
经过一些初步测试(在循环中运行两个场景)之后,探测器给出的值似乎是准确的.
就像添加的信息一样,我在Windows XP Pro上运行.Net 2.0,在Windows 2000上运行SQL Server 2000 for DB.
[UPDATE]
经过一番挖掘,我能够找到这篇博文,这可能是相关的.似乎.Net中的字符串值(因为它们是unicode)会自动创建为nvarchar参数.我将不得不等到星期一,当我开始工作,看看我是否可以做一些解决问题的方法.似乎我必须设置数据类型,这是我试图避免的.
这个问题并没有出现在我所做的每一个查询中,只有少数几个,所以我仍然可能只是在查询中设置DBType有问题,但我正在寻找一个更通用的问题解决方案.
我在使用ADO时遇到了一些麻烦.我已经部署了一个使用Access的数据库应用程序.随着不同版本的发布,数据库表具有不同的字段,一些添加了其他字段,等等.我无法工作的是如何在数据库中添加BOOLEAN字段.
出于升级目的,我使用标准sql查询组件和一个如下所示的sql:
ALTER TABLE XXX ADD COLUMN YY BOOLEAN
Run Code Online (Sandbox Code Playgroud)
虽然这适用于其他数据类型,如VARCHAR,INTEGER,DOUBLE等,但它不适用于BOOLEAN.我怀疑它是Access的错,它的布尔值是YES/NO,但是谁知道.
另外如何使用TADOTable向表中添加字段?
提前致谢.
我有从excel到访问的以下ado连接,但它不起作用,我得到上面的错误.有任何想法吗?
Sub ADO_to_access()
Dim database As New ADODB.Connection // ERROR HERE
Dim connectionstring As String
Dim NewSet As Recordset
Dim CurrentSheet As Worksheet
Set CurrentSheet = ActiveSheet
Set objaccess = Nothing
connectionstring = "Provider=Microsoft.Jet.OLEDB.4.0; " & _
"Data Source=C:\Users\Carlos\Desktop\VBA - CW - Database.mdb;"
database.Open connectionstring
' ************* MEN
Set NewSet = New ADODB.Recordset
NewSet.Open "Mens_Dept_Data", database, adOpenKeyset, adLockOptimistic, adCmdTable
x = 6
Do While Len(Range("P" & x).Formula) > 0
With NewSet
.AddNew
.Fields("Irina").Value = CurrentSheet.Range("P" & x).Value
.Fields("Thomas").Value = CurrentSheet.Range("Q" …Run Code Online (Sandbox Code Playgroud) 我正在使用Delphi 7和ms SQL server 2008.我有一个DBGrid(如果你知道的话,它是一个名为TEnhDBGrid的自定义控件)和一个ADO连接.我正在使用ADOQuery来填充我的网格:
with dbMod.clientQuery do
begin
sql.text:='select * from client order by id';
open;
end;
clientGrid.Columns[0].visible:=false;
clientGrid.Columns[1].width:=110;
clientGrid.Columns[2].width:=170;
clientGrid.Columns[3].width:=100;
clientGrid.Columns[4].width:=100;
Run Code Online (Sandbox Code Playgroud)
查询返回的DB中"client"表的字段是:

我想在网格中选择具有特定ID的行,我似乎无法弄明白.
我在谈论Delphi + ADO + MSSQL.好的,我知道带参数的查询对SQL注入非常安全.另一方面,动态查询非常不安全.但是经典的FieldByName方法呢?我可以安全地为FieldByName分配一个绝对任意的字符串值,而不用冒险注入吗?
我不确定为什么会这样,所以我将简要解释一下情况(应该很容易理解):
Form1一个执行sql select语句并在通过TDataSource组件链接到ADOQuery1组件的dbgrid上显示它的过程:
procedure form1. Selectp;
begin
ADOQuery1.Active:=false;
ADOQuery1.SQL.Text:='select * from tbl';
ADOQuery1.Active:=true;
end;
Run Code Online (Sandbox Code Playgroud)
Form1有一个按钮,可以打开一个新表单来输入记录字段:
procedure form1. buttonaddrecordClick(Sender: TObject);
var
form2:Tform;
begin
form2:=Tform2.Create(nil);
try
form2.ShowModal;
finally
form2.Release;
end;
selectp;//executes but new record doesn’t show up although in database;
end;
Run Code Online (Sandbox Code Playgroud)
Form2有一个过程,通过form2.ADOQuery2将值插入数据库.
procedure form2.Insertp;
begin
ADOQuery2.Active:=false;
ADOQuery2.SQL.Text:='insert into tbl (field1) values ('''+ sfield +''')';
ADOQuery2.ExecSql;
ModalResult := mrOk;
end;
Run Code Online (Sandbox Code Playgroud)
如果我在form1上放置一个按钮来运行selectp,我必须在新记录显示之前按下它2次以上但是在buttonaddrecord中showmodal之后调用selectp多少次并不重要新记录没有出现.
造成这种情况的原因是什么以及如何纠正?
我正在尝试在数据表视图中的access07子表单中显示ADO记录集.只是一个快照,只读.连接成功,记录集包含数据,但是,当我设置子表单记录集时,不显示任何字段.子窗体显示一个垂直滚动条,当滚动到底部时,它表示正确的记录数,但它没有显示任何字段,没有显示任何列.
这一定很简单,我很想念.有任何想法吗?
编辑:这是建立记录集的代码的摘要.
Set cn = New ADODB.Connection
Set rsADO = New ADODB.Recordset
dbBackend = "C:\Users\Me\Desktop\TEST_Db_Backend.accdb"
sqlStr = "SELECT * FROM tblMaster;"
strConnect = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & dbBackend & ";User Id=;Password=;"
cn.CursorLocation = adUseClient
cn.ConnectionString = strConnect
cn.Open
If cn.State = adStateOpen Then
rsADO.Open sqlStr, cn, adOpenStatic, adLockReadOnly
End If
Set Me.PreviewPane.Form.Recordset = rsADO
rsADO.Close
cn.Close
Set rsADO = Nothing
Set cn = Nothing
Run Code Online (Sandbox Code Playgroud) 是否有任何解决方案,以便在等待数据来自数据库时不冻结我的UI?
例:
我们有一个adoquery,我们这样做
adoquery.active:=false; adoquery.active:=true;
当adoquery尝试从db获取数据时,UI中的所有内容都被冻结,如果用户单击,则整个程序变为无响应!!
有没有解决这个问题的方法?
我正在使用属性并实现包含共享ADO连接的DLL,并将其跨越DLL边界传递到其他实例.我需要确保COM已初始化,所以我需要调用/ .目前它位于VCL主线程的上下文中,但可能位于另一个线程的其他位置,当然需要其自己的COM实例.我目前没有实现多线程.ConnectionObjectTADOConnectionTADOConnectionCoInitializeCoUninitialize
在哪里适当地称呼这些; DLL内部(在加载/卸载期间),DLL外(调用进程),还是两者兼而有之?考虑到它只有一个线程,它不应该只是在原始进程中DLL之外的一次吗?
我假设原始调用线程应该对此负责,因为COM在线程的上下文中运行.当然,双方调用它们不应该伤害任何一个,但它也会创建多个COM实例.
长话短说......在这种情况下,"安全吗?" 或者只保留一个COM实例很重要?
我有一个T-SQL和查询:
string queryString = @"SELECT AGENT.Number, PERSON.LoginName, AGENT.EnterpriseName FROM Agent AGENT INNER JOIN Person PERSON ON AGENT.PersonID = PERSON.PersonID WHERE LOWER(EnterpriseName) LIKE @entname";
string connStr = null;
try
{
connStr = ConfigurationManager.ConnectionStrings["DB"].ConnectionString + ToInsecureString(Decrypt(ConfigurationManager.AppSettings["admin"])) + ";";
}
catch (Exception ex)
{
Logs.WriteMessage("Error while making connStr " + ex.TargetSite + ex.StackTrace + ex.ToString());
}
try
{
using (SqlConnection connection = new SqlConnection(connStr))
{
connection.Open();
using (SqlCommand command = new SqlCommand(queryString, connection))
{
SqlParameter param = new SqlParameter
{
ParameterName = "@entname", …Run Code Online (Sandbox Code Playgroud)