여기 내 문제가 자세히 설명되어 있습니다. 데이터베이스 (Odbc, OleDb 및 SqlClient)와 통신하는 데 필요한 대부분의 개체를 만들 수있는 데이터 액세스 계층 클래스를 만들었습니다. 또한 리플렉션을 집중적으로 사용하여 비즈니스 개체 처리 레이어 클래스를 만들어 내 비즈니스 개체로 많은 작업을 처리했습니다. 이 클래스는 DAL 처리 (SQL 스트림, 값 목록, 속성 목록, 검색 값 설정 등)에 필요한 모든 단일 속성/개체를 생성합니다. 선택 문을매개 변수를 추가하고 일반 IDbCommand를 실행하는 방법
Public Shared Function InvokeParam(Of T)(_classObject As T, _commandType As AdapterCommandType, _arguments As Object()) As Boolean
Dim s As String = DAL.SCRFL.GetParamStatement(_classObject, _commandType, _arguments)
'Debug.Print(s)
Dim hT As Hashtable = DAL.SCRFL.GetProperties(_classObject)
Using cnn As IDbConnection = DataFactory.CreateConnection()
Dim cmd As IDbCommand = DataFactory.CreateCommand(s, cnn)
'cmd.CommandType = CommandType.Text
cmd.CommandText = s
For Each k In hT
Dim param As IDbDataParameter = cmd.CreateParameter()
'param.DbType = DataFactory.ConvertToDbType(k.value.GetType)
param.Value = k.value
param.ParameterName = k.key
'param.Direction = ParameterDirection.Input
'Debug.Print("value:={0}, name:={1}", TypeName(k.value), TypeName(k.key))
Debug.Print("typeMatch:={0}, value:={1}, name:={2}", TypeName(param.Value) = TypeName(k.value), param.Value, param.ParameterName)
cmd.Parameters.Add(param)
Next
If (cmd.ExecuteNonQuery > 0) Then
Return True
End If
End Using
Return False
End Function
그래서, DAL.SCRFL.GetParamStatement
반환 문자열이 업데이트 삽입하고 적절한 문자열에 대한 INSERT INTO t1 (f1, f2, f3...) values (?, ?, ?...)
로 포맷 삭제 : 추가 설명을 살펴에게 아래의 코드를 가져 가라. 모든 것은 성찰을 통해 이루어진다. 여기에 구문 오류가 없습니다. 직접 공급자 유형 명령을 통해 반환 된 값을 수동으로 실행할 수 있습니다. DAL.SCRFL.GetProperties
메서드는 key = property (field), value = field 값으로 포맷 된 해시 테이블을 반환합니다.
이제 각 속성에 대한 매개 변수를 만들어 내 명령 매개 변수에 추가 한 다음 실행해야합니다. 이 시도는 내 코드에서 볼 수 있습니다 (해시 테이블을 반복하여 각 속성/값 쌍에 대한 매개 변수를 만듭니다). 그러나 결국에는 Data type mismatch in criteria expression.
설명과 함께 예외가 발생합니다. 나는 type
속성을 매개 변수 객체 size
등에 추가하려고 시도했지만 모두 실패했습니다 (나는 주석을 달았습니다). param.Value = k.value
을 param.Value = If(IsDBNull(k.value), DBNull.Value, k.value)
으로 변경하려고 시도했는데 k.value
이 내 비즈니스 클래스의 것이므로 의도적으로 null 값을 방지합니다. 아무 일도 없었다! 여기 테스트입니다; DAL.SCRFL.GetParamStatement
호출에서 비즈니스 클래스 반환 값 :이 테스트는 OleDb/Access 데이터베이스에 대해 수행되며, 알 수 있듯이 메모 필드를 작은 따옴표로 묶었습니다. 내 반사 방법은 클래스 속성의 속성 (테이블 필드 이름으로 설정)을 읽고 DAL.SCRFL.GetParamStatement
은 삽입, 업데이트, 삭제 및 선택 사용을위한 기본 sql 문을 작성합니다. AdapterCommandType
은 내장 열거 형입니다.) 나는 철저하게 내 SQL 문에 특성 = 값 쌍을 구성하는 각 속성에 대한 값 유형을 확인하여 SQL 문 (InvokeSql를) 실행과 유사한 다른 방법이
INSERT INTO Clinics
(ClinicId, ClinicName, Phone, Fax, FederalId, DateContracted, Address, City, State, Zip, Inactive, [Memo], DateEntered, EnteredBy, DateModified, ModifiedBy)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
참고. InvokeSql
에있는 정규화 된 SQL 문을 사용하면 메서드가 작동하고 단일 경고가 표시됩니다 (Rouphly : cnn As IDbConnection = CreateConnection(), cmd = CreateCommand(_cmdText, cnn), cmd.ExecuteNonQuery()
여기서 _cmdText
은 볼 수있는 것처럼 매개 변수가 없습니다!). 이 문제는 일반적인 IDbCommands 매개 변수를 사용할 때마다 문제가 발생한다는 점을 지적합니다. 내 DataFactory 내에서도 IDbCommand는 공급자 특정 명령 유형으로 설정됩니다 (내 DataFactory.CreateCommand(s, cnn)
은 일반 IDbCommand를 반환 함).
내 DAL 개발 이전에는 모든 개체 (명령, 연결 등)가 공급자 별 형식으로 명시 적으로 지정되었지만 위의 모든 단계를 수동으로 수행하고있었습니다. 엄밀히 말하자면 일반적인 유형의 객체 (공급자 별이 아님)를 사용하는 것과 똑같은 시나리오를 사용하고 있습니다. 그러나 나는 그것을 작동시킬 수 없다, 어딘가에, 아마, 나는 뭔가를 놓치고있다.