Идентификатор SqlBulkCopy на SQL SERVER

#c# #sql #sql-server #sqlbulkcopy

#c# #sql #sql-сервер #sqlbulkcopy

Вопрос:

Я попытался вставить в базу данных с помощью SqlBulkCopy, но проблема в том, что когда идентификатор на Sql server равен identity (1,1), я получил эту ошибку «Не удается вставить значение NULL в столбец ‘two’, таблица ‘mydb.dbo.test’; столбец не допускает нулей. ОШИБКА вставки. «

 string connString = string.Format("Data Source={0};Initial Catalog={1};Integrated Security=True",DbServer,databaseName);
            DataTable table = new DataTable("test");
            //table.Columns.Add("id");
            table.Columns.Add("one", typeof(int));
            table.Columns.Add("two", typeof(int));

            DataRow row = table.NewRow();
            row["one"] = 1;
            row["two"] = 2;
            table.Rows.Add(row);

            DataRow row2 = table.NewRow();
            row2["one"] = 1;
            row2["two"] = 2;
            table.Rows.Add(row2);

            SqlBulkCopy bulk = new SqlBulkCopy(connString);
            bulk.DestinationTableName = "test";

            try
            {

                bulk.WriteToServer(table);
                bulk.Close();
            }
            catch (Exception ex)
            {
                Console.WriteLine("error. {0}", ex.Message);
            }
            finally
            {
                bulk.Close();
            }
  

редактировать схему таблицы:

 SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[test](
    [id] [INT] IDENTITY(1,1) NOT NULL,
    [one] [INT] NOT NULL,
    [two] [INT] NOT NULL,
 CONSTRAINT [PK_test] PRIMARY KEY CLUSTERED 
(
    [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
  

Комментарии:

1. Добавьте следующее: таблица. Столбцы [«два»]. AllowDBNull= true;

2. не понял связи между идентификатором (1,1) для столбца id и столбца two

3. Пожалуйста, покажите определение вашей таблицы SQL.

4. @demo Эта таблица — просто пример, но везде одна и та же проблема, где id identity

Ответ №1:

Если определение вашей локальной таблицы не соответствует определению сервера (в нем отсутствует столбец идентификатора), вам необходимо добавить явное сопоставление для каждого столбца (с учетом регистра)

Первое значение — это имя локального исходного столбца, второе — имя столбца назначения.

 bulk.ColumnMappings.Add("one", "one");
bulk.ColumnMappings.Add("two", "two");
  

Это также имеет место, если имена не совпадают точно.