2017-09-06 5 views
1

VB.Net Windows 양식 프로그램이 "프로덕션"환경에서 제대로 실행됩니다 (예 : .EXE가 Windows 2008R2 서버에서 실행되어 SQL에 연결됨). 다른 서버의 Server 2008 데이터베이스).'44444'근처의 잘못된 구문 - recordset.UpdateBatch 메서드

"테스트"환경 (예 : AWS에서 호스팅, 데이터베이스 서버가 AWS 로의 전환을 관리하는 sysadmin에 의해 SQL Server 2016으로 업그레이드 됨) 로의 이동과 함께 복제되었습니다.

질문 : AWS의 테스트에서이 오류가 일부 유형의 SQL 2016 구성 문제를 가리 킵니까?

코드는 다음과 같습니다

Dim cn As New ADODB.Connection() 
cn.ConnectionString = BuildConnectStringODBC() 
cn.Open() 
rs = New Recordset 
rs.CursorLocation = ADODB.CursorLocationEnum.adUseClient 
rs.CursorType = ADODB.CursorTypeEnum.adOpenKeyset 
rs.LockType = ADODB.LockTypeEnum.adLockBatchOptimistic 
rs.Open("ImportTempTable", cn) 
rs.AddNew() 
rs.Fields("StateCD").Value = CRMortgage.StateCD 
rs.Fields("CountyCD").Value = CRMortgage.CountyCD     
' etc. 
rs.UpdateBatch() 

단일 단계 디버깅은 RS에 위의 방법 모두가 "잘못된 구문"오류와 함께 실패 rs.UpdateBatch 때까지 제대로 일을 반대 보여줍니다.

이 프로그램은 "프로덕션"에서 여러 번 실행되고 sysadmin 사용자가 SQL 서버 구성이나 옵션으로 의심 스럽지만 어디서부터 시작해야할지 확실하지 않습니다.

편집 UPDATE :

: 나는 실제로 위의 표와 관련된 두 개의 트리거를 찾았어요,

CREATE TABLE [dbo].[ImportTempTable](
    [StateCD] [varchar](2) NULL, 
    [CountyCD] [varchar](3) NULL, 
    [SaleMnYear] [datetime] NULL, 
    [LenderName] [varchar](40) NULL, 
    [MDSID] [varchar](6) NULL, 
    [Amt_PUR] [int] NULL, 
    [Nbr_MTG] [int] NULL, 
    [Amt_MTG] [int] NULL, 
    [Nbr_JUMBO] [int] NULL, 
    [Amt_JUMBO] [int] NULL, 
    [Nbr_GOVT] [int] NULL, 
    [Amt_GOVT] [int] NULL, 
    [Nbr_Fixed] [int] NULL, 
    [Nbr_ARMS] [int] NULL, 
    [Nbr_NewConst] [int] NULL, 
    [Amt_Fixed] [int] NULL, 
    [Amt_ARMS] [int] NULL, 
    [Amt_NewConst] [int] NULL, 
    [LTV] [real] NULL, 
    [Nbr_Below80] [int] NULL, 
    [Nbr_80_85] [int] NULL, 
    [Nbr_85_90] [int] NULL, 
    [Nbr_Above90] [int] NULL, 
    [LoanType] [varchar](1) NULL, 
    [SaleType] [varchar](1) NULL, 
    [RateType] [varchar](1) NULL, 
    [CondoCode] [varchar](1) NULL, 
    [Zip] [varchar](5) NULL, 
    [ZipSuffix] [varchar](4) NULL, 
    [StateAbbr] [varchar](2) NULL, 
    [DateImported] [datetime] NULL, 
    [RecordType] [varchar](1) NULL 
) ON [PRIMARY] 

가 조사 : 여기

는 ImportTempTable SQL에서 MGMT 스튜디오의 스크립트 스키마입니다

ALTER TRIGGER [dbo].[ImportTempTable_ITrig] ON [dbo].[ImportTempTable] FOR INSERT AS 
/* 
* PREVENT NULL VALUES IN 'SaleMnYear' 
*/ 
IF (SELECT Count(*) FROM inserted WHERE SaleMnYear IS NULL) > 0 
    BEGIN 
     RAISERROR 44444 'Field ''SaleMnYear'' cannot contain a null value.' 
     ROLLBACK TRANSACTION 
    END 
ELSE 
/* 
* PREVENT NULL VALUES IN 'LenderName' 
*/ 
IF (SELECT Count(*) FROM inserted WHERE LenderName IS NULL) > 0 
    BEGIN 
     RAISERROR 44444 'Field ''LenderName'' cannot contain a null value.' 
     ROLLBACK TRANSACTION 
    END 

ALTER TRIGGER [dbo].[ImportTempTable_UTrig] ON [dbo].[ImportTempTable] FOR UPDATE AS 
/* 
* PREVENT NULL VALUES IN 'SaleMnYear' 
*/ 
IF (SELECT Count(*) FROM inserted WHERE SaleMnYear IS NULL) > 0 
    BEGIN 
     RAISERROR 44444 'Field ''SaleMnYear'' cannot contain a null value.' 
     ROLLBACK TRANSACTION 
    END 
ELSE 
/* 
* PREVENT NULL VALUES IN 'LenderName' 
*/ 
IF (SELECT Count(*) FROM inserted WHERE LenderName IS NULL) > 0 
    BEGIN 
     RAISERROR 44444 'Field ''LenderName'' cannot contain a null value.' 
     ROLLBACK TRANSACTION 
    END 

이러한 트리거가 제대로 작동하지 않았다. 나는 그들의 존재 이유를 재고 할 것이다. 아마 1 년 동안 우리는 "나쁜 데이터"를 얻었고 따라서이 어리석은 오류가 발생했습니다. 위의 열 정의에 NULL 특성이 NULL을 허용한다고 생각했습니다. 이 방아쇠 접근법은 좋지 않은 것으로 보입니다.

트리거를 활성화 또는 비활성화 할 수있는 SQL의 인스턴스 수준에 무언가가 있습니까? 내 생각 엔 ...

더 많은 연구가이 문제를 해결해야합니다.

+0

당신은 DB 쿼리 및 테이블 구조를 보여줄 수 있습니까? 나는 '44444'는 '필드 X는 null 값을 포함 할 수 없다'는 오류 코드라고 생각합니다. 일괄 처리 업데이트를 실행할 때 Null을 허용하지 않는 열에 Null 값을 삽입하려고했는지 쿼리가 잘못 표에 붙어 있는지 (트리거 섹션을 검사하는지) 확인하십시오. –

+0

감사합니다, 테츠야, 테이블 구조를 보여 드리겠습니다. 데이터베이스는 그대로 SQL 2016의 새 인스턴스로 마이그레이션되었습니다.이 이전에 작동하는 프로그램에 영향을 줄 수있는 인스턴스 수준 옵션이나 구성 선택에 대해 알고 있습니까? –

+0

당신의 쿼리 나 데이터베이스 트리거 처리에서 어딘가에 다음 문장이 포함될 수 있다고 생각합니다 :'RAISERROR 44444 '% message_text %''. SQL 함수로 변경해야한다 :'RAISERROR (44444, '% message_text %')'. –

답변

1

Incorrect syntax near '44444' 오류는 SQL 트리거가 SQL Server 2008 R2를 지원하는 RAISERROR 구문의 문서화되지 않은 버전을 사용함을 나타냅니다. 이후 SQL 서버 2012에서 이미 지원되지 않는 문서화되지 않은 RAISERROR 구문은, 그러므로 당신은 RAISERROR syntax을 지원하는 사용하거나 대체 THROW를 사용해야합니다 :

-- RAISERROR example 
RAISERROR(44444, -1, -1, 'Field ''SaleMnYear'' cannot contain a null value.'); 

-- THROW example 
THROW 44444, 'Field ''SaleMnYear'' cannot contain a null value.', 1; 

은 또한 당신이 모두 ImportTempTable_ITrig & ImportTempTable_UTrigImportTempTable에서 트리거 드롭 시도 할 수 있습니다 설정 한 다음 열 SaleMnYear & LenderName NULL 값을 확인할 수있는 최신 SQL Server 버전에서는 트리거가 필요하지 않습니다.

상기 오류 정지 RecordSet.UpdateBatch의로서는
DROP TRIGGER IF EXISTS [dbo].[ImportTempTable_ITrig] 
DROP TRIGGER IF EXISTS [dbo].[ImportTempTable_UTrig] 

-- if the table already contains null value, update them first 
UPDATE [dbo].[ImportTempTable] SET SaleMnYear = {value}, LenderName = {value} 
WHERE SaleMnYear IS NULL {AND/OR} LenderName IS NULL 

ALTER TABLE [dbo].[ImportTempTable] ALTER COLUMN SaleMnYear {data_type} NOT NULL 
ALTER TABLE [dbo].[ImportTempTable] ALTER COLUMN LenderName {data_type} NOT NULL 

그것은 ADO 업데이트 프로세스를 실행하는 조건이있는 경우 문제의 트리거가 널값을 허용하도록 설정하거나 SaleMnYear 또는 LenderName 컬럼에 널 값 (들)을 추가하려고 시도한다는 가정 (원본 데이터 열의 레코드에 null이 포함되지 않도록하십시오).

NB : SQL Server 연결 인스턴스를 처리하기 위해 ODBC ADODB.Connection에 대해 SqlClient.SqlConnection 관리를 사용하는 것이 좋습니다.

참조 :

Differences between RAISERROR and THROW in SQL Server

비슷한 문제 :

Migrating from SQL Server 2008r2 to SQL Sever 2012

RAISERROR issue since migration to SQL Server 2012

+0

일류 응답 주셔서 감사합니다! –