SQL命令无法通过C#工作

时间:2014-09-18 00:27:49

标签: c# sql oracle

好的,所以我在这里有一个心灵弯曲的时刻,不能为我的生活解决为什么以下代码只能间歇性地工作。

当我运行以下代码时,我通常会从数据库中获得结果,但我最近发现了一个返回错误ORA-01858 a non-numeric character was found where a numeric was expected.的项目。我尝试调试代码并将确切的运行时SQL命令复制粘贴到Toad中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;尝试OracleConnection OracleCommand,似乎有效,不确定为什么OleDb没有。

3 个答案:

答案 0 :(得分:3)

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注入!如果这是严肃的应用程序请在不同的层上建立数据库连接。

答案 1 :(得分:0)

删除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

答案 2 :(得分:-2)

ITEM_ID是字母数字(int)而不是varchar。所以" itemid"的价值你传球被拒绝,因为它不是字母数字。

相关问题