討論區快速選單
知識庫快速選單
程式設計俱樂部Facebook粉絲團 掌握Salesforce雲端管理秘訣
[ 回上頁 ] [ 討論區發言規則 ]
關於ADO.NET在跨SQL Server的資料傳輸問題
更改我的閱讀文章字型大小
作者 : player(PLAYER) 貼文超過1000則人氣指數超過100000點
[ 貼文 1595 | 人氣 138661 | 評價 2840 | 評價/貼文 1.78 | 送出評價 104 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/3/9 下午 04:05:57
假如我從SQL Server (A) 取得一個 DataSet
那要怎麼做
才比較容易存到 SQL Server (B) 呢?

因為無法擔保 SQL Server (B) 裡的 Table 是否已有一些同樣的資料
所以該把自 SQL Server (A) 取得的 DataSet 先進行拆解成多個 DataRow
再向 SQL Server (B) 的 Table 先下 select 先驗證過資料在不在?
再決定用 insert 還是 update 的方法寫到 SQL Server (B) 嗎?
還是有更好的做法?

---------------
還有
關於從SQL Server (A) 取得的 DataSet
有時候如果SQL篩選條件沒下好的話
會變成所取的DataSet 會變很大
請問如果要做分頁來限制一下每次資料傳輸的時間的話
該怎麼做分頁會比較好?
作者 : player(PLAYER) 貼文超過1000則人氣指數超過100000點
[ 貼文 1595 | 人氣 138661 | 評價 2840 | 評價/貼文 1.78 | 送出評價 104 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/3/12 上午 09:21:45
如果照MS的範例

如何使用 Visual C# 2005 或 Visual C# .NET 從 DataSet 物件更新資料庫
http://support.microsoft.com/kb/307587/zh-tw

可是他在插入新資料前
還要先

SqlDataAdapter daAuthors
= new SqlDataAdapter("Select * From Authors", objConn);

這樣不是變成要先把該table的所有資料先取出
才能做資料新增嗎?
這樣好像對於SQL Server的存取效能滿傷的耶 (如果原本的Table裡就有不少的資料的話)

有能夠使用DataSet更好用的資料寫入方式嗎?
作者 : player(PLAYER) 貼文超過1000則人氣指數超過100000點
[ 貼文 1595 | 人氣 138661 | 評價 2840 | 評價/貼文 1.78 | 送出評價 104 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/3/14 上午 09:27:48
目前用上了這些
SqlConnection
SqlDataAdapter
SqlCommand
SqlCommandBuilder
DataSet

可是新增或要修改的資料寫不回去? (非SQL-Server存取權限問題)
誰熟悉ADO.NET的?
幫我看看好嗎?
目前的寫法會在 objDA.Update 時, 發生錯誤?


參數有
string strConnection; //SQL Server連線參數用字串

string strSQL; //像是 select * from TableA where ID like 'U1%'
string strTableName; //Table名稱 , 像是 TableA
string strPrimaryKey; //索引用欄位名稱, 避免SQL-Server內, 沒定義欄位的唯一值, 像是 ID

DataSet objDS; //從另一台SQL Server以相同條件Select到的DataSet
bool CanModifyCurrent; //如果Table有相同的資料的話, 要修改? 還是新增?





try
{
using (SqlConnection objConn = new SqlConnection(strConnection))
{
using (SqlDataAdapter objDA = new SqlDataAdapter())
{
objDA.SelectCommand = new SqlCommand(strSQL, objConn);

SqlCommandBuilder objSQLCmdBuilder = new SqlCommandBuilder(objDA);

//是否可以對已存在的資料進行修改? 不可以的話, 就改用插入新資料的方式
if (CanModifyCurrent == false)
objDA.InsertCommand = objSQLCmdBuilder.GetInsertCommand();

using (DataSet objDS2 = new DataSet())
{

objDA.Fill(objDS2, strTableName);

try
{
if (strPrimaryKey != "")
{
DataColumn[] keys = new DataColumn[1];
keys[0] = objDS2.Tables[strTableName].Columns[strPrimaryKey];
objDS2.Tables[strTableName].PrimaryKey = keys;
}
}
catch (Exception ex)
{
return "失敗在 PrimaryKey " + ex.Message;
}

try
{
objDS.Tables[0].TableName = strTableName;
objDS2.Merge(objDS);
}
catch (Exception ex)
{
return "失敗在 Merge " + ex.Message;
}


try
{
using (DataSet objDS_Changes = objDS2.GetChanges())
{
objDA.Update(objDS_Changes, strTableName);
}

}
catch (Exception ex)
{
return "失敗在 Update " +ex.Message;
}
}
}
objConn.Close();
}
return strSetDataOK;
}
catch (Exception ex)
{
return ex.Message;
}
作者 : player(PLAYER) 貼文超過1000則人氣指數超過100000點
[ 貼文 1595 | 人氣 138661 | 評價 2840 | 評價/貼文 1.78 | 送出評價 104 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/3/14 上午 09:39:10
剛才貼code過來時
誤刪了一行

 using (SqlConnection objConn = new SqlConnection(strConnection))
{
objConn.Open(); // <-- 剛才少這一行
using (SqlDataAdapter objDA = new SqlDataAdapter())
作者 : player(PLAYER) 貼文超過1000則人氣指數超過100000點
[ 貼文 1595 | 人氣 138661 | 評價 2840 | 評價/貼文 1.78 | 送出評價 104 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/3/14 上午 09:51:04
錯誤訊息傳回

失敗在 Update Value cannot be null.


可是 objDS 明明就比 objDS2 還多幾筆資料啊
(objDS 與 objDS2是從不同的SQL Server抓同名的Table裡的資料)

我先用
 objDS2.Merge(objDS);
把objDS合併到 objDS2 上

再用
DataSet objDS_Changes = objDS2.GetChanges()
去抓那些資料是被改過的
只Update回SQL Server 被改過的資料

理論上
應該這樣沒錯啊?
作者 : player(PLAYER) 貼文超過1000則人氣指數超過100000點
[ 貼文 1595 | 人氣 138661 | 評價 2840 | 評價/貼文 1.78 | 送出評價 104 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/3/14 下午 03:02:30
改了一下
錯誤訊息變這樣了?

Dynamic SQL generation for the UpdateCommand is not supported against a SelectCommand that does not return any key column information.
作者 : regionbbs(小朱)技術副站長 VB.Net曠世奇才SQL Server 7/2K卓越專家.Net Framework優秀好手C#曠世奇才ASP.Net一代宗師ADO.Net卓越專家貼文超過6000則人氣指數超過70000點
[ 貼文 6372 | 人氣 82299 | 評價 36440 | 評價/貼文 5.72 | 送出評價 59 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人player註記此篇回應為很有道理 2007/3/14 下午 03:55:20
你的 SelectCommand 若沒有傳回 PK 的資訊,就不能動態產生 InsertCommand/UpdateCommand/DeleteCommand。
作者 : player(PLAYER) 貼文超過1000則人氣指數超過100000點
[ 貼文 1595 | 人氣 138661 | 評價 2840 | 評價/貼文 1.78 | 送出評價 104 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/3/14 下午 05:27:35
我在SQL Server裡
改Table的設定
多加了PK了 (PrimaryKey)

SqlCommandBuilder 有過了

using (DataSet objDS_Changes = objDS2.GetChanges())
我也拿掉了

多加了 objDA.AcceptChangesDuringFill = false;


同時改成
DataTable合併後
objDS2.Tables[0].Merge(objDS.Tables[0], true);


objDA.Update(objDS2.Tables[0].Select(null, null, DataViewRowState.Added));

這下可好了
什麼錯誤訊息都沒了(沒有任何一個 try catch 有彈出來)
return 代表執行成功的字串
可是結果SQL Server還是寫不進去資料

怎麼辦?
該把DataSet與DataTable這些都扔掉嗎?


作者 : regionbbs(小朱)技術副站長 VB.Net曠世奇才SQL Server 7/2K卓越專家.Net Framework優秀好手C#曠世奇才ASP.Net一代宗師ADO.Net卓越專家貼文超過6000則人氣指數超過70000點
[ 貼文 6372 | 人氣 82299 | 評價 36440 | 評價/貼文 5.72 | 送出評價 59 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人player註記此篇回應為很有道理 2007/3/14 下午 05:43:38
如果是我要做,我可能會直接在 SQL Server 中就做掉了 ...
像是使用 Linked Server,用 T-SQL 下指令直接處理,而不是在 ADO.NET 中處理。

除非是無法使用 Linked Server,或者是二個 DBMS 間要處理。
可能的話,減少資料查詢的筆數會比較好,例如使用 IN 來查詢 Key 值。
用 IN 查詢不存在時,再把資料寫入資料庫。

不過我自己都是自己寫 SQL 指令,不假手 CommandBuilder ...
作者 : player(PLAYER) 貼文超過1000則人氣指數超過100000點
[ 貼文 1595 | 人氣 138661 | 評價 2840 | 評價/貼文 1.78 | 送出評價 104 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/3/14 下午 06:19:42
因為
不特定數量的table

而且2台SQL-Server日後應該會在不同的網域內
(分別在各自的防火牆後面)

而且每一個table的欄位格式
是未知的謎

所以
難以自己針對每一個table去自己寫 update 與 insert 用的sql字串
因為
table內的欄位數量與格式未知
所以SQL預儲程序恐怕也沒辦法用

這樣sql字串的語法
天曉得怎麼寫? 難道還要先查詢 table的格式嗎?
又不能把每一個欄位都當字串用單引號包起來吧?

我知道SQL Server的叢集架構 link server
很好用
但是那不符合我的需求

1.有條件的轉移未知欄位的資料
2.在不更動既有的防火牆的前題下, 透過WebServices去當傳遞資料的通道(安全性設定, 我想直接在IIS鎖定IP, 會比改防火牆方便)

問了好多網友過了
都說不會
只有您有回答一些問題
雖然還沒辦法用(資料寫不進去啊)

如果您願意開MSN的話
playercd8@hotmail.com
或許直接聊會比較方便
作者 : regionbbs(小朱)技術副站長 VB.Net曠世奇才SQL Server 7/2K卓越專家.Net Framework優秀好手C#曠世奇才ASP.Net一代宗師ADO.Net卓越專家貼文超過6000則人氣指數超過70000點
[ 貼文 6372 | 人氣 82299 | 評價 36440 | 評價/貼文 5.72 | 送出評價 59 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/3/14 下午 06:31:57
1. 可以用 SqlDataReader.GetSchemaTable() 來產生表格欄位的描述性資料。
2. 用這份描述性資料產生 DataTable,和寫入的 SQL 指令。

但欄位未知這種問題有點奇怪,因為這樣封鎖欄位描述的話,等於說除了系統管理員以外其他人都不能直接存取 Table,那這樣 SqlDataReader.GetSchemaTable() 就沒用了。

自己撰寫產生插入/更新的 SQL 指令的程式碼也不會很難,只是很麻煩。看你要不要這樣寫而已,像是:

string sqlUpdateStockSafeQtyTemplate = "UPDATE table SET col1 = {0}, col2= {1} WHERE col3= {2} AND col4= {3}";

// start column index: 3
foreach (DataRow row in table1.Rows)
{
    string opShopName = null;

    try
    {
     for (int i = 3; i < table1.Columns.Count; i++)
     {
     string safeStockQtyData = row[i].ToString();
     string[] safeStockQty = safeStockQtyData.Split('/');

     opShopName = table1.Columns[i].ColumnName;

     sqlUpdateStockSafeQtys.Add(string.Format(
     sqlUpdateStockSafeQtyTemplate, safeStockQty[0], safeStockQty[1], shopMap[table1.Columns[i].ColumnName],
     productMap[row["BARCODE"].ToString()]));
     }
    }
    catch (Exception ex)
    {
     Console.WriteLine("SHOP:" + opShopName + " PRODUCT: " + row["BARCODE"].ToString() + " occurred exception: " + ex.Message);
    }

    Console.Write(".");
}
作者 : player(PLAYER) 貼文超過1000則人氣指數超過100000點
[ 貼文 1595 | 人氣 138661 | 評價 2840 | 評價/貼文 1.78 | 送出評價 104 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/3/14 下午 07:03:37
你寫的方法好麻煩耶
有的table看起來超過50個欄位了(還不知道這些table日後還會不會改欄位格式?)
所以你提供的方法不太適用


我改成這樣


if (CanModifyCurrent == true)
{
objDA.InsertCommand = objSQLCmdBuilder.GetInsertCommand();
objDA.UpdateCommand = objSQLCmdBuilder.GetUpdateCommand();

}
else
{
objDA.InsertCommand = objSQLCmdBuilder.GetInsertCommand();
objDA.UpdateCommand = objSQLCmdBuilder.GetInsertCommand();
}


以及
objDA.FillSchema(objDS2, SchemaType.Source);
objDA.Fill(objDS2);



try
{
if (strPrimaryKey != "")
{
if ((objDS2.Tables[0].PrimaryKey == null) ||
(objDS2.Tables[0].PrimaryKey.Length <= 0) ||
(objDS2.Tables[0].PrimaryKey[0].ColumnName != strPrimaryKey))
{
DataColumn[] keys = new DataColumn[1];
keys[0] = objDS2.Tables[0].Columns[strPrimaryKey];
keys[0].Unique = true;
objDS2.Tables[0].PrimaryKey = keys;
}
}
}
catch (Exception ex)
{
return "失敗在 PrimaryKey " + ex.Message;
}

這樣在DataTable合併時
資料筆數確定是正確的
可是還是寫不進SQL Server ?

keys[0].Unique = true; 是為了怕查objDS2時
沒有取得PK的欄位設定
所以再補上去唯一值的開關
這樣合併DataTable時
才會筆數正常
可是還是寫不進SQL Server ?

SqlCommandBuilder所產生的
objDA.InsertCommand.CommandText

objDA.UpdateCommand.CommandText
都先拿出來看過了
看起來沒錯啊?
作者 : regionbbs(小朱)技術副站長 VB.Net曠世奇才SQL Server 7/2K卓越專家.Net Framework優秀好手C#曠世奇才ASP.Net一代宗師ADO.Net卓越專家貼文超過6000則人氣指數超過70000點
[ 貼文 6372 | 人氣 82299 | 評價 36440 | 評價/貼文 5.72 | 送出評價 59 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/3/14 下午 07:07:36
我的習慣是,不讓系統自己產生(因為有一些潛在的問題)。

你可以用 SqlCommandBuilder 產生的 SQL 指令,在 SQL Server 中試一筆資料,看看能不能正常存入。
作者 : regionbbs(小朱)技術副站長 VB.Net曠世奇才SQL Server 7/2K卓越專家.Net Framework優秀好手C#曠世奇才ASP.Net一代宗師ADO.Net卓越專家貼文超過6000則人氣指數超過70000點
[ 貼文 6372 | 人氣 82299 | 評價 36440 | 評價/貼文 5.72 | 送出評價 59 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/3/14 下午 07:09:14
再補充一件事,你可以檢查在 Update() 前,DataTable 的每個 DataRow 的 RowState 的值是什麼,如果是 Modified,會呼叫 UpdateCommand,如果是 Added,會呼叫 InsertCommand。
作者 : player(PLAYER) 貼文超過1000則人氣指數超過100000點
[ 貼文 1595 | 人氣 138661 | 評價 2840 | 評價/貼文 1.78 | 送出評價 104 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/3/14 下午 08:12:30
eye 在痛了
先關機回家吃飯好了
明天早再來 try code
先謝了你們的回答

問題也post到台灣MS的ADO.NET的討論區看看
http://www.microsoft.com/taiwan/community/newsgroups/dgbrowser/zh-tw/default.mspx?dg=microsoft.public.tw.dotnet.framework.ado&lang=zh&cr=TW&r=02c1bc1a-d622-42be-ab6e-4d58e18b533c

如果還沒解決的話
看情況再決定是否寫英文的news到美國ms的news去問
作者 : player(PLAYER) 貼文超過1000則人氣指數超過100000點
[ 貼文 1595 | 人氣 138661 | 評價 2840 | 評價/貼文 1.78 | 送出評價 104 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/3/15 上午 11:37:32
先輸出每一個DataRow的DataRowState來看

//Debug用
{
int nAdded = 0;
int nDeleted = 0;
int nDetached = 0;
int nModified = 0;
int nUnchanged = 0;
int nUnknow = 0;

DataRow[] dr = objDS2.Tables[0].Select("", "", DataViewRowState.CurrentRows);
for (int i = 0; i < dr.Length; i++)
{
switch (dr[i].RowState)
{
case DataRowState.Added:
nAdded++;
break;
case DataRowState.Deleted:
nDeleted++;
break;
case DataRowState.Detached:
nDetached++;
break;
case DataRowState.Modified:
nModified++;
break;
case DataRowState.Unchanged:
nUnchanged++;
break;

default:
nUnknow++;
break;
}
}

return "Added = " + nAdded.ToString()
+"\nDeleted = " + nDeleted.ToString()
+"\nDetached = " + nDetached.ToString()
+"\nModified = " + nModified.ToString()
+"\nUnchanged = " + nUnchanged.ToString()
+"\nUnknow = " + nUnknow.ToString();

}

objDA.Update(objDS2.Tables[0].Select("", "", DataViewRowState.CurrentRows));


結果就
Added = 0
Deleted = 0
Detached = 0
Modified = 32
Unchanged = 2
Unknow = 0

Unchanged ? 見鬼了? 可是我要新增啊?
難怪新資料寫不進去了
看來 objDA.Update 之前
要先重設 DataRowState 了

再繼續 try code...
作者 : player(PLAYER) 貼文超過1000則人氣指數超過100000點
[ 貼文 1595 | 人氣 138661 | 評價 2840 | 評價/貼文 1.78 | 送出評價 104 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/3/15 下午 12:21:40
合併DataTable之前, 先把來源的objDS的 RowState都改過
成功一半
新資料寫得進去
但修改的失敗 (這樣在合併DataTable時, 都變成新資料的狀態?)
各位有更好的意見嗎?
try
{
//重設DataRowState
{
DataRow[] dr = objDS.Tables[0].Select("", "", DataViewRowState.CurrentRows);
for (int i = 0; i < dr.Length; i++)
{
switch (dr[i].RowState)
{
case DataRowState.Added:
break;
case DataRowState.Deleted:
break;
case DataRowState.Detached:
break;
case DataRowState.Modified:
dr[i].SetAdded();
break;
case DataRowState.Unchanged:
dr[i].SetAdded();
break;

default:
break;
}
}

}

objDS2.Tables[0].Merge(objDS.Tables[0], true);

}
catch (Exception ex)
{
return "失敗在 Merge " + ex.Message;
}


失敗在 Update System.Data.SqlClient.SqlException: PRIMARY KEY 違反條件約束 'PK_TableA'。無法在物件 'TableA' 上插入重複索引鍵。
陳述式已經結束。
   at System.Data.Common.DbDataAdapter.UpdatedRowStatusErrors(RowUpdatedEventArgs rowUpdatedEvent, BatchCommandInfo[] batchCommands, Int32 commandCount)
   at System.Data.Common.DbDataAdapter.UpdatedRowStatus(RowUpdatedEventArgs rowUpdatedEvent, BatchCommandInfo[] batchCommands, Int32 commandCount)
   at System.Data.Common.DbDataAdapter.Update(DataRow[] dataRows, DataTableMapping tableMapping)
   at System.Data.Common.DbDataAdapter.Update(DataRow[] dataRows)
   at STC.ClassDTS.SetData(String strTableName, String strFilter, String strPrimaryKey, Boolean CanModifyCurrent, DataSet objDS)
作者 : player(PLAYER) 貼文超過1000則人氣指數超過100000點
[ 貼文 1595 | 人氣 138661 | 評價 2840 | 評價/貼文 1.78 | 送出評價 104 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/3/15 下午 12:33:01
換個方式問好了

如果 DataTable objTableA裡有資料 (A, B, C, D)
而 DataTable objTableB裡有資料 ( C, D, E, F)
2個DataTable裡的每一行 DataRowState 都是 DataRowState.Unchanged

在不確定 C與D的資料是否一樣的前題下
那如果要把objTableA 合併到 objTableB 的話
想得到最後的objTableB
A與B的DataRowState 是 DataRowState.Added
C與D的DataRowState 是 DataRowState.Modified
E與F的DataRowState 是 DataRowState.Unchanged

那objTableA的每一行 DataRowState
該怎麼設
會比較好?
作者 : player(PLAYER) 貼文超過1000則人氣指數超過100000點
[ 貼文 1595 | 人氣 138661 | 評價 2840 | 評價/貼文 1.78 | 送出評價 104 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/3/15 下午 02:00:42
在使用
objDA.FillSchema(objDS2, SchemaType.Source);
之後

發現這段沒有意義了

try
{
if (strPrimaryKey != "")
{
if ((objDS2.Tables[0].PrimaryKey == null) ||
(objDS2.Tables[0].PrimaryKey.Length <= 0) ||
(objDS2.Tables[0].PrimaryKey[0].ColumnName != strPrimaryKey))
{
DataColumn[] keys = new DataColumn[1];
keys[0] = objDS2.Tables[0].Columns[strPrimaryKey];
keys[0].Unique = true;
objDS2.Tables[0].PrimaryKey = keys;
}
}
}
catch (Exception ex)
{
return "失敗在 PrimaryKey " + ex.Message;
}

而且
要是SQL Server裡的Table沒有先設好 PrimaryKey的欄位的話
SqlCommandBuilder 那些也不會過
作者 : player(PLAYER) 貼文超過1000則人氣指數超過100000點
[ 貼文 1595 | 人氣 138661 | 評價 2840 | 評價/貼文 1.78 | 送出評價 104 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/3/16 下午 03:52:05
DataSet寫入的部份
應該差不多了

AP在送出需要更新的DataSet前
先以PrimaryKey欄位為依據把一樣的DataRow
先過慮掉
這樣就只會送出需要異動的資料 (新增或修改)

然後
在WebService端
在取出DataSet時
先跟據用戶端送來的DataSet
以其PrimaryKey欄位值, 做為取出資料的篩選條件

然後合併DataTable
再把合併後
具有DataRowState.Unchanged的DataRow
通通設 DataRow.SetAdded();
這樣最後在以 SqlDataAdapter 將最後的 DataRow [] 給 Update 回去就好了
 板主 : 小朱
 > ADO.NET - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - ADO.NET - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
ADO.NET
1 小朱 1520 
2 識丁 280 
3 吳馨琳 270 
4 小台 180 
5 Snaking 140 
6 mark 140 
7 好說 120 
8 ammon 100 
9 toyboy 70 
10 再見男人 50 
ADO.NET
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
0.078125