Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 学校项目-当nchar设置为9位数时,为什么要插入8位数的数据?_C#_Database - Fatal编程技术网

C# 学校项目-当nchar设置为9位数时,为什么要插入8位数的数据?

C# 学校项目-当nchar设置为9位数时,为什么要插入8位数的数据?,c#,database,C#,Database,这是一个学校项目,我感谢你的帮助 预期系统行为:当txt文件中的SSN列不等于9位数字时,不应将包含该列的行插入数据库中 实际行为:当SSN列不等于9位数字时,仍将其插入数据库 要插入的列:姓,名,MI,SSAN和工资率 SSAN的存储过程代码:@SSAN nchar(9) 这是我在包含SQL的类中执行SSAN的方式: cmdSQL.Parameters.Add(new SqlParameter("@SSAN", SqlDbType.NChar)); cmdSQL.Parameters["@SS

这是一个学校项目,我感谢你的帮助

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

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

要插入的列
MI
SSAN
工资率

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
设置为
true
false
,这是可以的。但是,您随后检查
strFields[1]
,并根据该值继续将
blnOK
设置为
true
false
,无论之前的检查是什么。这将贯穿你的所有领域。最终结果是,
IsValidRecord
的结果将始终是您检查的最后一个字段的结果(在本例中,
strFields[4]
),而不管其他检查的结果是什么

解决这个问题的简单方法是
返回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

您需要包含更多的代码。在什么时候进行验证?您实际上是在什么时候插入数据的?显而易见的答案是,无论输入验证的结果如何,您都在插入记录,您需要重新构造代码以防止出现这种情况。嗨,Daniel,感谢您的快速响应。这是我检查验证时的代码。您好,克莱斯,谢谢您的快速回复。我将IsValidRecord中的所有IF设置为false,ELSE设置为true,但它仍在插入无效记录。我为我的慢道歉,我感谢你的耐心。只是颠倒顺序是没有帮助的;您最终还是要切换该变量。在另一次检查将变量返回到
true
之前,您仍然需要某种方法将值返回为
false
。我在帖子中更新了代码,试图将值返回到false(如果我是对的),但仍然插入了错误的数据:(我用另一个变体更新了我的答案。如果你在调试器中放入
IsValidRecord
,你应该能够重现这个问题;将
工资率
之外的所有设置都设置为无效,然后查看
IsValidRecord
的结果。它应该是
false
,但在现在的代码中,我t将以
为真
结束。