0

여기 내 문제가 자세히 설명되어 있습니다. 데이터베이스 (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.valueparam.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 개발 이전에는 모든 개체 (명령, 연결 등)가 공급자 별 형식으로 명시 적으로 지정되었지만 위의 모든 단계를 수동으로 수행하고있었습니다. 엄밀히 말하자면 일반적인 유형의 객체 (공급자 별이 아님)를 사용하는 것과 똑같은 시나리오를 사용하고 있습니다. 그러나 나는 그것을 작동시킬 수 없다, 어딘가에, 아마, 나는 뭔가를 놓치고있다.

답변

관련 문제