我正在构建一个程序,该程序将数据从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-PCSQLEXPRESS;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();
}
SqlBulkCopy
不是用于条件插入的正确工具。您需要使用Merge语句或IF NOT EXISTS (SELECT ....) INSERT ELSE UPDATE
。
如果您需要提交大量数据查看,以使用表类型表值参数和存储过程来封装条件插入/更新逻辑。
如果需要在找到匹配项时向用户显示消息,则添加列以包含行中所有数据的哈希值可能会有所帮助,以便您可以执行查找和消息或过滤匹配。或如前所述,请使用OUTPUT
SQL子句创建返回的匹配列表。
CREATE TYPE <MyRecord> (
<add columns to match the table as if it was a CREATE TABLE>
)
将数据作为参数绑定到存储过程
...
parameter.SqlDbType = SqlDbType.Structured;
parameter.TypeName = "<MyRecord>";
command.ExecuteNonQuery();
...
现有的邮政传递表值参数