为什么这个SQL插入表语句在C#中不起作用?

时间:2012-09-17 15:08:58

标签: c# sql insert oracle11g

当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();
               }

/////////////////////////////////////////////// /////////////////////// // * ** * ** * ** * ** * < / EM> ** * ** * ** * ** * ** * < / EM> * //好的,谢谢你们所有的回复。这就是我如何使用stackckoverflow中的其他帖子来解决其他问题。请注意,fDescription和USerID正在传递给函数。

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

2 个答案:

答案 0 :(得分:3)

我可能遗漏了一些内容,但我没有看到您将参数@UserID或@fDescription添加到命令对象的参数集合中的位置。加上那些,我怀疑你应该没事。

答案 1 :(得分:2)

您的原始代码看起来像是在尝试使用参数化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