Ado.Net dll在没有客户端数据库安装的情况下工作

时间:2017-07-31 13:56:54

标签: .net f# ado.net sybase-ase

我有一个ADO.NET dll,我经常添加到我的C#或F#.Net项目中,我看到我可以将已编译的可执行文件传送到没有安装db客户端软件的服务器或工作站。 / p>

今天我注意到当我将一个简单的项目部署到包含旧的数据库客户端设置的特定服务器时,我的可执行文件的行为有所不同,而且很清楚这是由于某处的某个错误所致。 ado.net提供程序实现。

我不认为错误的具体细节是相关的,无论如何关键是当底层数据库类型是VARCHAR时命令参数不起作用,而日期的命令参数不起作用列被正确解释(请参阅下面的内容,但我想您可以跳过详细信息以回答一般的主要问题)。

这对我来说是非常奇怪的:在安装某些客户端软件时,看似独立的ADO.NET dll的行为有何不同? 如果这个托管的ADO.NET dll需要存在一个非托管dll的某个地方,那么当我将项目部署到没有任何设置的工作站时,它不应该抛出异常吗?

我的推理 - 至少在原则上 - 是正确的吗?

TL; DR

我已经从我的ADO.NET解决方案中添加了对Sybase.AdoNet2.AseClient的引用,并且我选择了DataTable(顺便说一下,如果我用等效代码编写一个相同的代码,也会出现同样的问题DataReader

use cn = new AseConnection(connString) 
let cmd = new AseCommand(sql, cn)
cmd.Parameters.AddRange(pars)
let da = new AseDataAdapter(cmd) 
let ds = new DataSet()
cn.Open() 
let i = da.Fill(ds) 
printfn "DB Tables #: %i" ds.Tables.Count
let rows = ds.Tables.[0].Select()
printfn "erro? %b name %s rows %i" 
    ds.Tables.[0].HasErrors ds.Tables.[0].TableName rows.Length

通过命令sql "SELECT * FROM MY_VIEW WHERE status = @MyStatus ",其中一个参数AseParameter("@MyStatus", "TEST" )的数据库类型为VARCHAR(255)

非常奇怪这个简单的AseParameter(仅基于字符串)在某些旧服务器上无法正常工作:没有行是选择(当然,他们应该)。按日期过滤也很奇怪 - 相反 - 按预期工作。

我在这些服务器上发现的唯一(有意义的)差异是他们有一个较旧的ODBC驱动程序版本,但我认为它不应该相关,因为这个ADO.NET连接是基于ODBC! Afaik我很确定Sybase.AdoNet2.AseClient dll不依赖于任何其他Sybase客户端安装,是否正确?

是否有任何ADO.NET与Sybase ASE的专家可以对此进行投射?

1 个答案:

答案 0 :(得分:0)

  

在安装某些客户端软件时,看似独立的ADO.NET dll的行为有何不同?

这是一个意想不到的错误。我发现可再发行的Sybase.AdoNet45.AseClient.dll按预期工作,没有任何其他Sybase文件,而错误已经修复

  

这个简单的AseParameter(仅基于字符串)在某些旧服务器上不起作用,这很奇怪

这种情况不仅发生在某些旧服务器上,也发生在没有任何Sybase客户端设置的新服务器上。因此,在Sybase.AdoNet2.AseClient中有一些非预期的引用到其他客户端软件,在这种情况下,客户端软件丢失的事实不会触发异常(它不应该存在并且它确实没有作为依赖关系链接而是一个错误。

  

我很确定Sybase.AdoNet2.AseClient dll不依赖于任何   其他Sybase客户端安装,是否正确?

  

如果这个托管的ADO.NET dll需要存在某个地方   unmanaged dll,我不应该在部署my时抛出异常   项目到工作站没有任何设置?

是的,较新版本的ADO.NET dll不需要其他非托管组件,旧版本没有(如果未管理的dll缺少旧的sybase ado.net dll抛出异常)。

出于好奇,我的原始版本(加上非托管dll)的旧版本可以正常运行,但没有此错误,但除非更改{StackOverflowException,否则会抛出Parameters.AddRange 1}}进入

pars |> Seq.iter (fun (par: AseParameter) -> cmd.Parameters.AddWithValue(par.ParameterName, par.Value) |> ignore)

正如我在答案开头所说,最新的.Net 4.5 Sybase.AdoNet45.AseClient.dll版本没有这个错误(并且原始cmd.Parameters.AddRange(pars)未更改)