首页 > 解决方案 > 没有数据插入数据库

问题描述

很难给这个问题起个标题。并且不容易解释这个问题。

基本上我有一个存储过程,当我手动测试它时它可以工作。如果我将对象属性放在 IF 块内,它将起作用。

以下不起作用:

    var dao = new CableDAO();
        foreach (var tag in tagsFromCustomer)
        {
            Log.Information("Tag ID: {0} - Class: {1}", tag.TagId, tag.Class);

            //if (tag.TagId== "PT215009D")
            //{
                try
                {
                    int returnValue = dao.UpdateCable(tag);
                    Log.Information("Executed update on: {0}. Return value: {1}", tag.TagId, returnValue);
                }
                catch (Exception ex)
                {
                    Log.Error(ex.Message);
                    Log.Error(ex.StackTrace);
                    throw;
                }
            //}
        }

这有效:

    var dao = new CableDAO();
        foreach (var tag in tagsFromCustomer)
        {
            Log.Information("Tag ID: {0} - Class: {1}", tag.TagId, tag.Class);

            if (tag.TagId== "PT215009D")
            {
                try
                {
                    int returnValue = dao.UpdateCable(tag);
                    Log.Information("Executed update on: {0}. Return value: {1}", tag.TagId, returnValue);
                }
                catch (Exception ex)
                {
                    Log.Error(ex.Message);
                    Log.Error(ex.StackTrace);
                    throw;
                }
            }
        }

两个示例中的集合中的数据相同。这意味着带有 TagId PT215009D 的对象确实存在,因此无论 IF 语句如何,UpdateCable 都会使用传递给它的对象运行。我可以通过查看日志或在使用断点进行调试来验证这一点。具有相同参数的相同对象。

但奇怪的是,除非我在 IF 块中对其进行测试,否则数据库中没有任何更新。

以下是我的数据访问对象的代码:

    public class CableDAO
{
    private readonly string connectionString;
    public CableDAO()
    {
        connectionString = ConfigurationManager.ConnectionStrings["Default"].ConnectionString;
    }

    public int UpdateCable(Tag cable)
    {
        using (var dbConnection = new OracleConnection(connectionString))
        {
            dbConnection.Open();

            using (var command = dbConnection.CreateCommand())
            {
                command.CommandText = Properties.Settings.Default.OracleProcedureNewCable;
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.BindByName = true;

                command.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, ParameterName = "p_tag_id", Value = (object)cable.TagId ?? DBNull.Value });
                command.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, ParameterName = "p_description", Value = (object)cable.Description ?? DBNull.Value });
                command.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, ParameterName = "p_description_2", Value = (object)cable.Description2 ?? DBNull.Value });
                command.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, ParameterName = "p_tag_category", Value = (object)cable.Class ?? DBNull.Value });
                command.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, ParameterName = "p_cable_estimated_length", Value = (object)cable.CableEstimatedLength.Replace(".", ",") ?? DBNull.Value });
                command.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, ParameterName = "p_discipline_code", Value = (object)cable.DisciplineCode ?? DBNull.Value });
                command.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, ParameterName = "p_system", Value = (object)cable.FreeFunction ?? DBNull.Value });
                command.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, ParameterName = "p_category_id", Value = (object)cable.CategoryId ?? DBNull.Value });
                command.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Double, ParameterName = "p_dry_weight", Value = (object)cable.DryWeight ?? DBNull.Value });
                command.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, ParameterName = "p_location", Value = (object)cable.FreeLocation ?? DBNull.Value });
                command.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, ParameterName = "p_to_area", Value = (object)cable.ToArea ?? DBNull.Value });
                command.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, ParameterName = "p_from_area", Value = string.IsNullOrEmpty(cable.FromArea) ? DBNull.Value : (object)cable.FromArea });
                command.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, ParameterName = "p_to_tag", Value = (object)cable.ToTag ?? DBNull.Value });
                command.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, ParameterName = "p_from_tag", Value = (object)cable.FromTag ?? DBNull.Value });
                command.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, ParameterName = "p_installed_length", Value = string.IsNullOrEmpty(cable.InstalledLength) ? DBNull.Value : (object)cable.InstalledLength.Replace(".", ",") });
                command.Parameters.Add(new OracleParameter { OracleDbType = OracleDbType.Varchar2, ParameterName = "p_segregation_level", Value = (object)cable.SegregationLevel ?? DBNull.Value });

                Log.Information("Parameters count: {0}", command.Parameters.Count);
                foreach (OracleParameter param in command.Parameters)
                {
                    Log.Information("Parametername: {0}, Value : {1}. Type: {2}.", param.ParameterName, param.Value.ToString(), param.DbType);
                }

                int rowsAffected = command.ExecuteNonQuery();
                dbConnection.Close();
                return rowsAffected;
            }
        }
    }
}

数据库中未创建任何内容时的输出/执行屏幕截图: https ://oimg.photobucket.com/albums/v48/differ/30-07-2020%2013-34-06.png

在数据库中创建对象时输出/执行的屏幕截图: https ://oimg.photobucket.com/albums/v48/differ/30-07-2020%2013-31-24.png

提前致谢!

标签: c#

解决方案


推荐阅读