2012-10-16 2 views
2

문제 : C#의 Oledb 인터페이스를 사용하여 액세스 데이터베이스에 날짜 시간을 삽입하려고합니다.Access에 DateTime을 삽입하십시오.

해킹 솔루션 : 나는 문제없이 데이터베이스에 텍스트를 삽입 할 수 있습니다 command.Properties

를 사용하지 않고 내 삽입에 문자열을 생성하지만 날짜를하려고 할 때이 오류로 끝날 : System.Data.OleDb를. OleDbException { "조건 식의 데이터 형식이 일치하지 않습니다."}

몇 가지 게시물이 유사하지만 작동하지 않는 것이 있습니다. 내가 생각할 수있는 날짜 시간의 모든 순열을 시도, 지역 표시된 테스트 코드 내부

void TransferData() 
{ 
    string instCmd = Get_InsertCommand(0); // hard coded table 0 for testing 

    Fill_ProductTable_ToInsert(); 

    con.Open(); 


    // It would be nice not to have to separate the date indexes 
    int[] textIndex = { 0, 1, 2, 3, 4, 7 }; 
    int[] dateIndex = { 5, 6 }; 
    try 
    { 
     foreach (DataRow row in DataToStore.Tables[0].Rows) 
     { 
      OleDbCommand command = new OleDbCommand(); 
      command.Connection = con; 

      command.CommandText = instCmd; 

      foreach(int j in textIndex) 
       command.Parameters.AddWithValue("@" + j, row[j]); 
      foreach (int j in dateIndex) 
      { 

       // TESTING CODE 
       /////////////////////////////////////////////////////////////////////////// 

       string input = "#\'" +DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") +"\'#"; 
       command.Parameters.AddWithValue("@" + j, input.ToString()); 
       Program.WriteLine(input.ToString()); 

       /////////////////////////////////////////////////////////////////////////// 
      } 


      command.ExecuteNonQuery(); 
     } 
    } 
    finally 
    { 
     con.Close(); 
    } 
} 

string Get_InsertCommand(int i) 
{ 
    string sqlIns = "INSERT INTO " + DataToStore.Tables[0].TableName + " ("; 
    string temp = "VALUES ("; 
    for (int j = 0; j < expected_header[i].Length - 1; j++) 
    { 
     sqlIns += expected_header[i][j] + ", "; 
     temp += "@" + j + ", "; 
    } 

    int lastIndex = expected_header[i].Length -1; 
    sqlIns += expected_header[i][lastIndex] + ") "; 
    temp += "@" + lastIndex + ")"; 
    sqlIns += temp; 

    return sqlIns; 
} 

:

여기 내 코드입니다. 나는 모든 형식을 # 및 ' yyyy-MM-dd, yyyyMMdd, yyyy/MM/dd, yyyy/MM/dd 시도했다 또한 ToOADate() 시도한 및 ToString(), ToShortDateString()

나는 또한 내가 아이디어의 부족 해요 ANSI SQL-92

을 허용하도록 데이터베이스를 설정했습니다. 이 코드는 루프를 마음, 여러 데이터베이스에서 여러 테이블을 처리하도록 설정되어 ... 제대로

답변

4

사용 매개 변수, 당신이 연결할 날짜 시간 값의 형식에 대해 걱정하지 마십시오 :

당신의 질문. datetime 값을 문자열 값으로 변환하려는 이유를 이해할 수 없습니까?

DateTime theDate = new DateTime(2012,10,16); 
var cmd = new OleDbCommand(); 
cmd.CommandText = "INSERT INTO sometable (column) VALUES (@p_bar)"; 
cmd.Parameters.Add ("@p_bar", OleDbType.DateTime).Value = theDate; 
+1

OtimeTime.Now, DateTime.Now.Date 등의 다양한 날짜/시간 입력과 함께 OleDbType.Date 및 OleDbType.DBDate를 사용하여 같은 오류가 발생합니다. new DateTime (2012,2,3), 모두 같은 끝입니다. – user1642357

+0

실행하기 전에 생성 한 SQL 문을 콘솔에 인쇄하고 올바른지 확인하십시오. –

+0

OleDbCommand 개체에서 전체 명령을 인쇄하려면 어떻게합니까? 명령 형식이 정확하고 문자열 값에 대해 작동하며 데이터베이스의 필드를 문자열로 전환하면 필드에 날짜를 배치 할 수 있지만 실제 날짜로 날짜를 넣을 수 있습니다. – user1642357

0

명령 속성을 사용하지 않아도이 문제를 해결할 수있었습니다. 내 자신의 SQL 입력을 생성하고 그것을 cmd.commandText로 설정합니다. datetime에 대한 데이터베이스 입력은 # yyyy-MM-dd입니다. #

+0

# dd-MM-yy # 걸릴 수도 있습니다. # dd-MM-yy hh : mm : ss # 및 #hh : mm : ss dd-MM-yy #. – JNF

관련 문제