none
SqlDataAdapter UpdateBatchSize 관련

    질문

  • Auto Increment 속성을 지닌 ID 사양 열이 있을 떼

    UpdateBatchSize가 2이상이거나 0 등의 Batch 성 작업으로 하면

    Parameter Not Valid 관련 예외가 발생되는데

    이유와 해결방법을 알려주세요.

    2018년 11월 6일 화요일 오후 3:14

모든 응답

  • 코드를 올려주시겠어요. 일단은 Auto Increment 속성에 관계없이 SqlDataAdapter는 관련 쿼리를 잘 처리합니다.

    참고로, 아래의 글에 보면, SqlParameter의 이름에 "@" 문자를 뺸 경우 발생할 수 있다고 하는데 그런 실수를 한 것이 아닌가 살펴 보세요.

    https://stackoverflow.com/questions/15961208/sqldataadapter-gives-parameter-name-invalid-error-when-setting-batch-size

    2018년 11월 8일 목요일 오전 1:30
  • CREATE TABLE [BULK_TEST](
    	[ID] [int] IDENTITY(1,1) NOT NULL,
    	[A] [nchar](1) NOT NULL,
    	[B] [datetime] NOT NULL,
     CONSTRAINT [PK_BULK_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

    .NET Core 기반입니다.

    using (SqlConnection connection = new SqlConnection(UValue.SqlServerOption.ConnectionString))
    			{
    				using (SqlDataAdapter adapter = new SqlDataAdapter())
    				{
    					using (adapter.SelectCommand = connection.CreateCommand())
    					{
    						adapter.SelectCommand.CommandText = "SELECT * FROM BULK_TEST";
    
    						using (SqlCommandBuilder builder = new SqlCommandBuilder(adapter))
    						{
    							adapter.InsertCommand = builder.GetInsertCommand();
    
    							using (DataTable table = new DataTable())
    							{
    								adapter.FillSchema(table, SchemaType.Source);
    
    								for (int idx = 0; idx < 1000; idx++)
    								{
    									DataRow row = table.NewRow();
    									row["A"] = "C";
    									row["B"] = DateTime.Now;
    
    									table.Rows.Add(row);
    								}
    
    								adapter.UpdateBatchSize = 100;
    								adapter.Update(table);
    							}
    						}					
    					}
    				}
    			}

    SqlCommandBuilder 를 통해 InsertCommand 생성된 것은

    INSERT INTO [BULK_TEST] ([A], [B]) VALUES (@p1, @p2)
    형태로 생성되었습니다.

    ID 열은 자동 증가니 DB에서 자동으로 입력해줄 텐데

    System.ArgumentException: 'Specified parameter name 'Parameter1' is not valid.'

    라고 예외가 발생하네요

    UpdateBatchSize 를 따로 주지 않고 기본값이 1로 되어있는 상태면

    예외없이 잘 INSERT 됩니다.


    • 편집됨 css58_000 2019년 3월 6일 수요일 오전 5:41 내용 추가
    2019년 3월 6일 수요일 오전 5:39
  • 위에서 SelectCommand 쪽의 소스를 올려줬는데, 그거 말고 InsertCommand 쪽을 올려주세요. 일단, 오류가 나는 것이 맞습니다. 왜냐하면 SQL 문에서는 p1, p2 이름으로 나오는데 SqlParameter에는 Parameter1로 설정했을 것이기 때문입니다.
    2019년 3월 6일 수요일 오전 7:15
  • 제대로 안읽어보신것 같으신데 InsertCommand의 경우 CommandBuilder 객체를 통해 자동생성한것이고

    자동생성된 Query가 

    INSERT INTO [BULK_TEST] ([A], [B]) VALUES (@p1, @p2)

    이렇게 나왔다고 이미 적어두었습니다.

    또한 Pamameter 문제였으면 제가 몰랐을리가 없죠

    이미 적혀있듯이 UpdateBatchSize가 1 즉 건 By 건으로 삽입 될 때는 정상동작하는 InsertCommand입니다.

    건 By 건이 아닌 BULK 처럼 밀어넣어버리면 안되니 그러는겁니다.

    또한 애초에 A와 B열을 일반열이고 문제가 되는 열이 ID라는 ID 사양 열인데

    자동증가로 되어있으니 애초에 INSERT 쿼리에서 생략해도 되는거죠

    DB에서 계산되서 들어갈 테니까요

    오히려 수동으로 넣으려면 현재 ID사양 값을 알아와서 다시 넣는 동작을 해야하니 그렇게 할거면

    BULK로 밀어넣지도 않을 거고요


    • 편집됨 css58_000 2019년 3월 8일 금요일 오전 2:05
    2019년 3월 8일 금요일 오전 2:04