在使用ASP.NET插入数据时,如何避免数据库中的不同记录



我正在构建一个程序,该程序将数据从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();
...

现有的邮政传递表值参数

中的示例

最新更新