linq與存儲過程
這兩者比較比較少
首先使用存儲過程就是一個有爭議的話題,愛使用存儲過程的程序員往往會把過多的業務邏輯封裝在存儲過程里,導致應用程序的可移植性比較差
而且一般會說使用存儲過程的性能比較高,但現在由於各種緩存技術的使用,減少頻繁的查詢資料庫已經是共識。
一般而言使用資料庫的存儲過程居多還是業務邏輯處理居多基本取決於公司的技術方向,我也見到不少公司是忽視軟體的開發,基本處理邏輯都是在資料庫中解決的。
至於linq to sql,說句老實話談不上是什麼特別好的技術,僅憑僅能使用sql server資料庫這一點,就已經限制了它的發展。看看現在多少公司還在用免費的mysql就知道了,更不要說還有那麼多的開源產品是建立在mysql之上。而同類的產品Nhibernate絕不會比它差。
❷ 如何使用LINQ調用存儲過程 碰到一個比較棘手的問題,分頁存儲過程寫完以後。在SQL資料庫上運行沒有問題~
我在這里試了一下,是沒有問題的,建議你先寫個最簡單的存儲過程,直接返回這個表的集合,放在linq里看看結果是否正常,然後再添加分頁的參數
❸ linq 執行存儲過程如何得到返回的結果集
例18-53用一個存儲過程返回產品,使用輸入參數查詢產品的名稱價格。存儲過程代碼如下:
CREATE PROCEDURE dbo.DimProct_By_Class
(@param1 NCHAR(2))
AS
BEGIN
-- SET NOCOUNT ON阻止在結果集中返回顯示存儲過程影響的行計數消息
SET NOCOUNT ON;
SELECT ProctKey, EnglishProctName, ListPrice, Class from DimProct
as c where c.Class=@param1
END
在Server Explorer展開資料庫AdventureWorksDW2008節點,右擊Stored Proceres,選擇Add New Stored Proceres。窗體打開存儲過程文件,將上面的存儲過程代碼復制到編輯框,如圖18-20所示。保存文件,存儲過程添加到資料庫。
用O/R設計器添加實體類和存儲過程的映射。將DimProct表拖到O/R設計器的實體欄,將存儲過程拖到方法欄。有關實體類的代碼格式前面已經介紹,現在查看映射存儲過程的代碼。類包含下面的方法:
[global::System.Data.Linq.Mapping.FunctionAttribute(Name="dbo.DimProct_By_Class")]
public ISingleResult<DimProct_By_ClassResult> DimProct_By_Class(
[global::System.Data.Linq.Mapping.ParameterAttribute(DbType="NChar(2)")] string param1)
{
IExecuteResult result = this.ExecuteMethodCall(this,
((MethodInfo)(MethodInfo.GetCurrentMethod())), param1);
return ((ISingleResult<DimProct_By_ClassResult>)(result.ReturnValue));
}
方法的返回類型ISingleResult<DimProct_By_ClassResult>是O/R設計器根據存儲過程的名字自動添加的,如果想要改動返回的數據類型,可在屬性欄將存儲過程的return屬性修改。根據返回類型可以添加查詢語句。在Main方法中輸入以下代碼:
string connectionString =
"Data Source=.;Initial Catalog=AdventureWorksDW2008;Integrated Security=True";
db =
new (connectionString);
ISingleResult<DimProct_By_ClassResult> result = db.DimProct_By_Class("H");
foreach (DimProct_By_ClassResult r in result)
Console.WriteLine("ID:{0}; Name:{1}, ListPrice:{2}, Class:{3}",
r.ProctKey,r.EnglishProctName,r.ListPrice,r.Class);
輸出:
ID:238, Name:HL Road Frame - Red 62, ListPrice:1263.4598, Class=H
ID:239, Name:HL Road Frame - Red 62, ListPrice:1301.3636, Class=H
--------------------
th79d:此例中建立存儲過程的返回集是語句
ISingleResult<DimProct_By_ClassResult> result = db.DimProct_By_Class("H");
只要知道返回類型就可寫查詢,返回類型由O/R設計器得出。
❹ 在aspx中如何使用linq調用存儲過程
不能直接調用的,你最好在你的datacontex類中增加一個調用的方法:
[Function(Name="dbo.videohot")]
public void Pr_GetSubCategory([Parameter(Name = "videoname",DbType = "varchar(50)")])
{
this.ExecuteMethodCall(this,((MethodInfo)(MethodInfo.GetCurrentMethod())));
}
❺ 利用LINQ怎麼調用存儲過程
你用的是linq to sql還是ling to entity?
參見
http://msdn.microsoft.com/zh-cn/library/bb386946.aspx
❻ linq調用的存儲過程如何將存儲過程返回的表轉換成DataTable類型
別用Datatable吧
linq和泛型配合會好一點 如 List<自定義對象>
❼ LINQ執行存儲過程的結果問題
象你這樣的結構,首先,要生成一個表的實體類,如果你是自動加的LINQTOSQL項目的話,在向導執行完的時候這個實體類應該自動生成了。否則就要自己動手生成。IQueryable<Users> abc = from bcf in the.Users where bcf.HasAd!="" select bcf;
foreach (Users s in abc)
{
Users b = s;
string c = b.HasAd;
}我這里的USER就是我的實體類,具體代碼如下,如果自己動手就按下面的代碼,LINQ語句不用我解釋了吧。[Table(Name="dbo.Users")]
public partial class Users : INotifyPropertyChanging, INotifyPropertyChanged
{
private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
private int _id;
private string _UserName;
private string _UserNameSpell;
private string _ManagerName;
private string _PassWord;
private System.Nullable<int> _UserLevel;
private System.Nullable<int> _UserJob;
private string _UserPopedom;
private string _Mob;
private string _Tel;
private System.Nullable<bool> _Sex;
private System.Nullable<int> _TheCount;
private System.Nullable<System.DateTime> _RegTime;
private string _RegIP;
private string _RegMAC;
private System.Nullable<System.DateTime> _LoginTime;
private string _LoginIP;
private string _LoginMAC;
private System.Nullable<System.DateTime> _LogoutTime;
private string _LogoutIP;
private string _LogoutMAC;
private System.Nullable<int> _TheState;
private string _HasAd;
private System.Nullable<int> _SendTimeType;
private System.Nullable<System.DateTime> _LastSendTime;
private System.Nullable<System.DateTime> _LastFinish;
private System.Nullable<byte> _MsgState;}這里只列出了欄位,而且是私有的,這象肯定不行,你或者把這些欄位改成公有,或者生成屬性
❽ LINQ和存儲過程有什麼區別
你說關公和秦瓊那個厲害?張飛和徐達那個厲害?
------------------------------------------------------------
恭喜你!總算知道我要說什麼了!不是一個時期的東西呀!
LINQ TO SQL 只是 一種理念.一種ORM模型, 在CLR運行時進行轉化,可以轉化為IL, LINQ TO SQL 就可以轉化為SQL報文!然後發送給資料庫! 這種技術比較新! 07年開始盛行!
cs 代碼寫 CRUD也是 借用ADO.NET等技術. LINQ TO SQL 底層也是這個!只是高層封裝了一些理念. ADO.NET本身也不錯!可以直接調用指令, linq to sql 調用原始sql 指令比較麻煩. 有類型轉化和安全的限制,所以linq to sql 技術是有弊病的!
cs 藉助 ado.net寫代碼有歷史沉積!所以資源多!穩定性也高!
存儲過程是資料庫提供的技術,跟CLR一點關系也沒有. 這個歷史更久了! 比net都早!
總結一下吧:
Linq to sql本質實現也是ADO.NET,是一種ORM技術!是一種理念.當然 linq to xml 等是藉助CLR集合操作等技術實現. Linq to sql 運行時轉化 成SQL報文 .然後發送.
代碼中 的CRUD就是 ADO.NET等系列技術實現,代碼發送SQL報文
存儲過程的實現SQL封存在資料庫,所以向資料庫發送的只是調用指令. 速度體現在SQL計劃編譯,
指令網路傳輸.
到底那個優秀要看你的需要了! 比如你的資料庫機器維護成本高!你不可能總讓外圍指令傳入吧!
至少中間有個緩沖層吧! 比如報盤軟體,1秒讀取資料庫 500萬次! 靠存儲過程提速那就喝西北風去吧!
存儲過程如果有bug 那就是資料庫災難,你可知道sqlserver時間類型轉化出錯後,日誌可是不能恢復的.
所以寫程序找好層次也是很重要的事情!
以上都是本人所寫,沒有COPY任何網站的數據. 原稿原創!
❾ linq 中怎樣判斷存儲過程里查到是否有值求大神幫助
首先看你的存儲過程是否有結果集,即是否包含SELECT 語句, 如查不包含的話, 你最好在最後加上一句 RETURN @@RowCount 然後,生成的存儲過程方法,會返回一個int,是影響資料庫行數 如果是SELECT的話,都可以判斷,retValue.Count就行 不過這樣相當於把數據拿出來,再判斷 我建議你還是在存儲過程里寫一下 IF EXISTS (SELECT * FROM Tbl) BEGIN END 或者 INSERT INTO tbl SELECT * FROM tbl2 WHERE Exists(SELECT * FROM tbl2 WHERE XX) AND XX