【问题标题】:Update command C# with Oracle使用 Oracle 更新命令 C#
【发布时间】:2017-12-28 13:45:32
【问题描述】:

我在更新数据库时遇到问题。

public void UpdateAto(AtoEntity atoEntity)
{
    OracleDataAdapter da = new OracleDataAdapter();

    string oradb = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=blabla.com)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=test13)));;User Id=id13;Password=pwd13;";
    OracleConnection con = new OracleConnection(oradb);
    con.Open();

    OracleCommand cmd = new OracleCommand();
    cmd.Connection = con;

    cmd.CommandText = 
        "UPDATE SLAPTEOP SET XOCL ='" + atoEntity.OidOcl +
                         "',NOM='" + atoEntity.NameAto +
                         "',ETAT='-1" +
                         "',NBPAAN='11" +
                         "',DESCRIPTION='" + atoEntity.DescriptionAto +
                         "',APPORTEUR='" + atoEntity.ContributorAto +
                         "',AUTEUR_MISEAJOUR='" + atoEntity.AuthorUpdateAto +
                          "',DATE_MISEAJOUR=SYSDATE WHERE OID ='" + atoEntity.OidAto + "'";

    cmd.CommandType = CommandType.Text;

    cmd.ExecuteNonQuery();
    con.Dispose();
}

请求不错,写的不带参数,简单点。它已经在 SGBD 上进行了测试。选择和插入请求也可以。

当我执行cmd.ExecuteNonQuery() 时,数据库中没有任何反应。它会循环播放。

添加了一个 try/catch 块,但未捕获任何错误或异常。

【问题讨论】:

  • 这个很不清楚。 POST 或 GET 与此有什么关系?捕获异常并记录或调试它们。异常详细信息将告诉您出了什么问题。并且请使用参数化查询来防止sql注入和语法错误。
  • cmd.ExecuteNonQuery 应该返回更新的行数。你可以把这些东西变成一个try catch,然后edit你的异常变成你的问题吗?
  • OracleDataAdapter da 不是必需的。
  • 如果没有更新行,则 ExecuteNonQuery 返回 0,如果命令修改了某些行,则返回 >0。请检查 ExecuteNonQuery 的返回值。如果它为零,则 WHERE 子句找不到要更新的记录。这意味着您用于 Oid 的值是错误的(您确定此 OID 是字符串吗?)

标签: c# database oracle sql-update command


【解决方案1】:

您应该使用绑定变量。检查更新的行数,如下所示:

cmd.CommandType = CommandType.Text;
cmd.CommandText = 
   "UPDATE SLAPTEOP SET XOCL = :xocl, 
       NOM = :mom, ETAT = -1, 
       NBPAAN = 11, DESCRIPTION = :desc, 
       APPORTEUR = :apporteur, AUTEUR_MISEAJOUR = :auteur, 
       DATE_MISEAJOUR = SYSDATE
    WHERE OID = :oid";

cmd.Parameters.Add("xocl", OracleDbType.Varchar2, ParameterDirection.Input).Value = atoEntity.OidOcl;
cmd.Parameters.Add("mom", OracleDbType.Varchar2, ParameterDirection.Input).Value = atoEntity.NameAto;
cmd.Parameters.Add("desc", OracleDbType.Varchar2, ParameterDirection.Input).Value = atoEntity.DescriptionAto;
cmd.Parameters.Add("apporteur", OracleDbType.Varchar2, ParameterDirection.Input).Value = atoEntity.ContributorAto;
cmd.Parameters.Add("auteur", OracleDbType.Varchar2, ParameterDirection.Input).Value = atoEntity.AuthorUpdateAto;
cmd.Parameters.Add("oid", OracleDbType.Varchar2, ParameterDirection.Input).Value = atoEntity.OidAto;

var r = cmd.ExecuteNonQuery();

Console.WriteLine("{0} rows updated", r);

【讨论】:

  • 嗯,很好,但你需要 ParameterDirection.Input 吗?不是默认的吗?
  • @Steve,是的,你是对的(见OracleParameter(string, OracleDbType)),我只是习惯了写它。
  • e.Message = "ORA-01745: nom de variable hôte/attachée (bind) non valide" 我什么都不懂了
  • 请运行cmd.CommandText = "ALTER SESSION SET NLS_LANGUAGE = american"); cmd.ExecuteNonQuery();以获得英文错误信息。
  • ORA-01745: 无效的主机/绑定变量名
【解决方案2】:

拖放 我没看到问题...

   cmd.CommandType = CommandType.Text;
            cmd.CommandText = 
                "UPDATE SLAPTEOP SET XOCL = :xocl,"+ 
            "NOM = :nom, ETAT = -1,"+
            "NBPAAN = 11, DESCRIPTION = :desc,"+ 
            "APPORTEUR = :apporteur, AUTEUR_MISEAJOUR = :auteur,"+
            "DATE_MISEAJOUR = SYSDATE"+
            "WHERE OID = :oid";

            cmd.Parameters.Add("xocl", OracleDbType.Varchar2, ParameterDirection.Input).Value = atoEntity.OidOcl;
            cmd.Parameters.Add("nom", OracleDbType.Varchar2, ParameterDirection.Input).Value = atoEntity.NameAto;
            cmd.Parameters.Add("desc", OracleDbType.Varchar2, ParameterDirection.Input).Value = atoEntity.DescriptionAto;
            cmd.Parameters.Add("apporteur", OracleDbType.Varchar2, ParameterDirection.Input).Value = atoEntity.ContributorAto;
            cmd.Parameters.Add("auteur", OracleDbType.Varchar2, ParameterDirection.Input).Value = atoEntity.AuthorUpdateAto;
            cmd.Parameters.Add("oid", OracleDbType.Varchar2, ParameterDirection.Input).Value = atoEntity.OidAto;

【讨论】:

  • 运行Debug.WriteLine(cmd.CommandText); - 然后你会看到它!
  • 我们需要一些空间吗?
  • DATE_MISEAJOUR=SYSDATEWHERE => DATE_MISEAJOUR=SYSDATE WHERE
  • "更新 SLAPTEOP SET XOCL = :xocl,NOM = :nom, ETAT = '-1',NBPAAN = '11',DESCRIPTION = :desc,APPORTEUR = :apporteur, AUTEUR_MISEAJOUR = :auteur, DATE_MISEAJOUR = SYSDATE WHERE OID = :oid" 不起作用..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-24
  • 1970-01-01
相关资源
最近更新 更多