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의 인스턴스 수준에 무언가가 있습니까? 내 생각 엔 ...
더 많은 연구가이 문제를 해결해야합니다.
당신은 DB 쿼리 및 테이블 구조를 보여줄 수 있습니까? 나는 '44444'는 '필드 X는 null 값을 포함 할 수 없다'는 오류 코드라고 생각합니다. 일괄 처리 업데이트를 실행할 때 Null을 허용하지 않는 열에 Null 값을 삽입하려고했는지 쿼리가 잘못 표에 붙어 있는지 (트리거 섹션을 검사하는지) 확인하십시오. –
감사합니다, 테츠야, 테이블 구조를 보여 드리겠습니다. 데이터베이스는 그대로 SQL 2016의 새 인스턴스로 마이그레이션되었습니다.이 이전에 작동하는 프로그램에 영향을 줄 수있는 인스턴스 수준 옵션이나 구성 선택에 대해 알고 있습니까? –
당신의 쿼리 나 데이터베이스 트리거 처리에서 어딘가에 다음 문장이 포함될 수 있다고 생각합니다 :'RAISERROR 44444 '% message_text %''. SQL 함수로 변경해야한다 :'RAISERROR (44444, '% message_text %')'. –