【发布时间】:2019-09-26 08:32:07
【问题描述】:
我正在构建一个程序,将数据从 Excel 文件导入数据库,或通过写入文本框(通过在 asp.net 中插入)或两者兼而有之,但我想在用户尝试输入时发出警告数据库中已有的相同记录(重复)。
我想通过在 SQL 中编码或设置一些东西来做到这一点,以使用户更容易......
这是我的桌子:
Mov. Date Value Date description of the movement Value in EUROS
---------------------------------------------------------------------------
12-12-2001 12-12-2001 DEPOSITO EM NUMERARIO 222 200,01
12-12-2001 12-12-2001 DEPOSITO EM NUMERARIO 223 200,01
12-12-2001 12-12-2001 DEPOSITO EM NUMERARIO 224 200,02
如果用户输入的记录等于其中任何一个,它会发出警告,用户可以再试一次
这是代码(asp.net C#):
protected void Upload_Click(object sender, EventArgs e)
{
string excelPath = Server.MapPath("~/Nova pasta/") + Path.GetFileName(FileUpload1.PostedFile.FileName);
string filepath = Server.MapPath("~/Nova pasta/") + Path.GetFileName(FileUpload1.FileName);
string filename = Path.GetFileName(filepath);
FileUpload1.SaveAs(excelPath);
string ext = Path.GetExtension(filename);
string strConnection = @"Data Source=PEDRO-PC\SQLEXPRESS;Initial Catalog=costumizado;Persist Security Info=True;User ID=sa;Password=1234";
string excelConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filepath + ";Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=1;\"";
OleDbConnection excelConnection = new OleDbConnection(excelConnectionString);
OleDbCommand cmd = new OleDbCommand("Select * from [rptListaMovs_4$A15:D75]", excelConnection);
excelConnection.Open();
cmd.ExecuteNonQuery();
OleDbDataReader dReader;
dReader = cmd.ExecuteReader();
DataTable dtFail = new DataTable();
using (SqlBulkCopy sqlBulk = new SqlBulkCopy(strConnection))
{
sqlBulk.ColumnMappings.Add("Mov. Date", "Mov. Date");
sqlBulk.ColumnMappings.Add("Value Date", "Value Date");
sqlBulk.ColumnMappings.Add("description of the movement", "description of the movement");
sqlBulk.ColumnMappings.Add("Value in EUROS", "Value in EUROS");
sqlBulk.DestinationTableName = "Dados";
var temp = dtFail.AsEnumerable().Distinct();
dtFail = temp.CopyToDataTable();
sqlBulk.WriteToServer(dReader);
}
excelConnection.Close();
}
【问题讨论】:
-
您可以在列上添加唯一性约束,或者选择 * 并在内存中执行验证
-
@Daniel 不能对列进行唯一约束,否则我不能在不同的记录中拥有两个相等的值。我只是不希望我的程序让用户错误地输入两行......你在说的第二件事是什么?
-
只是一种预感,但您在 DataTables 集合上调用 Linqs
.Distinct。这可能使用引用相等并失败。我认为最简单的方法是将表单数据解析为值类型结构的集合,然后使用.GroupBy(x => x) .Where(g => g.Count() > 1)之类的东西来检查是否有任何重复。 -
如果你做 SQL 你可以简单地做一个合并语句,如果它匹配然后更新,它不匹配插入。您可以做的另一件事是使用 SQL 输出功能获取输入的 id 并将其从列表中删除,然后再继续。
-
当你得到答案时不要删除你的问题。见meta.stackoverflow.com/questions/378440/…。
标签: c# asp.net sql-server excel