【问题标题】:Why this SQL insert into table statement does not work in C#?为什么这个 SQL insert into table 语句在 C# 中不起作用?
【发布时间】:2012-09-09 20:10:19
【问题描述】:

当 ExcuteNonQuery 执行时,我得到一个 ORAC 0936。我想我的问题是我的 SQL 的 VALUES 部分。提前感谢您的帮助

public int NewFunction(int UserID, string fName, string fDescription, string connectionStr)
        {
            OracleConnection connection = new OracleConnection(connectionStr);
            try
            {
                //PLease Note that User ID and  fDescription are passed into the function as  
//parameters
                connection.Open();

                OracleCommand command = connection.CreateCommand();

                OracleTransaction transaction = connection.BeginTransaction();
                command.Transaction = transaction;
                        string LoadedFileName = @WfName;//Fd.FileName;
               //read the xaml content from file 
                command.CommandText = "INSERT INTO XYZ(ID, NAME , F_SCRIPT) VALUES (@UserID, @fDescription, EMPTY_CLOB())";

                command.ExecuteNonQuery();
                transaction.Commit();
               }

/////////////////////////////////////// ///////////////////// //***************************** //好的,谢谢大家的回复。这就是我使用stackckoverflow的其他帖子解决其他问题的方式。请注意,fDescription 和 USerID 正在传递给函数。

command.CommandText = "INSERT INTO IMS_Workflow (ID, NAME , F_SCRIPT) VALUES ('" + UserID + "', '" + WfDescription + "', EMPTY_CLOB())";

【问题讨论】:

  • 我没有看到任何迹象表明您正在填充参数...您从未使用过 fNamefDescription 参数。
  • 感谢您的回复。 fDescription 被传递给函数。 fName 是一个多余的变量,我什至不应该在我的代码中使用它。我找到了答案,并将其添加到我的问题中。请免费评论它,因为这是我发现的工作。无论这是否是首选方式,我都有兴趣知道。再次感谢。
  • 好吧 fDescription 传递给 方法 - 但它根本没有传递给 database。您的解决方法会引发 SQL 注入攻击,不要使用它。
  • 谢谢。那么我该怎么做呢?我会很感激正确的语法。
  • 看我的回答。如果这不起作用,请提供详细信息,而不仅仅是您在另一个答案中留下的“它不起作用”。

标签: c# sql insert oracle11g


【解决方案1】:

您的原始代码看起来像是在尝试使用参数化 SQL:

command.CommandText = "INSERT INTO XYZ(ID, NAME , F_SCRIPT) VALUES (@UserID, @fDescription, EMPTY_CLOB())";

...但您从未为参数设置 ,并且它使用 SQL Server 样式名称(@ 前缀而不是 :)。您需要正确声明参数,并给它们赋值,例如

command.CommandText = "INSERT INTO XYZ(ID, NAME , F_SCRIPT) VALUES (:UserID, :fDescription, EMPTY_CLOB())";
command.Parameters.Add("UserId", OracleType.Number).Value = userId;
command.Parameters.Add("fDescription", OracleType.NVarChar).Value = fDescription;

@ 的前缀可能也可以使用;我只是通过文档中的示例进行说明。)

您的解决方法是将值直接嵌入到您的 SQL 中。 不要这样做。您正在邀请SQL injection attacks

【讨论】:

  • 非常感谢。你的建议奏效了。你能告诉我选择语句的正确语法吗?如果你愿意,我可以把它放在一个单独的问题中。 command.CommandText = "SELECT F_SCRIPT FROM XYZ WHERE ID='" + UserID + "' FOR UPDATE";
  • @user1298925:根据我现有的答案,您尝试了什么?您需要愿意为自己做一些工作,并围绕一个主题阅读。您不明白为什么应该在 SQL 中直接包含值吗?
  • 其实,我一直在尝试自己想出答案,但我还没有测试过。当我尝试不同的解决方案时,我在想,也许正确的答案也会在这里。这是我未经测试的解决方案。 command.CommandText = "从 XYZ 中选择 F_SCRIPT,其中 ID=:UserID 和 "+" NAME =:fDescription" + " FOR UPDATE "; command.Parameters.Add("UserID", OracleType.Number).Value = UserID; command.Parameters.Add("fDescription", OracleType.NVarChar).Value = fDescription;
【解决方案2】:

我可能遗漏了一些东西,但我没有看到您将参数 @UserID 或 @fDescription 添加到命令对象的参数集合的位置。添加这些,我怀疑你应该没问题。

【讨论】:

  • 谢谢。我确实添加了参数,但它不起作用。我的问题出在语法上,我发现了。我会用我找到的解决方案更新我的问题,请免费评论它,因为这是我发现的工作。无论是否是首选方式,我都有兴趣知道。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-04
  • 2021-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-21
相关资源
最近更新 更多