0

通过 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);
4

0 回答 0