c#使用数组与数据库进行数据比较

本文关键字:数据 比较 数据库 数组 | 更新日期: 2023-09-27 18:16:09

我的数据库包含2条记录。我检索这两条记录并存储在数组中。假设我的数据库有start point, destination, terminaldeparture time。如果用户尝试添加same start点,相同的destination,相同的terminal和相同的departure time,则会显示错误信息。但如果用户试图添加相同的start point,相同的destination,相同的terminal,但不同的departure time。它应该允许用户添加,但我有问题,用户不允许添加。

的例子:

这些记录在我的数据库

Record 1 : Terminal = 1 , From = US , To = UK,   Time = 10.00  
Record 2 : Terminal = 1 , From = US , To = AUS , Time = 2.00           

当用户想要添加新记录时

用户希望添加:Terminal = 1, From = US, To = AUS, Time = 10.00

它告诉我记录存在,因为时间10.00存在于另一个位于不同目的地的记录中。有人能帮忙吗?

if (ow_terminal.Any(s => ddlterminal.SelectedValue.Contains(s)) 
 && ow_depart.Any(s => ddlDeparture.SelectedValue.Contains(s)) 
 && ow_origin.Any(s => ddlOrigin.SelectedValue.Contains(s)) 
 && ow_destination.Any(s => ddlDestination.SelectedValue.Contains(s)))
{
    lblMessage.Text = "Record exist";  
}
else
{ 
    lblMessage.Text = "No record exist"
}

c#使用数组与数据库进行数据比较

问题出在你的Linq语句上。

逻辑思考它到底在说什么:

if(terminal_array.Any(s => new_terminal_record.Contains(s)))

因此,如果terminal_array中的任何值与用户输入的新终端记录匹配,则该语句为真,然后您的代码将计算下一行

if(depart_array.Any(s => new_depart_record.Contains(s)))

它会做同样的事情,如果你的出发数组中的任何一个值与用户输入的新的出发记录匹配,那么这个语句也为真。

你最可能想做的是将记录存储在一个数组中,无论你的记录类型是什么,并对该数组中的每条记录执行Linq语句,类似于:

if(records_array.Any(s => new_record.terminal.Equals(s.terminal) &&
                          new_record.depart.Equals(s.depart) &&
                          new_record.origin.Equals(s.origin) &&
                          new_record.destination.Equals(s.destination)))
{
     // Record Exists
}
else
{
     // No Record Exists
}
对于一个更完整的例子,我复制了你的实现,然后包括我的实现:
class Program
{
    // Example of database records
    struct _dbTypes
    {
        public string terminal;
        public string depart;
        public string origin;
        public string destination;
    };
    static void Main(string[] args)
    {
        // First record
        _dbTypes record1;
        record1.terminal = "1";
        record1.depart = "10.00";
        record1.origin = "US";
        record1.destination = "UK";
        // Second record
        _dbTypes record2;
        record2.terminal = "1";
        record2.depart = "2.00";
        record2.origin = "US";
        record2.destination = "AUS";
        // Your implementation has each of the records internals
        // separated into their own array
        List<String> terminals = new List<string>();
        List<String> departs = new List<string>();
        List<String> origins = new List<string>();
        List<String> destination = new List<string>();
        terminals.Add(record1.terminal);
        terminals.Add(record2.terminal);
        departs.Add(record1.depart);
        departs.Add(record2.depart);
        origins.Add(record1.origin);
        origins.Add(record2.origin);
        destination.Add(record1.destination);
        destination.Add(record2.destination);
        // The NEW record that the user has entered
        _dbTypes record3;
        record3.terminal = "1";
        record3.depart = "10.00";
        record3.origin = "US";
        record3.destination = "AUS";
        // Example of your implementation
        if (terminals.Any(s => record3.terminal.Contains(s)) &&
           departs.Any(s => record3.depart.Contains(s)) &&
           origins.Any(s => record3.origin.Contains(s)) &&
           destination.Any(s => record3.destination.Contains(s)))
        {
            // Will fall into here
            Console.WriteLine("Record exists");
        }
        else
        {
            Console.WriteLine("No record exists");
        }
        // What you should probably be doing...
        //
        // Array of your record type
        List<_dbTypes> dataBaseEntries = new List<_dbTypes>();
        //
        // Add the first two records as a whole record, not separated out
        dataBaseEntries.Add(record1);
        dataBaseEntries.Add(record2);
        // Now you want to do the Linq statement over the record
        // AND'ing each .Equals on the current records internal objects
        if (dataBaseEntries.Any(s => record3.terminal.Equals(s.terminal) &&
                                    record3.depart.Equals(s.depart) &&
                                    record3.origin.Equals(s.origin) &&
                                    record3.destination.Equals(s.destination)))
        {
            Console.WriteLine("Record exists");
        }
        else
        {
            Console.WriteLine("No record exists");
            dataBaseEntries.Add(record3);
        }
    }
}

据我所知,您似乎将每个记录的信息存储在单独的数组中,分别用于终端、出发、起点和目的地。这有点问题,因为没有确定信息属于同一记录的具体方法,除非出于某种原因,信息在每个记录的数组中排序:

的例子:

ow_terminal[0] = 1
ow_depart[0] = "US"
ow_origin[0] = "UK"
ow_destination[0] = 10.00

如果是这种情况,那么您必须更改If语句逻辑。我不认为LINQ可以帮助在这种情况下,但你可以试试:

bool exists = false;
for(int i = 0; i < ow_terminal.Count; i++)
{
    if(ddlterminal.SelectedValue.Contains(ow_terminal[i])
       && ddlDeparture.SelectedValue.Contains(ow_depart[i])
       && ddlOrigin.SelectedValue.Contains(ow_origin[i])
       && ddlDestination.SelectedValue.Contains(ow_destination[i]))
     {
           exists = true;
           break;
     }
}
if(exists) lblMessage.Text = "Record exist"; 
else lblMessage.Text = "No record exist";

代码检查相同位置的每个数组的值是否相等。同样,只有当所有数组中的项按每条记录排列时,这才有效。此外,您可能希望更改相等性检查,因为Contains可能不是最适合您的目的(例如,"US"是包含在"RUSSIA"中的)

然而,管理四个数组并确保它们始终正确排序是非常脆弱的。你要做的是创建一个数组(或列表)的对象,对应于你的记录与相应的属性:

public class FlightRecord
{
    public int Terminal {get;set;}
    public string From {get;set;}
    public string To {get;set;}
    public decimal Time {get;set;} // How are you storing time?
}

创建FlightRecords数组从您的数据库记录,然后你可以做你的逻辑,就像你想要的一些小的改变:

if (ow_flightrecords.Any(s => ddlterminal.SelectedValue.Contains(s.Terminal.ToString() 
    && ddlDeparture.SelectedValue.Contains(s.Time.ToString())
    && ddlOrigin.SelectedValue.Contains(s.From)
    && ddlDestination.SelectedValue.Contains(s.To)))
{
    lblMessage.Text = "Record exist";  
}
else
{ 
    lblMessage.Text = "No record exist"
}

这个更健壮,您可以轻松地使用LINQ。再一次,改变你做比较的方式,因为Contains可能不像你想象的那样适合你的目的。

正如Synchro所指出的,在对数据库执行实际的INSERT操作之前,通过存储过程直接对数据库进行检查可能是一个好主意。这样会快很多。