2013-08-20 64 views
2

我在執行以下代碼時遇到問題。使用Ngpsql數據適配器。該函數採用可數據創建和更新查詢更新命令通過時需要有效的insertCommand DataRow

參數字符串值是動態生成的更新值,然後與局部變量字符串查詢連接並創建一個查詢,如 UPDATE xyz SET ecode = @ ecode,name = @ name。 ....等等

public void TransactionRecording(DataTable DT, string values,bool update) 
    {    
     string Query = ""; 
     NpgsqlDataAdapter NgAdapter = new NpgsqlDataAdapter(); 

     if (update) 
     { 
      Query += "UPDATE Cards SET " + values; 
      NgAdapter.UpdateCommand = new NpgsqlCommand(Query, connection); 
      this.UpdateParameterSetForLocalToCentral(NgAdapter); 

     } 
     else 
     { 
      Query += "INSERT INTO Cards (ecode, ename, fname, address1, address2, address3, deo, employee, active, birth, type, company, Designation, photo, manual, visit_to, visit_name, vehicle, modifideby, registered, validity, tpl, serial, gateno, level, gate_in, gate_out) VALUES(" + values + ")"; 
      NgAdapter.InsertCommand = new NpgsqlCommand(Query, connection); 
      this.InsertParameterSetForLocalToCentral(NgAdapter); 
     } 


     try { 
      NgAdapter.Update(DT); }catch(Exception ex) 
     {  
     MessageBox.Show(ex.Message); 
     } 


    } 

    public void UpdateParameterSetForLocalToCentral(NpgsqlDataAdapter NgAdapter) 
    { 

     foreach (string name in Enum.GetNames(typeof(LocalToCentralFields))) 
     { 
      switch (name) 
      { 
       case "ecode": 
       case "ename": 
       case "fname": 
       case "address1": 
       case "address2": 
       case "address3": 
       case "type": 
       case "company": 
       case "Designation": 
       case "visit_to": 
       case "visit_name": 
       case "vehicle": 
       case "modifideby":     
       case "serial": 
       case "gateno": 
       case "level": 
       case "gate_in": 
       case "gate_out": 
        NpParam = NgAdapter.UpdateCommand.Parameters.Add("@"+name,NpgsqlTypes.NpgsqlDbType.Varchar); 
        break; 
       case "deo": 
       case "employee": 
       case "active": 
        NpParam = NgAdapter.UpdateCommand.Parameters.Add("@" + name, NpgsqlTypes.NpgsqlDbType.Boolean); 
        break; 
       case "birth": 
       case "registered": 
       case "validity": 
        NpParam = NgAdapter.UpdateCommand.Parameters.Add("@" + name, NpgsqlTypes.NpgsqlDbType.Timestamp); 
        break; 
       case "photo": 
       case "tpl": 
        NpParam = NgAdapter.UpdateCommand.Parameters.Add("@" + name, NpgsqlTypes.NpgsqlDbType.Bytea); 
        break; 

      } 
      NpParam.SourceVersion = DataRowVersion.Original; 
      NpParam.SourceColumn = "ecode"; 

     } 

    } 

收到此錯誤更新命令時需要經過一個DataRow一個有效的InsertCommand,以及我更新的行,那麼爲什麼要求插入命令,請幫助

謝謝

回答

1

當您調用NgAdapter.Update時,它會根據行的rowState爲DataTable的每一行調用適當的命令。如果RowState的插入,它要求InsertCommand,如果RowState的被刪除,它要求DeleteCommand,所以你必須在你的DataAdapter定義的所有命令

+0

現在我已經創建了一個插入命令作爲其寫在上面的代碼,但現在它的說列不存在?什麼似乎是問題,但列中有數據庫的表 –

+0

請發佈完整的錯誤 - 什麼列不存在? –

+0

好的我整理出我缺少添加插入查詢的參數。好的,這是我得到的另一個錯誤。說重複的鍵違反了唯一的約束「PK_Cards」,所以ecode列是主鍵我創建了更新命令和插入命令我想更新數據庫中現有的一個如果沒有找到插入它,我填充數據更新字段不要在數據庫中插入更新的字段 –

相關問題