C# 使用SqlBulkCopy时如何防止重复条目?
我正在使用SqlbulkCopy将excel数据导入sql server,但问题是我希望防止输入任何重复记录。是否有一种方法可以自动忽略或删除副本C# 使用SqlBulkCopy时如何防止重复条目?,c#,asp.net,sql,sql-server,duplicates,C#,Asp.net,Sql,Sql Server,Duplicates,我正在使用SqlbulkCopy将excel数据导入sql server,但问题是我希望防止输入任何重复记录。是否有一种方法可以自动忽略或删除副本 protected void Button1_Click(object sender, EventArgs e) { string strFileType = System.IO.Path.GetExtension(FileUpload1.FileName).ToString().ToLower(); string strFileNa
protected void Button1_Click(object sender, EventArgs e)
{
string strFileType = System.IO.Path.GetExtension(FileUpload1.FileName).ToString().ToLower();
string strFileName = FileUpload1.PostedFile.FileName.ToString();
FileUpload1.SaveAs(Server.MapPath("~/Import/" + strFileName + strFileType));
string strNewPath = Server.MapPath("~/Import/" + strFileName + strFileType);
string excelConnectionString = String.Format(@"Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + strNewPath + "; Extended Properties=Excel 8.0;");
// Create Connection to Excel Workbook
using (OleDbConnection connection = new OleDbConnection(excelConnectionString))
{
var command = new OleDbCommand("Select ID,Data FROM [Sheet1$]", connection);
connection.Open();
// Create DbDataReader to Data Worksheet
using (DbDataReader dr = command.ExecuteReader())
{
// SQL Server Connection String
string sqlConnectionString = "Data Source=ARBAAZ-1B14C081;Initial Catalog=abc;Integrated Security=True";
con.Open();
DataTable dt1 = new DataTable();
string s = "select count(*) from ExcelTable";
string r = "";
SqlCommand cmd1 = new SqlCommand(s, con);
try
{
SqlDataAdapter da1 = new SqlDataAdapter(cmd1);
da1.Fill(dt1);
}
catch
{
}
int RecordCount;
RecordCount = Convert.ToInt32(cmd1.ExecuteScalar());
r = RecordCount.ToString();
Label1.Text = r;
con.Close();
int prv = Convert.ToInt32(r);
// Bulk Copy to SQL Server
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConnectionString))
{
bulkCopy.DestinationTableName = "ExcelTable";
SqlBulkCopyColumnMapping mapping1 = new SqlBulkCopyColumnMapping("excelid", "id");
SqlBulkCopyColumnMapping mapping2 = new SqlBulkCopyColumnMapping("exceldata", "data");
bulkCopy.ColumnMappings.Add(mapping1);
bulkCopy.ColumnMappings.Add(mapping2);
bulkCopy.WriteToServer(dr);
}
con.Open();
DataTable dt = new DataTable();
s = "select count(*) from ExcelTable";
r = "";
SqlCommand cmd = new SqlCommand(s, con);
try
{
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(dt);
}
catch
{
}
RecordCount = Convert.ToInt32(cmd.ExecuteScalar());
r = RecordCount.ToString();
Label1.Text = r;
con.Close();
int ltr = Convert.ToInt32(r);
if (prv == ltr)
{
Label1.Text = "No records Added";
}
else
{
Label1.Text = "Records Added Successfully !";
}
}
}
}
是否可以通过创建删除重复项的触发器来修复此问题?如果是,怎么做?我是个新手,我从来没有发明过触发器
另一个问题是,无论我尝试什么,我都无法使列映射工作。当excel工作表和数据库中的列名不同时,我无法上载数据。您可以创建
当您将批量数据插入数据库时,不会插入所有重复值。否,您可以在代码上的dr对象上管理数据,然后再将其加载到数据库中(如运行独特操作),或者在数据库上创建触发器进行检查。触发器会降低批量插入的性能 另一种选择是批量插入到临时表中,然后使用select DISTINCT从临时表插入到目标表中, 从excel文件本身导入时,可以过滤掉多余的行 应在OleDbCommand构造函数中使用以下SQL查询
var command = new OleDbCommand("Select DISTINCT ID,Data FROM [Sheet1$]", connection);
你不需要在所有字段上建立索引吗?哦,他只导入id和数据:)这是一个很好的解决方案,但如果表上确实存在重复的记录,这就行不通了,只需要在整体上忽略process@user1557976在他的表格中只有两列。@kmatyaszek我的朋友你酸溜溜地解决了一个大问题,我有一个问题,我甚至没有提到lol
var command = new OleDbCommand("Select DISTINCT ID,Data FROM [Sheet1$]", connection);