c# - School Project- 当 nchar 设置为 9 位时,为什么我的数据会插入 8 位?

标签 c# database

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

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

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

要插入的列:Last nameFirst nameMISSAN code> 和 Payrate

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;
    }

最佳答案

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

变量 blnOK 开始时为 true,然后检查 strFields[0]。然后将 blnOK 设置为 truefalse,这很好。但是,您随后检查 strFields[1],并根据 blnOK 设置为 truefalse em>那个值,不管之前的检查是什么。这将继续贯穿你所有的领域。最终结果是 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; 之所以有效,是因为 && 仅在两个操作数都为 true 时才返回 true 。如果任何值为 false,则结果将为 false

关于c# - School Project- 当 nchar 设置为 9 位时,为什么我的数据会插入 8 位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50593658/

相关文章:

c# - 使用 async/await 将现有的 C# 同步方法转换为异步方法?

c# - 获取 VS 2010 中执行查询的历史记录?

php - mysql查询未知列错误

php - 如何设置元表以便高效地插入大量数据?

python - python 中的数据库与平面文件(需要速度但不能放入内存)与生成器一起用于 NN 训练

c# - 托管应用程序中的非托管内存泄漏

c# - 如何防止应用程序在关闭窗口时关闭?

c# - 使用 TweetSharp 返回最近的 n 条推文

database - 如何将站点范围的设置存储在数据库中?

php - 打印数据库中的所有表