原創(chuàng)|行業(yè)資訊|編輯:龔雪|2013-12-19 09:49:39.000|閱讀 370 次
概述:在ASP.NET MVC Framework 3.0框架下,操作SQL Server 2008的表值參數(shù)。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
說明:
本文將幫助你理解SQL Server 2008表值參數(shù),這里已經(jīng)用了ASP.NET MVC Framework 3.0,但你可以用ASP.NET MVC的其它框架。
背景:
在面向?qū)ο蟪绦蛟O(shè)計(jì)的開發(fā)環(huán)境中,很多情況下,我們需要存儲(chǔ)一整列對(duì)象到數(shù)據(jù)庫(kù)中,在這些情況中,程序員采用以下兩個(gè)選項(xiàng)之一:
Microsoft SQL Server 2008能通過引入表值參數(shù)使得用戶可以創(chuàng)建能輕易在存儲(chǔ)程序中使用的自定義類型table的參數(shù),來解決上述兩個(gè)問題。
使用代碼:
表值參數(shù)可以用如下語(yǔ)法來創(chuàng)建:
create type TVPType as table( Name nvarchar(500), Salary decimal(18,2), Age int, EndHeader bit );
在上述代碼片段中,我們要注意創(chuàng)建自定義參數(shù)的類型和名稱。在本例中,是表參數(shù)結(jié)構(gòu)跟隨表。一旦你執(zhí)行代碼,就可以在其中找到你的自定義參數(shù)。
現(xiàn)在我們需要?jiǎng)?chuàng)建程序來插入從應(yīng)用中接收到的數(shù)據(jù)。我們將使用如下存儲(chǔ)程序:
create proc AddDetails @tvp TVPType readonly as begin insert into TVPTable(Name, Age, Salary) select t.Name,t.Age,t.Salary from @tvp t; end
由此現(xiàn)在我們已經(jīng)完成了數(shù)據(jù)庫(kù)方面,將轉(zhuǎn)向應(yīng)用方面。打開一個(gè)新的MVC項(xiàng)目或一個(gè)你想要使用的項(xiàng)目。我已經(jīng)使用了類型化數(shù)據(jù)集替代實(shí)體框架,因?yàn)閷?shí)體框架不支持能夠用于表值參數(shù)的結(jié)構(gòu)化類型參數(shù)。
如下即為應(yīng)用的截圖(在用表值參數(shù)插入記錄到數(shù)據(jù)庫(kù)的前后)。
插入記錄前的頁(yè)面顯示:
現(xiàn)在當(dāng)我們插入記錄時(shí),我已允許用戶通過使用如下JavaScript代碼插入任意量的記錄:
function addRow() { var table = document.getElementById('recordTable').lastChild; if (table) { var id = Number(table.children[table.children.length-1].id); if (!isNaN(id)) { id+=1; var child = document.createElement('tr'); child.id = id; var html = '<input type="text" id="name_' + id + '" maxlength="50"/>'; html += '<input type="text" id="age_' + id + '"/>'; html += '<input type="text" id="salary_' + id + '"/>'; child.innerHTML = html; table.appendChild(child); } } }
用戶可以用“Add more”按鈕添加新行,最后用“Submit”按鈕提交。
我們可以通過生成一個(gè)請(qǐng)求,用JSON對(duì)象傳送所有數(shù)據(jù)到控制器。如下即是完成上述任務(wù)的JavaScript代碼:
function submitRecords() { var table = document.getElementById('recordTable').lastChild; if (table) { var childArr = table.children; if (childArr.length > 0) { var jsonArr={tvp:[]}; var nameObj, ageObj, salaryObj, id; var counter = 0; for (var i = 1; i < childArr.length; i++) { id = childArr[i].id; nameObj = document.getElementById('name_' + id); ageObj = document.getElementById('age_' + id); salaryObj = document.getElementById('salary_' + id); if (nameObj != null && nameObj.value.trim() != '' && ageObj != null && ageObj.value.trim() != '' && salaryObj != null && salaryObj.value.trim() != '') { jsonArr.tvp.push({ "name":nameObj.value.trim(), "age":ageObj.value.trim(), "salary":salaryObj.value.trim() }); } } if (jsonArr.tvp.length > 0) { $.ajax({ url: "../TVP/SubmitRecord", data:{"data":JSON.stringify(jsonArr)}, type: "POST" }); } else alert("Add data please"); } } }
在控制器一方,我們已經(jīng)創(chuàng)建了一個(gè)函數(shù)SubmitRecord來接收我們的AJAX請(qǐng)求并將數(shù)據(jù)從AJAX請(qǐng)求中傳遞到相應(yīng)的模型中。
[HttpPost] public ActionResult SubmitRecord(string data) { TVPModel.StoreValues(data); return View(); }
在上述代碼中,HttpPost屬性指定了調(diào)用函數(shù)(接收當(dāng)PSOT請(qǐng)求時(shí))。我們已經(jīng)用NewtonSoftJson庫(kù)來在模型類別上(解析JSON數(shù)據(jù)并將其存儲(chǔ)到DataTable)解析JSON對(duì)象。
public static void StoreValues(string data) { JToken token = JObject.Parse(data); var tvp=token.SelectToken("tvp"); DataTable recordTable = Params.GetDetailsTable(); foreach (var value in tvp) { DataRow row = recordTable.NewRow(); row["Name"] = value.SelectToken("name"); row["Age"] = value.SelectToken("age"); row["Salary"] = value.SelectToken("salary"); ; row["EndHeader"] = true; recordTable.Rows.Add(row); } TVPBL bl = new TVPBL(); bl.InsertTVP(recordTable); }
創(chuàng)建的DataTable被作為參數(shù)傳送到數(shù)據(jù)庫(kù)程序。該DataTable應(yīng)該和數(shù)據(jù)庫(kù)端的所述類型有著同樣的結(jié)構(gòu)。我們已經(jīng)創(chuàng)建了一個(gè)BL類,負(fù)責(zé)為我們的類型化數(shù)據(jù)集創(chuàng)建一個(gè)表適配器并調(diào)用指定的程序。
public void InsertTVP(DataTable tvpTable) { TVPTableTableAdapter adapter = GetTvpTableAdapter(); adapter.AddDetails(tvpTable); }
在完成上述程序后,我們的數(shù)據(jù)被存儲(chǔ)在數(shù)據(jù)庫(kù)中。現(xiàn)在當(dāng)瀏覽主頁(yè)顯示“No details to show”消息時(shí),它將不再可見。而主頁(yè)將顯示如下:
需要注意的點(diǎn):
點(diǎn)擊下載
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@ke049m.cn
文章轉(zhuǎn)載自:慧都控件網(wǎng)