c#使用数组与数据库进行数据比较
本文关键字:数据 比较 数据库 数组 | 更新日期: 2023-09-27 18:16:09
我的数据库包含2条记录。我检索这两条记录并存储在数组中。假设我的数据库有start point
, destination
, terminal
和departure 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"
}
问题出在你的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操作之前,通过存储过程直接对数据库进行检查可能是一个好主意。这样会快很多。