2010-09-15 62 views
5

我与WebMatrix的打打闹闹,到目前为止,我已经找到了如何使用存储过程用剃刀/ WebMatrix中最好的办法是像所谓WebMatrix中和存储过程

@if (IsPost) { 

    var LinkName = Request["LinkName"]; 
    var LinkURL = Request["LinkURL"]; 

    string sQ = String.Format("execute dbo.myprocname @LinkName=\"{0}\", 
@LinkURL=\"{1}",LinkName, LinkURL); 

    db.Execute(sQ); 
} 

注意,我没有做任何类型的SQL注入检查或类似的东西,我认为这将是非常必要的。我错过了什么吗?

回答

6

Execute方法接受参数。

@if (IsPost) { 
    var LinkName = Request["LinkName"]; 
    var LinkURL = Request["LinkURL"]; 
    string SQL = "exec dbo.myprocname @0, @1"; 
    db.Execute(SQL, LinkName, LinkURL); 
} 

更新:,这样的存储过程的参数,因为编号而不是命名占位符我已经更新了我的答案。

+0

我认为这个答案有效,但事实并非如此。 – infocyde 2010-09-17 16:59:33

+1

现在,Larsenal已经更新了对占位符使用@ 0,@ 1表示法的答案。这就是数据库帮助程序如何通过索引而不是名称将参数值映射到内部的占位符。 – 2010-09-18 08:21:37

+0

这是问题所在。如果proc有10个参数,但我只需要通过两个参数会怎么样?如果我不给它们命名,它们按照它们被声明的顺序预期,所以我将不得不放置持有者值,如exec dbo.myproc null,null,@ 0,1,“server”,@ 1“我不喜欢,再加上如果params的顺序发生变化,我必须返回并更新webmatrix中的Razor代码,我知道它仍处于测试阶段,并且webmatrix将针对入门级别的用户,但它会很高兴能够命名参数,而不是使用索引 – infocyde 2010-09-20 01:34:39

3

好吧,这是我发现的最简单的,你可以使用命名参数。意思是,如果你的存储过程有多个可选参数,你只能传递你需要或想传递的参数。

@{ 
    var db = Database.Open("your database name"); 
    var param1 = "informationhere"; 
    var param2 = "informationhere"; 
    // or var param2 = 15247 (no quotes necessary if param is an integer datatype) 
    var procRows = db.Query("Exec dbo.procName @[email protected], @[email protected]", param1, param2); 
} 

<table> 
@foreach(var procRow in procRows) 
{ 
    <tr> 
     <td>@procRow.ColumnName1</td> 
     <td>@procRow.ColumnName2</td> 
     <td>@procRow.ColumnName3</td> 
     //etc 
    </tr> 
}  
</table>