首页 > 解决方案 > 学校项目-为什么当 nchar 设置为 9 位时插入我的 8 位数据?

问题描述

这是一个学校项目,感谢您的帮助。

预期系统行为当 txt 文件中的 SSN 列不等于 9 位时,不应将包含该列的行插入数据库中。

实际行为当 SSN 列不等于 9 位时,它仍然将其插入数据库。

要插入的列:Last nameFirst nameMI和。SSANPayrate

SSAN 的存储过程代码:@SSAN nchar(9)

这就是我在包含我的 SQL 的类中执行 SSAN 的方式:

cmdSQL.Parameters.Add(new SqlParameter("@SSAN", SqlDbType.NChar));
cmdSQL.Parameters["@SSAN"].Direction = ParameterDirection.Input;
cmdSQL.Parameters["@SSAN"].Value = SSAN;

这是我在主程序中验证它的方法:

if (strFields[3].Length == 9)
{
        blnOK = true;

}
else
{
    blnOK = false;
    Console.WriteLine("Error: Unable to Parse SSAN!");

}

这是我从主程序调用数据库类的方法。

  intRetCode = clsDatabase.InsertEmployee(strFields[2], strFields[0], strFields[1], strFields[3],
                    Convert.ToDecimal(strFields[4]));

问题:如何确保如果 SSAN 不等于 9 位,它所包含的所有行的数据都不会插入到数据库中?

这是我验证字段的时间。

if (strFields.Length != 5)
{
    Console.WriteLine("Error: Columns not matching: " + strRecord);
    Console.ReadKey();
    rejectedData += 1;
}
else
{
    if (!IsValidRecord(strFields))
    {
        Console.WriteLine("Error: " + strRecord);
    }
    else
    {
        //**Step 10: Insert Records in the database.
        Console.WriteLine("First_Name: " + strFields[0]);
        Console.WriteLine("MInit: " + strFields[1]);
        Console.WriteLine("Last_Name: " + strFields[2]);
        Console.WriteLine("SSAN: " + strFields[3]);
        Console.WriteLine("Payrate: " + strFields[4]);
        intRetCode = clsDatabase.InsertEmployee(strFields[2], strFields[0], strFields[1], strFields[3],
        Convert.ToDecimal(strFields[4]));
        insertedData += 1;

    }
}

这是 IsValidRecord 过程:

private static Boolean IsValidRecord(String[] strFields)
    {
        Boolean blnOK = true;
        Decimal decCheck;
        //Check all fields that must be validated

        if (String.IsNullOrWhiteSpace(strFields[0]))
        {
            blnOK = false;
            Console.WriteLine("Error: Unable to Parse First Name!");
        }
        else
        {
            blnOK = true;

        }
        if (String.IsNullOrWhiteSpace(strFields[1]))
        {
            blnOK = false;
            Console.WriteLine("Error: Unable to Parse Middle Initial!");
        }
        else
        {
            blnOK = true;

        }
        if (String.IsNullOrWhiteSpace(strFields[2]))
        {
            blnOK = false;
            Console.WriteLine("Error: Unable to Parse Last Name!");
        }
        else
        {
            blnOK = true;

        }

        if (strFields[3].Length != 9)
        {
             blnOK = false;
             Console.WriteLine("Error: Unable to Parse SSAN!");

        }
        else
        {
            if (strFields[3].Length == 9)
            {
                blnOK = true;

            }
            else
            {
                Console.WriteLine("Error: Unable to Parse SSAN!");
            }


        }

        if (strFields[4] == null)
        {
            blnOK = false;

            Console.WriteLine("Error: Unable to Parse PayRate!");
        }
        else
        {
            if (Decimal.TryParse(strFields[4], out decCheck))
            {
                blnOK = true;

            }
            else
            {
                Console.WriteLine("Error: Unable to Parse PayRate!");
            }

        }
        return blnOK;
    }

标签: c#database

解决方案


您的问题出现在您的IsValidRecord. 您有一个变量 ,blnOK您正在来回切换

变量blnOK以 开头true,然后strFields[0]被检查。然后设置blnOKtrueor false,这很好。但是,您然后检查strFields[1],并继续设置blnOKtruefalse基于值,而不管之前的检查是什么。这将贯穿您的所有领域。最终结果是,无论其他检查的结果如何,结果IsValidRecord始终是您检查的最后一个字段的结果(在本例中为 )。strFields[4]

解决此问题的简单方法是return blnOK;每当您将其值更改为 时false,这将导致函数“短路”,甚至不检查任何其他字段。第一个失败的字段将使整批字段失败。

如果要检查所有字段,则可以检查blnOK每个检查的状态,并且仅在之前的检查true中未设置为时才将其设置为。false

处理此问题的另一种方法是为每个字段设置一个变量,并返回所有值的聚合。就像是:

private static Boolean IsValidRecord(String[] strFields)
{
    Boolean blnOK = true;
    Boolean bln0OK = true;
    Boolean bln1OK = true;
    Boolean bln2OK = true;
    Boolean bln3OK = true;
    Boolean bln4OK = true;
    Decimal decCheck;
    //Check all fields that must be validated

    if (String.IsNullOrWhiteSpace(strFields[0]))
    {
        Boolean bln0OK = false;
        Console.WriteLine("Error: Unable to Parse First Name!");
    }
    else
    {
        bln0OK = true;

    }
    if (String.IsNullOrWhiteSpace(strFields[1]))
    {
        bln1OK = false;
        Console.WriteLine("Error: Unable to Parse Middle Initial!");
    }
    else
    {
        bln1OK = true;

    }
    if (String.IsNullOrWhiteSpace(strFields[2]))
    {
        bln2OK = false;
        Console.WriteLine("Error: Unable to Parse Last Name!");
    }
    else
    {
        bln2OK = true;

    }

        if (strFields[3].Length == 9)
        {
                bln3OK = true;

        }
        else
        {
            bln3OK = false;
            Console.WriteLine("Error: Unable to Parse SSAN!");

        }
    if (strFields[4] == null)
    {
        bln4OK = false;
    }
    else
    {
        if (Decimal.TryParse(strFields[4], out decCheck))
        {
            bln4OK = true;

        }
        else
        {
            bln4OK = false;
            Console.WriteLine("Error: Unable to Parse PayRate!");
        }
    }
    blnOK = bln0OK && bln1OK && bln2OK && bln3OK && bln4OK; 
    return blnOK;
}

blnOK = bln0OK && bln1OK && bln2OK && bln3OK && bln4OK;有效,因为仅当两个操作数都是. 时才&&返回。如果任何值是,那么结果将是。truetruefalsefalse


推荐阅读