2011-04-26 63 views
1

我有一個斷開的dataTable,它包含幾條記錄。使用DataAdapter填充表

我使用以下函數來獲取dataTable

static System.Data.DataTable ReadSetUpTable(string queryStr,SqlConnection sc) 
{ 
    try 
    { 
     var command = new SqlCommand() 
          {Connection = sc, CommandText = queryStr}; 
     var dataAdapter = new SqlDataAdapter() {SelectCommand = command}; 
     var dataTable = new System.Data.DataTable(); 
     dataAdapter.Fill(dataTable); 
     return dataTable; 
    } 
    catch (Exception) 
    { 
     throw; 
    } 
} 

到目前爲止沒有問題。

我想知道的是,如果使用不同的連接字符串可以很容易地將此​​dataTable填充到另一個模式中。

對於這個帖子的緣故,假定有兩列

Create Table Student(StudentId NUMBER(6), StudentName varchar2(50)); 

我想,以填補該表與dataTable,我在上面的代碼表。

我可以用命令Object和insert語句來做到這一點。例如,下面的代碼:

static int LoadDataTable(OracleConnection oc, System.Data.DataTable dataTable) 
{ 
    try 
    { 
     var command = 
      new OracleCommand 
      { 
       CommandText = "INSERT INTO STUDENT (STUDENTID, STUDENTNAME) VALUES(:studentid, :studentname)", 
       CommandType = CommandType.TableDirect, 
       Connection = oc 
      }; 
     var op1 = 
      new OracleParameter 
      { 
       ParameterName = "StudentId", 
       Size = 6, 
       OracleDbType = OracleDbType.Int32, 
      Direction = System.Data.ParameterDirection.Input 
      }; 
     command.Parameters.Add(op1); 
     var op2 = 
     new OracleParameter 
      { 
       ParameterName = "studentName", 
       OracleDbType = OracleDbType.Varchar2, 
       Size = 50, 
       Direction = System.Data.ParameterDirection.Input 
      }; 
     command.Parameters.Add(op2);         
     /* 
     foreach (var row in dataTable.Rows) 
     { 
      op1.Value = int.Parse(row[0].ToString()); 
      op2.Value = row[1].ToString(); 
      command.ExecuteNonQuery(); 
     }*/ 
      foreach (System.Data.DataRow row in dataTable.Rows) 
      { 
       row.SetAdded(); 
      }  

      var dataAdapter = new OracleDataAdapter() {InsertCommand = command}; 
      dataAdapter.Update(dataTable); //This updates the table, but all column values are NULL. 

    } 
    catch(Exception) 
    { 
     throw; 
    } 
} 

有沒有更快,更簡單的方法,我不必循環記錄?

回答

1

在您的第一個代碼塊中,您將設置SelectCommand。還有一個InsertCommand,UpdateCommandDeleteCommand

這些命令還存在於OracleDataAdapter對象。既然DataTable是端點中立的,所有你需要做的就是創建一個OracleCommand做刀片,將其設置爲OracleDataAdapter'sInsertCommand,並調用oracleDataAdapter.Update(dataTable)

當我檢查它們時,會對此進行更多細節修改。


設置InsertCommand的一個很好的例子是here。請注意,將參數添加到命令時,傳遞給.Add(...)的最後一個值是要映射到的列的名稱。

由於您正在將數據檢索到DataTable但未對其進行更改,因此在調用oracleDataAdapter.Update()之前,需要將每行的RowState更改爲「已添加」。你需要做這樣的事情:

foreach (DataRow row in dataTable.Rows) { 
    row.SetAdded(); 
} 

讓我知道如果你需要更多的代碼示例...從您發佈的代碼,我想你已經差不多了我這裏的要點我要去這裏。


編輯

當您創建OracleParameters,你需要將源列設置爲DataTable中列的名稱。默認情況下,這是由選擇statment返回的名稱,所以:

var op1 = new OracleParameter { 
           ParameterName = "StudentId", 
           Size = 6, 
           OracleDbType = OracleDbType.Int32, 
           Direction = System.Data.ParameterDirection.Input 
           SourceColumn = "StudentId" // If that's what it's called in the DataTable 
           }; 
command.Parameters.Add(op1); 

AcceptChanges()方法是在DataTable,因爲是HasErrors屬性(它也存在於DataRows,並DataSets,太)。

AcceptChanges()只告訴DataTable你已經處理了對數據庫的更新......當你調用oracleDataAdapter.Update()時,這些更改被提交到數據庫。你調用AcceptChanges()的原因是重置行狀態......否則當你下次更新DataTable時,你會嘗試添加已經添加的行。

OracleDataAdapter酒店AcceptChangesDuringUpdate會自動調用AcceptChanges()作爲更新到數據庫的一部分......我通常不這樣做,因爲我已經習慣了測試HasErrors屬性和調用AcceptChanges()前處理的。 ..但是我正在閱讀,AcceptChanges()現在在更新中被默認調用。我不熟悉如何處理錯誤的行的細節,如果更改被接受,或者不接受。

+0

@James B - 您在哪裏將dataAdapter的數據源設置爲dataTable? – abhi 2011-04-26 20:57:11

+0

@James:將'dataTable.AcceptChanges()'有效地將所有'行'設置爲已添加? – IAbstract 2011-04-26 21:08:09

+0

您不......就像您調用dataAdapter.Fill(dataTable)一樣,您可以調用oracleDataAdapter.Update(dataTable)。 – 2011-04-26 21:10:56

相關問題