SQL命令无法通过C#运行

本文关键字:运行 命令 SQL | 更新日期: 2023-09-27 18:22:20

好吧,所以我在这里有一个令人费解的时刻,我一辈子都无法弄清楚为什么下面的代码只能间歇性地工作。

当我运行以下代码时,我通常会从数据库中获得结果,但我最近发现一个项目返回错误ORA-01858 a non-numeric character was found where a numeric was expected.。我尝试调试代码,并将精确的运行时SQL命令复制粘贴到Toad for Oracle中,它返回的结果没有问题,只是不在我的应用程序中?

代码:

            using (var conn = OracleConnect(username, password))
            {
                conn.Open();
                string cmd = "SELECT DISTINCT(ENTITYID) FROM MY.DATABASE WHERE ITEM_ID = '" + itemid + "'";
                using (var oleCmd = new OleDbCommand(cmd, conn)) //ORA-01858 exception here
                {
                    using (var oleRead = oleCmd.ExecuteReader())
                    {
                        while (oleRead.Read())
                        {
                            string entity = oleRead["ENTITYID"].ToString();
                            if (!string.IsNullOrEmpty(entity)) _entityid.Add(entity);
                        }
                    }
                }
            }

有什么想法吗?

多亏了Hassan才得以解决

我尝试了using Oracle.DataAccess.Client; OracleConnectionOracleCommand,它似乎有效,不确定为什么OleDb没有。

SQL命令无法通过C#运行

using (var conn = OracleConnect(username, password))
            {
                conn.Open();
                string cmd = "SELECT DISTINCT(ENTITYID) FROM MY.DATABASE WHERE ITEM_ID =?";
                using (var oleCmd = new OleDbCommand(cmd, conn))
                {
                    oleCmd.Parameters.AddWithValue("@p1", itemid);
                    using (var oleRead = oleCmd.ExecuteReader())
                    {
                        while (oleRead.Read())
                        {
                            string entity = oleRead["ENTITYID"].ToString();
                            if (!string.IsNullOrEmpty(entity)) _entityid.Add(entity);
                        }
                    }
                }
            }

像这样应该可以工作,并使用参数来保护您的应用程序不受sql注入的影响!此外,如果这是一个严重的应用程序,请在不同的层上建立数据库连接。

删除WHERE条件中的双单引号。可能是您的ITEM_ID是整数,但您传递了一个字符串值。这是修改后的代码

string cmd = "SELECT DISTINCT(ENTITYID) FROM MY.DATABASE WHERE ITEM_ID = " + itemid + "";

在数据库中,它将生成以下脚本:

SELECT DISTINCT(ENTITYID) FROM MY.DATABASE WHERE ITEM_ID = 1
ITEM_ID是字母数字(int),而不是varchar。因此,您传递的"itemid"的值被拒绝,因为它不是字母数字。