标签: sqlncli

SELECT语句后需要行计数:什么是最佳SQL方法?

我正在尝试从单个表中选择一个列(没有连接),我需要计算行数,理想情况是在开始检索行之前.我已经提出了两种方法来提供我需要的信息.

方法1:

SELECT COUNT( my_table.my_col ) AS row_count
  FROM my_table
 WHERE my_table.foo = 'bar'
Run Code Online (Sandbox Code Playgroud)

然后

SELECT my_table.my_col
  FROM my_table
 WHERE my_table.foo = 'bar'
Run Code Online (Sandbox Code Playgroud)

方法2

SELECT my_table.my_col, ( SELECT COUNT ( my_table.my_col )
                            FROM my_table
                           WHERE my_table.foo = 'bar' ) AS row_count
  FROM my_table
 WHERE my_table.foo = 'bar'
Run Code Online (Sandbox Code Playgroud)

我这样做是因为我的SQL驱动程序(SQL Native Client 9.0)不允许我在SELECT语句中使用SQLRowCount,但我需要知道结果中的行数,以便在为其分配数据之前分配数组.遗憾的是,在我的程序的这个方面,使用动态分配的容器不是一个选项.

我担心可能会出现以下情况:

  • 发生SELECT计数
  • 发生另一条指令,添加或删除一行
  • 发生数据SELECT,突然数组的大小错误.
    - 在更糟糕的情况下,这将尝试写入超出数组限制的数据并使我的程序崩溃.

方法2是否禁止此问题?

此外,两种方法中的一种会更快吗?如果是这样,哪个?

最后,是否有一个更好的方法我应该考虑(也许是一种方法来指示驱动程序使用SQLRowCount返回SELECT结果中的行数?)

对于那些问的人,我使用的是Native C++和上面提到的SQL驱动程序(由Microsoft提供).

sql odbc sqlncli

32
推荐指数
2
解决办法
22万
查看次数

'SQLNCLI'提供程序未在本地计算机sql server 2012上注册

致力于将应用程序从我的开发盒部署到客户端.在我运行我的exe的客户端上,我收到错误"'SQLNCLI10'提供程序未在本地计算机上注册.

我正在使用SQL Server 2012进行开发.我尝试在目标计算机上安装sqlncli.msi,但没有运气.

任何人都可以告诉我需要在客户端计算机上安装哪些软件包以使我的应用程序正常工作?如果可能的话,提供一个到所述包的URL?

谢谢!

sql sql-server sqlncli

8
推荐指数
2
解决办法
4万
查看次数

Delphi与SQL Server:OLEDB与Native Client驱动程序

我被告知SQL Native Client 应该比OLEDB驱动程序更快.所以我把一个实用工具放在一起进行两者之间的负载测试 - 结果好坏参半.有时一个更快,有时另一个更快,无论查询是什么(简单选择,where子句,join,order by等).当然,服务器承担了大部分工作量,但我对进入PC的数据到应用程序中可访问数据之间的时间感兴趣.

负载测试由非常小的查询组成,这些查询返回非常大的数据集.例如,我这样做select * from SysTables,这个表有50,000多条记录.在收到数据之后,我再次循环执行结果(使用while而不是Q.eof ... Q.next ...等).我也试过在查询中添加一些东西 - 比如order by Val哪里Val是一个varchar(100)字段.

这是我的负载测试仪的样本,最底部的数字是平均值...

在此输入图像描述

那么真的,两者之间有什么区别?我知道OLE非常灵活,支持许多不同的数据库引擎,而Native Client仅针对SQL Server.但是幕后还有什么呢?这又如何影响Delphi如何使用这些驱动程序?

这通过TADOConnection组件特别使用ADO TADOQuery.

我不一定在寻找或想办法提高性能 - 我只需要知道驱动程序之间的区别.

sql-server delphi oledb ado sqlncli

6
推荐指数
3
解决办法
9867
查看次数

SQL 本机客户端数据类型兼容性 - 与 SQLOLEDB 不兼容

在切换到使用 SQL Native Client (SQLNCLI) 作为 ADO 提供程序时,我们的旧应用程序遇到了问题。

我们原来的连接字符串是:

Provider=SQLOLEDB; Server=host; Database=bob; Integrated Security=SSPI;
Run Code Online (Sandbox Code Playgroud)

我们将其更改为:

Provider=SQLNCLI11; Server=host; Database=bob; Integrated Security=SSPI; DataTypeCompatibility=80;
Run Code Online (Sandbox Code Playgroud)

我们发现,在调用存储过程时,使用 adDBTimeStamp 参数,Native Client 似乎将时间戳视为 smalldatetime,而不是 datetime。这给我们带来了问题,因为我们在某些比较中使用 9999 年 12 月 31 日作为“最高端”日期,而 Native Client 因“无效日期格式”错误而失败,而 SQLOLEDB 没有问题。

现在看起来我们可能只能在创建参数时将 adDBTimeStamp 更改为 adDate 作为数据类型,但是我想知道在我们继续进行代码更改之前,连接字符串中是否缺少某些内容。

VBScript 代码重现如下。为免生疑问,在有人建议我们应该使用 12/31/9999 之前,日期格式是 UK (dd/mm/yyyy) :-) 但还要确认一下,CDate 不会失败。

Set db = CreateObject("ADODB.Command")

' If Provider=SQLOLEDB then there is no error.
db.ActiveConnection = "Provider=SQLNCLI11; Server=host; Database=bob; Integrated Security=SSPI; DataTypeCompatibility=80;"
db.CommandText = "usp_FetchData"
db.CommandType = &H0004

' …
Run Code Online (Sandbox Code Playgroud)

vb6 vbscript ado sqlncli

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

由2个SQL连接创建的死锁,每个使用事务,不同的表,两个表之间的外键约束

环境

我正在使用一个C++应用程序,它使用SQL Native Client 9.0与SQL Server 2000数据库进行通信.

脚本

  • 向DBMS打开2个连接
  • 每个连接都设置为使用事务
  • 关于Connection1工作的查询TableA
  • 关于Connection2工作的查询TableB
  • TableB在该key_id字段中有一个外键约束TableA

我构造了执行以下操作的函数:

begin a transaction on Connection1 & Connection2
prepare a query in TableA on Connection1
prepare a query on TableB on Connection2

begin loop over some_data
   (1) insert into key_id on TableA

   begin loop over some_other_data
      (2) insert into TableB using same key_id as in Table A
   end loop
end loop

commit on Connection1
commit on Connection2 …
Run Code Online (Sandbox Code Playgroud)

c++ sql sql-server sqlncli

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

无法从Linux连接到SQl Server

我正在尝试连接到CentOS 5.8上的SQL Server 2008.我正在使用unixODBC 2.3.0和SQL Server ODBC驱动程序(www.microsoft.com/en-us/download/details.aspx?id=28160).

当我尝试通过运行来测试连接时:

isql -v mydsn username password
Run Code Online (Sandbox Code Playgroud)

它给了我:

[S1T00][unixODBC][Microsoft][SQL Server Native Client 11.0]Login timeout expired
[08001][unixODBC][Microsoft][SQL Server Native Client 11.0]A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online.
[08001][unixODBC][Microsoft][SQL Server Native Client 11.0]TCP Provider: Error code 0x2726
[ISQL]ERROR: …
Run Code Online (Sandbox Code Playgroud)

sqlncli unixodbc sql-server-2008 strace isql

4
推荐指数
1
解决办法
2万
查看次数

链接服务器SQLNCLI问题。“没有交易处于活动状态”

我试图执行存储过程并将其结果简单地插入临时表中,并且得到以下消息:

由于链接服务器“ MyServerName”的OLE DB提供程序“ SQLNCLI”无法开始分布式事务,因此无法执行该操作。链接服务器“ MyServerName”的OLE DB提供程序“ SQLNCLI”返回消息“没有事务处于活动状态”。

我的查询如下所示:

INSERT INTO #TABLE
EXEC MyServerName.MyDatabase.dbo.MyStoredProcedure Param1, Param2, Param3
Run Code Online (Sandbox Code Playgroud)

确切的列号,名称,不是问题所在。

两台计算机都允许并启动MSDTC,也调用远程过程。

这些机器不在同一个域中,但是我可以从我的机器上执行远程查询并获得结果。我什至可以执行存储过程并查看其结果,只是不能将其插入另一个表中。

编辑


哦,我忘了提及,存储过程不会触发任何触发器。它仅将记录插入临时表中,并创建临时表以进行数据处理。

sql sql-server sql-server-2005 sqlncli linked-server

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

如何在浏览时检查客户端是否安装了SQLNCLI10提供程序?

我有一个ac#website,它允许客户端通过使用第三方ActiveX控件从他们的PC直接连接到远程SQL Server数据库,绕过Web服务器.我最初使用SQLOLEDB提供程序,它工作正常.客户端位于内部网络中(使用Windows计算机和Internet Explorer),并且该网站不适用于普通Internet.

我不得不从使用SQLOLEDB提供程序升级到SQLNCLI10提供程序以满足SQL Server 2008中的新数据类型.它在我的PC上工作,但在生产中中断.我没有意识到它是有效的,因为SQLOLEDB提供程序是Windows操作系统(MDAC/WDAC)的一部分,因此已经存在于客户端的PC上.该SQLNCLI10提供商是作为SQL Server 2008中的一部分,必须要在客户机上分别安装(因为他们大多安装了SQL Server不会有,但我做的).

我可以为他们提供一个链接,以便从中下载独立的Microsoft SQL Server 2008 Native Client提供程序,但是如何检查他们是否已安装它?

sql-server asp.net oledb sqlncli sql-server-2008

3
推荐指数
2
解决办法
3万
查看次数