2012-05-10 5 views
1

계속 InvalidOperationException이 발생합니다 (수정 된 행이있는 DataRow 컬렉션을 전달할 때 유효한 UpdateCommand가 필요합니다). 업데이트 명령을 사용하여 잘못된 점을 해결할 수 없습니다. 구글에 대한 몇 가지 간단한 예제가 있지만, 나는 해결책을 해결하지 못하고oleDbDataAdapter.Update (myDataSet)로 Excel 파일을 업데이트하는 방법

OleDbConnection connection; 
    OleDbDataAdapter clientsAdapter new OleDbDataAdapter(); 
    DataSet myDataSet = new DataSet(); 

    public void Setup() 
    { 
     connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Clients.xlsx;Extended Properties=""Excel 12.0 Xml;HDR=YES"";"; 
     connection = new OleDbConnection(connectionString); 
     connection.Open(); 


     // SQL 
     clientsAdapter.SelectCommand = new OleDbCommand("SELECT * FROM [Clients$]", connection); 
     OleDbCommand updateCmd = new OleDbCommand(
      "UPDATE [Clients$] " + 
      "SET " + 
       "[Family Name] = ?, " + 
       "[Given Name] = ?, " + 
       "Address = ?, " + 
       "[Home Phone] = ?, " + 
       "[Work Phone] = ?, " + 
       "[Mobile Phone] = ?, " + 
       "Email = ?, " + 
       "Status = ?, " + 
       "Comments = ? " + 
      "WHERE " + 
       "[Last Name] = ? AND " + 
       "[First Name] = ?" 

     // SET clause 
     updateCmd.Parameters.Add("Family Name", OleDbType.Char, 100, "Family Name"); 
     updateCmd.Parameters.Add("Given Name", OleDbType.Char, 100, "Given Name"); 
     updateCmd.Parameters.Add("Address", OleDbType.Char, 100, "Address"); 
     updateCmd.Parameters.Add("Home Phone", OleDbType.Double, 100, "Home Phone"); 
     updateCmd.Parameters.Add("Work Phone", OleDbType.Char, 100, "Work Phone"); 
     updateCmd.Parameters.Add("Mobile Phone", OleDbType.Char, 100, "Mobile Phone"); 
     updateCmd.Parameters.Add("Email", OleDbType.Char, 100, "Email"); 
     updateCmd.Parameters.Add("Status", OleDbType.Char, 100, "Status"); 
     updateCmd.Parameters.Add("Comments", OleDbType.Char, 100, "Comments"); 

     // WHERE clause 
     OleDbParameter fName = updateCmd.Parameters.Add("Old Family Name", OleDbType.Char, 100, "Family Name"); 
     fName.SourceVersion = DataRowVersion.Original; 
     OleDbParameter lName = updateCmd.Parameters.Add("Old Given Name", OleDbType.Char, 100, "Given Name"); 
     lName.SourceVersion = DataRowVersion.Original; 

     clientsAdapter.InsertCommand = updateCmd; 

     // create table and fill 
     DataTable clients = new DataTable("Clients"); 
     clientsAdapter.Fill(clients); 
     myDataSet.Tables.Add(clients); 

     connection.Close(); 
    } 

    public void UpdateDb() 
    { 
     connection.Open(); 
     clientsAdapter.Update(myDataSet, "Clients"); // errer occurs here 
     connection.Close(); 
    } 

:

는 여기에 지금까지 가지고있는 코드입니다.

+0

하세요 제목에 "- C#"등을 추가하지 마십시오. 그것이 바로 태그가있는 것입니다. –

+0

@john 좋은 포인트 – br3nt

+2

당신은'InsertCommand'를 가지고 있습니다. 'UpdateCommand'는 어디에 있습니까? –

답변

3

clientsAdapter의 UpdateCommand 속성을 설정하지 않았습니다.

그것에 당신은 OleDbCommand 소위 "updateCmd"을 만들었습니다,하지만 당신은에 InsertCommand 속성을 설정 한 :

clientsAdapter.InsertCommand = updateCmd;

나는 당신이 원하는 의심 :

clientsAdapter.UpdateCommand = updateCmd;

+0

Omg, 내가 그랬다는 것을 믿을 수 없다. (복사와 붙여 넣기에 나에게 도움이된다.) 그건 내 할일리스트에 완전히 올랐다. – br3nt