在資料庫中,經驗有兩個表關聯的情況,也就是乙個表中的主鍵為另乙個表的外來鍵,在ado.net時,如果向兩個表中同時添中資料,我們通常做三步sql操作,第一步:新增主表資料,第二步:得到主表中的主鍵,第三步:新增子表資料,在通常狀況下,這些都是在事務中。
先看一下資料庫表結構。乙個表為父表(這裡為了說明技術,表沒有具體意義),名字為fathertable如下:
還有乙個子表,名字為sontable如下:
兩個表之間有下圖這樣乙個關係:
先看一下ado.net如何實現:
class
testdemo
catch (exception exc)
finally
} }
ado.net
的事務沒有什麼好說的,現在來看看用linq怎麼實現,首先新增乙個「linq to sql類」,在「伺服器資源管理器」中連線資料庫,然後選中fathertable和sontable表,如下圖
接下來,程式設計來實現新增操作,**如下:
class
testdemo
} 運後的結果是一樣的。用ado.net,我們自己寫的sql語句,清楚我們對資料執行了什麼操作,上面的用linq to sql做的話,就不知道系統執行了什麼操作。我們看見系統呼叫了dataclasses1datacontext類的submitchanges,這個方法在dataclasses1datacontext找不到,它是從datacontext繼承下來的。我們用工具reflector檢視,submitchanges是呼叫有參的submitchanges(conflictmode),這個方法**如下:
public virtual void
submitchanges
(conflictmode
failuremode)
if (this.provider
.connection
.state
== connectionstate
.closed)
transaction = this.provider
.connection
.begintransaction
(isolationlevel
.readcommitted);
this.provider
.transaction
= transaction;
new changeprocessor
(this.services
, this).submitchanges
(failuremode);
this.acceptchanges
();
this.provider
.clearconnection
();
transaction.commit
(); }
catch
catch
}throw; }
return; }
finally
} }
new changeprocessor
(this.services
, this).submitchanges
(failuremode);
this.acceptchanges
(); }
finally
}我們清楚的看到,這裡面啟用了事務,與我們ado.net的做法是一樣的。事務有了,sql語句怎麼樣?繼續查詢submitchanges
方法,**如下:
internal void
submitchanges
(conflictmode
failuremode)
else if (obj2.isdeleted)
else
}else if (obj2.ispossiblymodified) }}
}catch (changeconflictexception)
if ((conflictlist..count " href="" target=_blank>count
> 0) && (failuremode == conflictmode
.failonfirstconflict))
}if (conflictlist..count " href="" target=_blank>count
> 0)
" href="" target=_blank>count);
}this.inserteditems, list deleteditems);" href="" target=_blank>postprocessupdates
(inserteditems, deleteditems);
}如果繼續下付出,會發現查詢許多類,能隱約看出系統在組織sql語句。
與其在這裡找,不如到sql裡等它生成的sql語句看看。
開啟sql的跟蹤工具,執行結果如下圖:
exec sp_executesql n'insert into [dbo].[fathertable]([name])
values (@p0)
select convert(int,scope_identity()) as [value]',n'@p0 varchar(4)',@p0='
王五'
執行了兩個操作,乙個添中,乙個查詢,查詢的是新增後自動生成的id值,另外兩個語句如出一轍,單從sql語句的角度看,多了兩個查詢,這在一定程度上沒有我們自己寫的sql語句簡單,多了子表中的乙個查詢。
SQL server基礎之(表間關聯)
首先先準備一些資料 e r圖 學生 學號,姓名,性別,生日,班級,密碼 課程 編號,課程 分數 學號,編號,分數 很簡單的三個表。接著我們來用幾種常見的連線方法把三張表連線在一起 注意 三張表之間的關係 將三張表整合到一起,顯示全部資訊 1 內連線 select student.sid,studen...
003 通過表間關聯來查詢
rails不要求在遷移任務中建立外來鍵約束,在遷移任務中建立project id欄位後在project和task模型中加上相應的宣告。project.rb has many tasks task.rb belongs to project projects controller.rb def sho...
針對Oracle大表執行表分析
報表 資料庫相當於乙個資料倉儲,資料量一般來說都比較大,這個時候效能就要特別注意。為了促使 oracle 選擇最優的執行計畫,最好定期進行表分析,以使oracle得到正確的統計資訊。一般如果資料分布和表結構發生變化的話,就要重新進行表分析。報表資料庫資料分布發生變化時有發生。所以建議報表庫進行定期的...