通过 odbc 系统 dsn 查询 4d 数据库时,我能够从带有连接和单个或没有 where 条件的语句中获取数据。
这有效:
static void Main(string[] args)
{
OdbcConnection sys4dConn = new OdbcConnection("Dsn=sys4dName");
try
{
OdbcCommand getData = new OdbcCommand("
SELECT
Item.Client,
CAST(Item.xref1 AS VARCHAR),
CAST(Item.xref2 AS VARCHAR),
CAST(Item.xref3 AS VARCHAR),
CAST(Item.xref4 AS VARCHAR),
Item.owner,
Item.Storage_Date,
Item.Temporary_Item_ID,
Item.ItemType,
Item.Item_Condition,
Location.UnitName,
Part.ConcatPosition,
Part.Position1,
Part.Position2,
Part.Position3,
Part.Position4,
Part.Position5,
Item.Comments,
Part.Checked_Out_Reason,
AuditTrail.ReasonforChange,
'123abc' as CheckoutStatus
FROM
Item
LEFT JOIN
Part
ON Item.PK_ItemUID = Part.FK_ItemUID
LEFT JOIN
AuditTrail
ON Part.PK_PartUID = AuditTrail.FK_PartUID
AND
(
Part.Position1 IS NOT NULL
AND Part.Position2 IS NOT NULL
AND Part.Position3 IS NOT NULL
AND Part.Position4 IS NOT NULL
AND Part.Position5 IS NOT NULL
)
LEFT JOIN
Location
ON Part.FK_UnitSectID = Location.PK_UnitSectID
WHERE
Item.Client = '4468'", sys4dConn);
getData.CommandType = CommandType.Text;
OdbcDataAdapter daGetData = new OdbcDataAdapter(getData);
using (DataTable dtTbl = new DataTable())
{
sys4dConn.Open();
OdbcDataReader dr = getData.ExecuteReader();
while (dr.Read())
{
DataRow dtRow = dtTbl.NewRow();
for (int i = 0; i < dtTbl.Columns.Count; i++)
{
dtRow[i] = dr[i].ToString();
}
dtTbl.Rows.Add(dtRow);
}
sys4dName.Close();
}
}
}
(此帖子的查询文本已格式化。实际字符串只有空格,没有回车或换行。)
这也有效:
...WHERE
Item.Client IN ('4468')", sys4dConn);
对于上述每一项,查询都会返回 12 行数据。如果我将客户端更改为“7147”,我会得到 14 行数据。
但是,当我想将两者都放入一个数据集中时,我得到零行。
这些都不起作用:
...WHERE
Item.Client = '4468'
OR Item.Client = '7147'", sys4dConn);
...WHERE
Item.Client IN ('4468','7147')", sys4dConn);
...WHERE
Item.Client = ?
OR Item.Client = ?", sys4dConn);
getData.Parameters.AddWithValue("client", "4468");
getData.Parameters.AddWithValue("client", "7147");
最后一个抛出以下内容:
System.Data.dll 中出现“System.AccessViolationException”类型的未处理异常
附加信息:试图读取或写入受保护的内存。这通常表明其他内存已损坏。
where
是否有一些语法允许我在odbc 查询的子句中包含多个条件?
删除了所有连接的查询版本确实返回 26 行使用
...WHERE
Item.Client = '4468'
OR Item.Client = '7147'", sys4dConn);