想通過:
oracleCommandBuilder.ConflictOption = ConflictOption.OverwriteChanges;
oracleCommandBuilder.DataAdapter = oracleDataAdapter;
實作:
oracleDataAdapter.Update(dataTable)時, 自動生成的更新陳述句的where 條件中,僅包含主鍵。
但ORACLE官方檔案提示OracleDataAdapter 不支持ConflictOption屬性。 所以上面的陳述句雖然編譯通過了,但沒有起作用。
請教大家如何解決?
uj5u.com熱心網友回復:
退回到微軟自己的連ORACLE資料版本, 就可以用了。 但ORACLE自己的怎么不支持呢, 頂一下。uj5u.com熱心網友回復:
你這是掉到一個坑里面的,先放棄這個坑,看看你原本想要的效果是什么?或者是你準備做什么?為什么要這么做?uj5u.com熱心網友回復:
是的 我當時連接 oracle 資料庫 用的就是最基礎的執行緒池、。希望可以 給分
uj5u.com熱心網友回復:
批量更新記錄的狀態: 一次從外部接收了一批記錄,其中有一欄位列是資料庫中的主鍵列,只要讀到鍵值,就去更新主鍵值所在行的狀態列:
1. 匯入外部記錄, 存在于DataTable DT1中
2. 創建一個DataTable DT2, 依次從DT1中讀取記錄,偽代碼如下:
1) datarow = new dt2.row
2) set 主鍵值
3) AcceptChanges
4) set 狀態列的值
5) dt2.addrow( datarow)
6) dt2.update
希望得到的結果是: update table set 狀態列= 1 where 主鍵= 主鍵值。
3. 用微軟的ORACLE版本庫,達到了這一目的。
uj5u.com熱心網友回復:
推薦你只用用oracleCommand cmd =new oracleCommand(text) 的方式。
uj5u.com熱心網友回復:
正解
uj5u.com熱心網友回復:
Oracle 自己的區分32和64新版的不區分uj5u.com熱心網友回復:
public void UpdateStatus(string strColName, int nStatus){
string strSql = "select * from WonderRecords where 1<>1";
OracleConnection oc = new OracleConnection(OracleHelper.ConnectionString);
oc.Open();
odaAdapter.SelectCommand = new OracleCommand(strSql, oc);
Tables["WonderRecords"].PrimaryKey = new DataColumn[] { Tables["WonderRecords"].Columns["recordid"] };
odaAdapter.Fill(this, "WonderRecords");
OracleCommandBuilder ocb = new OracleCommandBuilder();
//就是這一句,很困擾。 ODP不支持,改為微軟的就可以了。只是,還得在客戶機上裝ORACLE客戶端。
ocb.ConflictOption = ConflictOption.OverwriteChanges;
ocb.DataAdapter = odaAdapter;
int i = 0;
foreach (DataRow dr in m_wonderData.Tables["DetailDW"].Select("", "recordid asc"))
{
DataRow drRecords = Tables["WonderRecords"].NewRow();
drRecords["recordid"] = m_wonderData.Tables["DetailDW"].Rows[i]["recordid"];
Tables["WonderRecords"].Rows.Add(drRecords);
//把行的狀態,改為“未更改”
Tables["WonderRecords"].Rows[i].AcceptChanges();
switch (strColName)
{
case "ddcl":
drRecords["ddcl"] = nStatus;
if (nStatus == 1)
{
drRecords["psclbs"] = m_wonderData.Tables["DetailDW"].Rows[i]["psclbs"];
}
break;
case "psdtb":
drRecords["psdtb"] = nStatus;
if (nStatus == 1)
{
drRecords["erpdocid"] = m_wonderData.Tables["DetailDW"].Rows[i]["erpdocid"];
drRecords["erpdtlid"] = m_wonderData.Tables["DetailDW"].Rows[i]["erpdtlid"];
drRecords["psdbh"] = m_wonderData.Tables["DetailDW"].Rows[i]["psdbh"];
drRecords["psmxbh"] = m_wonderData.Tables["DetailDW"].Rows[i]["psmxbh"];
drRecords["psdate"] = DateTime.Now;
}
break;
case "fptb":
Tables["WonderRecords"].Rows[i]["fptb"] = nStatus;
if (nStatus == 1)
{
drRecords["fpbh"] = m_wonderData.Tables["DetailDW"].Rows[i]["fpbh"];
drRecords["fpmxbh"] = m_wonderData.Tables["DetailDW"].Rows[i]["fpmxbh"];
drRecords["erpfpbh"] = m_wonderData.Tables["DetailDW"].Rows[i]["erpfpbh"];
drRecords["erpfpdm"] = m_wonderData.Tables["DetailDW"].Rows[i]["erpfpdm"];
drRecords["fpdate"] = DateTime.Now;
}
break;
}
}
odaAdapter.Update(this, "WonderRecords");
//上面的UPDATE, 生成的SQL就是我要的效果,類似:
//Update WonderRecords set ddcl = :nStatus, psclbs=XXX where recordid = 傳入的主鍵ID;
//Update WonderRecords set psdtb = :nStatus, erpdocid=XXX, psdate=xxx where recordid = 傳入的主鍵ID;
//Update WonderRecords set fptb = :nStatus, fpbh=xxx, fpdate=xxx, erpfpbh=xxxx where recordid = 傳入的主鍵ID;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/128604.html
標籤:C#
上一篇:新手求大神
