Как избежать отдельных записей из базы данных при вставке данных с использованием asp.net? - PullRequest
0 голосов
/ 08 мая 2019

Я создаю программу, которая импортирует данные из файла 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();
}

1 Ответ

1 голос
/ 08 мая 2019

SqlBulkCopy не подходит для условной вставки. Вам нужно будет использовать оператор слияния или IF NOT EXISTS (SELECT ....) INSERT ELSE UPDATE.

Если вам необходимо отправить большое количество данных, изучите использование типа таблицы Табличный параметр и хранимую процедуру для инкапсуляции условной логики вставки / обновления.

Если необходимо отобразить сообщение пользователю при обнаружении совпадения, может быть полезным добавление столбца, содержащего значение хеш-функции всех данных в строке, чтобы вы могли выполнить поиск и сообщение или отфильтровать совпадения. Или, как уже упоминалось ранее, используйте предложение SQL OUTPUT для создания списка совпадений для возврата.

CREATE TYPE <MyRecord> (
    <add columns to match the table as if it was a CREATE TABLE>
)

Привязать DataTable в качестве параметра к хранимой процедуре

...
parameter.SqlDbType = SqlDbType.Structured;
parameter.TypeName = "<MyRecord>";
command.ExecuteNonQuery();
...

Пример в существующем сообщении Передать параметр таблицы значений

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...