我正在尝试通过 .NET 应用程序查询 Sage Line 50。通过 ODBC 连接工作正常。我可以打开/关闭数据库并运行非常基本的查询,但我的查询之一稍微复杂一些,我需要包含默认的硬编码值,但它的行为非常奇怪。
当我在 Microsoft Access 中运行它并针对链接表运行它时,该查询工作得非常好,但是当我在 .NET 中运行它时,它会抛出一个未找到列的错误,这取决于我的值。
1) 返回数值数据
如果我的查询是
Select SELECT PURCHASE_LEDGER.ACCOUNT_REF AS SupplierCode, '10' as OrganizationNumber, ...
结果:10 返回为 10.00
2)缺少列:
如果我的查询是
Select SELECT PURCHASE_LEDGER.ACCOUNT_REF AS SupplierCode, '' as City, ...
结果:我的 OdbcDataReader 只会返回直到第一个实例 '' 的列,所以在这种情况下,它只会返回 ACCOUNT_REF
3)未找到列错误:
如果我的查询是
Select SELECT PURCHASE_LEDGER.ACCOUNT_REF AS SupplierCode, 'GB' as Country, ...
它将抛出未找到该列的错误。然而,如果我使用'-' as Country
or'--' as Country
它会工作,但它返回 0.00 而不是空字符串
所以我的问题是:
1) 为什么 MS Access 的行为不同,并允许我在我的查询包括时返回一个空值,'' as City
但在通过 .NET 查询时它无法返回它
2)为什么不允许我使用字母数字值(例如“GB”)作为硬编码值而不抛出未找到的列。
3)为什么它允许我使用'-' as Country
但返回 0.00
这些有什么解决方法吗?我真的需要为某些字段返回硬编码的空值,为其他一些字段返回硬编码的字母数字值,并且当它们不应该有小数位时,我不能返回带有小数位的值。
几个小时以来它一直在发疯,我需要保持这个通用性,虽然我遇到了其他问题,例如查询无法连接列,但我已经解决了这个问题,但我试图让我的应用程序保持尽可能通用,所以在我的 xml 定义中引入奇怪的参数似乎没有意义。我一直在考虑引入一个“默认”值,这在定义字段映射时在技术上是可以接受的,但是当它应该是一个空字符串时返回为 0.00 的值呢,应该是 1、2、3 的值呢?以 1.00、2.00 等形式返回...
所以我希望有人会知道如何在查询级别解决这个问题,而不是通过代码来解决这个问题。
谢谢。
更新:
如果有帮助,这是我的完整查询:
SELECT PURCHASE_LEDGER.ACCOUNT_REF AS SupplierCode,
PURCHASE_LEDGER.NAME AS SupplierName,
PURCHASE_LEDGER.ADDRESS_1,
PURCHASE_LEDGER.ADDRESS_2,
PURCHASE_LEDGER.ADDRESS_3,
PURCHASE_LEDGER.ADDRESS_4,
PURCHASE_LEDGER.ADDRESS_5,
'London' AS City,
COUNTRY_CODE.Name AS Country,
'' AS PostCode,
'-' AS PostCode1,
PURCHASE_LEDGER.VAT_REG_NUMBER AS TaxRegistrationNumber,
'10' AS CorporateGroupId,
COUNTRY_CODE.Name AS Location,
CURRENCY.CODE AS CurrencyCode
FROM (PURCHASE_LEDGER
INNER JOIN CURRENCY ON PURCHASE_LEDGER.CURRENCY = CURRENCY.NUMBER)
INNER JOIN COUNTRY_CODE ON PURCHASE_LEDGER.COUNTRY_CODE = COUNTRY_CODE.CODE
- City 会抛出错误,即找不到列
- PostCode 将导致其余字段不返回
- PostCode1 将返回 0.00 而不是 '-'
- OrganizationNumber 将返回 10.00 而不是 10