【问题标题】:When trying to update a DATE from C# code to an oracle database application gets stuck尝试将 DATE 从 C# 代码更新到 oracle 数据库应用程序时卡住了
【发布时间】:2015-04-15 08:32:52
【问题描述】:

所以我想从我的应用程序更新我的 oracle 数据库中的日期字段,所以我使用以下查询和代码

string insertqeuryrepair = "UPDATE REPARATIE SET PROBLEEM ='" + problem + "',DATUM = '11-12-2015' WHERE ONDERHOUDID=" + maintenanceID.ToString();
OracleSQL.modifyQuery(insertqeuryrepair);

而我的 modifyQeury 函数如下

 public static Boolean modifyQuery(String query)
    {
        bool succes = false;
        OracleCommand cmd = new OracleCommand(query, connection);
        try
        {
            if (connection.State == ConnectionState.Closed)
                connection.Open();
            cmd.ExecuteNonQuery();
            succes = true;
        }
        catch (Exception e)
        {
            Debug.WriteLine("[OracleSQL]Error, message: " + e.Message);
        }
        finally
        {
            connection.Close();
        }
        return succes;
    }

现在,当我运行此代码时,应用程序卡住了,但是当我删除 DATE = '11-12-2015' 时,它工作得很好。 ' 我将如何在应用程序不卡住的情况下更新日期

【问题讨论】:

  • DATUM 列的类型是什么?和其他列类型?顺便说一句,您应该始终使用parameterized queries。这种字符串连接对SQL Injection 攻击开放。
  • 我希望problem 不是来自用户提供的数据,否则您正在查看 SQL 注入问题。
  • 始终使用 ISO 格式的日期 (YYYY-MM-DD) 以减少问题。
  • 我使用 sql 查询的方式是听从我朋友的建议。我说了同样的话,这种事情对 sql-injection 非常容易,所以我尝试自己做一些注入,但是这些都被过滤了
  • 顺便说一句,DATUM 列的类型是 DATE

标签: c# sql oracle


【解决方案1】:

如果您使用TO_DATE() 明确设置 DATUM 的格式会怎样,像这样

string insertqeuryrepair = "UPDATE REPARATIE SET PROBLEEM ='" + problem + "',DATUM = TO_DATE('11-12-2015', 'dd-mm-yyyy') WHERE ONDERHOUDID=" + maintenanceID.ToString();

【讨论】:

  • 不幸的是,这仍然会使应用程序卡住
  • 会产生什么样的异常?
【解决方案2】:

首先,使用冒号参数化您的更新查询以表示 OracleParameter ParameterName 值:

string insertqueryrepair = "UPDATE REPARATIE SET PROBLEEM = :problem, DATUM = :myDate WHERE ONDERHOUDID= :maintenanceID";

接下来,将您的日期解析为 DateTime 变量:

DateTime myDate = DateTime.Parse("11/12/2015");

第三,设置一个返回 bool 变量并调用你的函数,但将其重命名为 doQuery,而不是 modifyQuery,因为你不应该修改其中的任何内容 - 只需设置参数并执行它:

bool succes = OracleSQL.doQuery(insertqueryrepair, myDate, problem, maintenanceID.ToString());

现在我们将您的值传递给函数并对其进行参数化:

public static Boolean doQuery(string query, string problem, string maintenanceID, DateTime myDate)
{
    bool succes = false;
    OracleCommand cmd = new OracleCommand(query, connection);
    try
    {
        if (connection.State == ConnectionState.Closed)
            connection.Open();

        OracleParameter param1 = new OracleParameter();
        param1.OracleDbType = OracleDbType.Nvarchar2;
        param1.ParameterName = "problem";
        param1.Value = problem;

        OracleParameter param2 = new OracleParameter();
        param2.OracleDbType = OracleDbType.Nvarchar2;
        param2.ParameterName = "maintenanceID";
        param2.Value = maintenanceID;

        OracleParameter param3 = new OracleParameter();
        param3.OracleDbType = OracleDbType.Date;
        param3.ParameterName = "myDate";
        param3.Value = myDate;

        cmd.Parameters.Add(param1);
        cmd.Parameters.Add(param2);
        cmd.Parameters.Add(param3);

        cmd.ExecuteNonQuery();
        succes = true;
    }
    catch (Exception e)
    {
        Debug.WriteLine("[OracleSQL]Error, message: " + e.Message);
    }
    finally
    {
        connection.Close();
        cmd.Dispose();
    }
    return succes;
}

您甚至可以采取额外的步骤,将传入的变量设为通用变量(param1、param2 等),并对它们进行空值检查,因此如果您传入一个可能有 1 个值的不同查询(其余的可以设置为 null) 到这个函数,它不必一直对 3 个变量进行操作。如果您设置正确,此功能可以为您的任何查询完成所有工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-20
    • 2016-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多