2016-08-03 1 views
0

내 프로그램에 다음과 같은 INSERT 쿼리가 있습니다 (변수에 Access 데이터베이스의 값이 할당되고 새 SQL Server 데이터베이스에 삽입됩니다.). 코드가 잘 통해 실행의 Parameters.Add 섹션의 값은해야한다 무엇을 모든이 있지만,이 라인 sql.ExecuteNonQuery()에 도달 할 때 나는 오류를 캐스트 사양에 대한캐스트 사양의 문자 값이 잘못되었습니다. vb.net MS Access to SQL Server 가져 오기

잘못된 문자 값을 제공받을. System.Data.OleDb.OleDbCommand.ExecuteNonQuery에서 System.Data.OleDb.OleDbCommand.ExecuteReaderInternal (CommandBehavior를 행동, 문자열 방법) ()

 For Each dr As DataRow In getDataTable(sqlct, importsCon, Nothing).Rows 

      Dim conID As Integer 
      Dim custacc As String 
      Dim datestart As Object 
      Dim daterenew As Object 
      Dim fee As Double 
      Dim agree As String 
      Dim details As String 
      Dim datesent As Object 
      Dim timesent As Object 
      Dim remname As String 
      Dim remmail As String 

      conID = dr("ContractID") 
      custacc = dbToString(dr("CustAcc")) 
      datestart = dbToDate(dr("DateStart")) 
      daterenew = dbToDate(dr("DateRenew")) 
      fee = dr("Fee") 
      agree = dbToString(dr("Agreement")) 
      details = dbToString(dr("OtherDetails")) 
      datesent = dbToDate(dr("DateSent")) 
      timesent = dbToTime(dr("TimeSent")) 
      remname = dbToString(dr("ReminderName")) 
      remmail = dbToString(dr("ReminderEmail")) 

      sql.CommandText = "INSERT INTO tblContracts(ContractID, CustAcc, DateStart, DateRenew, Fee, Agreement, OtherDetails, DateSent, TimeSent, ReminderName, ReminderEmail) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" 
      sql.Transaction = tr 
      sql.Parameters.Clear() 
      sql.Parameters.Add("@ContractID", OleDbType.Integer).Value = conID 
      sql.Parameters.Add("@CustAcc", OleDbType.VarChar).Value = custacc 
      sql.Parameters.Add("@DateStart", OleDbType.DBDate).Value = datestart 
      sql.Parameters.Add("@DateRenew", OleDbType.DBDate).Value = daterenew 
      sql.Parameters.Add("@Fee", OleDbType.Double).Value = fee 
      sql.Parameters.Add("@Agreement", OleDbType.VarChar).Value = agree 
      sql.Parameters.Add("@OtherDetails", OleDbType.VarChar).Value = details 
      sql.Parameters.Add("@DateSent", OleDbType.DBDate).Value = datesent 
      sql.Parameters.Add("@TimeSent", OleDbType.DBDate).Value = timesent 
      sql.Parameters.Add("@ReminderName", OleDbType.VarChar).Value = remname 
      sql.Parameters.Add("@ReminderEmail", OleDbType.VarChar).Value = remmail 

      sql.ExecuteNonQuery() 
      sql.Parameters.Clear() 

     Next 

내 코드의 문제는 무엇인가에 ? 데이터 유형의 모든 데이터베이스의 (객체가 데이터베이스에 날짜,하지만 그들은 처음에있어 그들이 먼저 다른 기능을 통해 이동으로 객체) 주석에서 발견으로

+0

@ GordThompson 모든 OleDbType.VarChar를 OleDbType.VarWChar로 변경했습니다. 동일한 오류 메시지가 나타납니다. –

+1

INSERT 쿼리에서'sql '을 실행하면됩니다. CommandText = "INSERT INTO tblContracts (ContractID) VALUES (?)'다음에 conID를 제외한 모든 매개 변수 행을 주석 처리하십시오 프로그램이 작동하는지 확인하십시오 (CustAcc)를 추가하고 깨는 것을 찾을 때까지 프로세스를 반복하십시오 문제를 좁히는 데 도움이됩니다. – David

+0

@David 감사합니다. 오류는'sql.Parameters.Add ("@ DateSent", OleDbType.DBDate)입니다 .Value = datesent' –

답변

0

일치 문제는 라인에 sql.Parameters.Add("@DateSent", OleDbType.DBDate).Value = datesent

가져 오기중인 데이터베이스가 하나 이상의 레코드에서이 필드에 null 값을 저장하고 있기 때문에 null인지 여부를 확인하는 함수에서이 값이 null에서 12:00:00 AM으로 변환됩니다 (이 코드는 질문에 나와 있지 않습니다. 이유 또는 방법이 확실하지 않습니다.

이제 12:00:00 AMDBDate 값으로 삽입 할 수 없습니다. 주석에 표시된대로 날짜 형식 값 (yyyyMMdd 또는 이와 비슷한 값)이 필요합니다.

이 문제에 대한 솔루션은 수이 작동하고를 삽입 단순히 지정되고도없이 날짜 값을 삽입하지 않습니다 OleDbType.Date를 사용

sql.Parameters.Add("@DateSent", OleDbType.Date).Value = datesent 

에 상기 라인을 변경하는 것입니다 이 메소드의 기본 날짜는 1899-12-30입니다. 그러나 어느 쪽이든, 당신의 문제를 해결할 것입니다

+0

데이비드 감사합니다,이 그것을 해결했습니다! 더 이상 혼란을 피하기 위해 날짜로 변경했습니다 :) –

관련 문제