标签: ado

没有DBType的AddWithValue导致查询运行缓慢

我一直在使用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有问题,但我正在寻找一个更通用的问题解决方案.

.net sql ado prepared-statement

1
推荐指数
1
解决办法
2739
查看次数

ADO数据库表布尔列

我在使用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向表中添加字段?

提前致谢.

delphi field ado

1
推荐指数
1
解决办法
5831
查看次数

ADO执行 - 编译错误:未定义用户定义的类型

我有从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)

ms-access vba ado jet excel-vba

1
推荐指数
1
解决办法
5403
查看次数

delphi - 如果我知道数据库中的行ID,则在TdbGrid中选择一行

我正在使用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 delphi-7

1
推荐指数
1
解决办法
1992
查看次数

FieldByName注射安全吗?

我在谈论Delphi + ADO + MSSQL.好的,我知道带参数的查询对SQL注入非常安全.另一方面,动态查询非常不安全.但是经典的FieldByName方法呢?我可以安全地为FieldByName分配一个绝对任意的字符串值,而不用冒险注入吗?

sql-server delphi ado code-injection

1
推荐指数
1
解决办法
306
查看次数

Delphi ADOQuery在另一个ADOQuery插入之后没有拿起记录

我不确定为什么会这样,所以我将简要解释一下情况(应该很容易理解):

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多少次并不重要新记录没有出现.

造成这种情况的原因是什么以及如何纠正?

sql delphi ado

1
推荐指数
1
解决办法
2195
查看次数

Access子窗体不显示ado记录集

我正在尝试在数据表视图中的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)

vba ado recordset subform access-vba

1
推荐指数
1
解决办法
1638
查看次数

DELPHI XE3 ADO Query在等待数据时冻结我的应用程序

是否有任何解决方案,以便在等待数据来自数据库时不冻结我的UI?

例:

我们有一个adoquery,我们这样做

adoquery.active:=false; adoquery.active:=true;

当adoquery尝试从db获取数据时,UI中的所有内容都被冻结,如果用户单击,则整个程序变为无响应!!

有没有解决这个问题的方法?

delphi ado

1
推荐指数
1
解决办法
1003
查看次数

在DLL中调用CoInitialize/CoUninitialize的合适位置是什么?

我正在使用属性并实现包含共享ADO连接的DLL,并将其跨越DLL边界传递到其他实例.我需要确保COM已初始化,所以我需要调用/ .目前它位于VCL主线程的上下文中,但可能位于另一个线程的其他位置,当然需要其自己的COM实例.我目前没有实现多线程.ConnectionObjectTADOConnectionTADOConnectionCoInitializeCoUninitialize

在哪里适当地称呼这些; DLL内部(在加载/卸载期间),DLL外(调用进程),还是两者兼而有之?考虑到它只有一个线程,它不应该只是在原始进程中DLL之外的一次吗?

我假设原始调用线程应该对此负责,因为COM在线程的上下文中运行.当然,双方调用它们不应该伤害任何一个,但它也会创建多个COM实例.

长话短说......在这种情况下,"安全吗?" 或者只保留一个COM实例很重要?

delphi com dll ado

1
推荐指数
1
解决办法
850
查看次数

C#ADO.NET参数化查询

我有一个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)

.net c# ado

1
推荐指数
1
解决办法
88
查看次数