ASP.NET C# SQL 提交错误
Posted
技术标签:
【中文标题】ASP.NET C# SQL 提交错误【英文标题】:ASP.NET C# SQL Submit Error 【发布时间】:2013-09-06 15:46:39 【问题描述】:我在发布表单时收到以下错误。
参数化查询需要一个未提供的参数值。 参数名称:0 说明:期间发生未处理的异常 当前网络请求的执行。请检查堆栈 跟踪以获取有关错误及其起源的更多信息 代码。
异常详细信息:System.ArgumentNullException:参数化查询 需要一个未提供的参数值。参数名称:0
来源错误:
第 70 行:var dbSave = Database.Open("QualityMonitoring");线 71: var insertCommand = "插入分数(代理,Q1,Q2, Q3,Q4,Q5,Q6,Q7,Q8,Q9,Q10,Q11,Q12,Q13,Q14,Q15,Q16,Q17, Q18、Q19、Q20、注释)值(@0、@1、@2、@3、@4、@5、@6、@7、@8、@9、 @10、@11、@12、@13、@14、@15、@16、@17、@18、@19、@20、@21)";第 72 行: dbSave.Execute(插入命令,代理,Q1,Q2,Q3,Q4,Q5,Q6,Q7,Q8, Q9、Q10、Q11、Q12、Q13、Q14、Q15、Q16、Q17、Q18、Q19、Q20,注释); 第 73 行:Response.Redirect("~/BureauForm");第 74 行:
源文件:c:\Users\David\Documents\My Web Sites\EmptySite\BureauForm.cshtml 行:72
堆栈跟踪:
[ArgumentNullException:参数化查询需要一个参数值 那是不供给的。参数名称:0] System.Data.SqlServerCe.SqlCeCommand.FillParameterDataBindings(布尔值 验证值)+1415 System.Data.SqlServerCe.SqlCeCommand.ExecuteCommand(CommandBehavior 行为、字符串方法、ResultSetOptions 选项)+569 System.Data.SqlServerCe.SqlCeCommand.ExecuteNonQuery() +21 WebMatrix.Data.Database.Execute(String commandText, Object[] args) +116 ASP._Page_BureauForm_cshtml.Execute() 在 c:\Users\David\Documents\My Web Sites\EmptySite\BureauForm.cshtml:72 System.Web.WebPages.WebPageBase.ExecutePageHierarchy() +197 System.Web.WebPages.WebPage.ExecutePageHierarchy(IEnumerable`1 执行者)+69 System.Web.WebPages.WebPage.ExecutePageHierarchy() +151 System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage) +76 System.Web.WebPages.WebPageHttpHandler.ProcessRequestInternal(HttpContext
上下文)+249
请在下面查看我的代码和标记。
@
// SELECT AGENT
var db = Database.Open("QualityMonitoring") ;
var listAgent = "SELECT Agent FROM Data";
List<SelectListItem> agentdropdownlistdata = new List<SelectListItem>();
bool isSelected = false;
agentdropdownlistdata.Add(new SelectListItem Text = "Please Choose...",Value = "0", Selected = true );
foreach(var item in db.Query(listAgent))
agentdropdownlistdata.Add(new SelectListItem
Text = item.Agent,
// Value = item.ID.ToString(),
Selected = isSelected
);
// SAVE FORM
var Agent = "";
var Q1 = "";
var Q2 = "";
var Q3 = "";
var Q4 = "";
var Q5 = "";
var Q6 = "";
var Q7 = "";
var Q8 = "";
var Q9 = "";
var Q10 = "";
var Q11 = "";
var Q12 = "";
var Q13 = "";
var Q14 = "";
var Q15 = "";
var Q16 = "";
var Q17 = "";
var Q18 = "";
var Q19 = "";
var Q20 = "";
var Notes = "";
if(IsPost)
Agent = Request.Form["Agent"];
Q1 = Request.Form["Q1"];
Q2 = Request.Form["Q2"];
Q3 = Request.Form["Q3"];
Q4 = Request.Form["Q4"];
Q5 = Request.Form["Q5"];
Q6 = Request.Form["Q6"];
Q7 = Request.Form["Q7"];
Q8 = Request.Form["Q8"];
Q9 = Request.Form["Q9"];
Q10 = Request.Form["Q10"];
Q11 = Request.Form["Q11"];
Q12 = Request.Form["Q12"];
Q13 = Request.Form["Q13"];
Q14 = Request.Form["Q14"];
Q15 = Request.Form["Q15"];
Q16 = Request.Form["Q16"];
Q17 = Request.Form["Q17"];
Q18 = Request.Form["Q18"];
Q19 = Request.Form["Q19"];
Q20 = Request.Form["Q20"];
Notes = Request.Form["Notes"];
var dbSave = Database.Open("QualityMonitoring");
var insertCommand = "INSERT INTO Scores (Agent, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, Q10, Q11, Q12, Q13, Q14, Q15, Q16, Q17, Q18, Q19, Q20, Notes) VALUES(@0, @1, @2, @3, @4, @5, @6, @7, @8, @9, @10, @11, @12, @13, @14, @15, @16, @17, @18, @19, @20, @21)";
dbSave.Execute(insertCommand, Agent, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q9, Q10, Q11, Q12, Q13, Q14, Q15, Q16, Q17, Q18, Q19, Q20, Notes);
Response.Redirect("~/BureauForm");
<html>
<body>
<h2>Bureau Quality Monitoring</h2>
<form method="get">
<div>
<fieldset>
Select Agent: @Html.DropDownList("Agent", agentdropdownlistdata)
</fieldset>
</div>
</form>
<br/>
<form method="post">
<div>
<fieldset>
<legend>Subject</legend>
<label for="Q1">Question 1</label>
Yes<input type="radio" name="Q1" value="Yes">
No<input type="radio" name="Q1" value="No">
N/A<input type="radio" name="Q1" value="N/A">
</fieldset>
</div>
<br/>
<div>
<fieldset>
<legend>Subject</legend>
<label for="Q2">Question 2</label>
Yes<input type="radio" name="Q2" value="Yes">
No<input type="radio" name="Q2" value="No">
N/A<input type="radio" name="Q2" value="N/A">
<br/>
<label for="Q3">Question 3</label>
Yes<input type="radio" name="Q3" value="Yes">
No<input type="radio" name="Q3" value="No">
N/A<input type="radio" name="Q3" value="N/A">
<br/>
<label for="Q4">Question 4</label>
Yes<input type="radio" name="Q4" value="Yes">
No<input type="radio" name="Q4" value="No">
N/A<input type="radio" name="Q4" value="N/A">
</fieldset>
</div>
<br/>
<div>
<fieldset>
<legend>Subject</legend>
<label for="Q5">Question 5</label>
Yes<input type="radio" name="Q5" value="Yes">
No<input type="radio" name="Q5" value="No">
N/A<input type="radio" name="Q5" value="N/A">
<br/>
<label for="Q6">Question 6</label>
Yes<input type="radio" name="Q6" value="Yes">
No<input type="radio" name="Q6" value="No">
N/A<input type="radio" name="Q6" value="N/A">
<br/>
<label for="Q7">Question 7</label>
Yes<input type="radio" name="Q7" value="Yes">
No<input type="radio" name="Q7" value="No">
N/A<input type="radio" name="Q7" value="N/A">
</fieldset>
</div>
<br/>
<div>
<fieldset>
<legend>Subject</legend>
<label for="Q8">Question 8</label>
Yes<input type="radio" name="Q8" value="Yes">
No<input type="radio" name="Q8" value="No">
N/A<input type="radio" name="Q8" value="N/A">
</fieldset>
</div>
<br/>
<div>
<fieldset>
<legend>Subject</legend>
<label for="Q9">Question 9</label>
Yes<input type="radio" name="Q9" value="Yes">
No<input type="radio" name="Q9" value="No">
N/A<input type="radio" name="Q9" value="N/A">
<br/>
<label for="Q10">Question 10</label>
Yes<input type="radio" name="Q10" value="Yes">
No<input type="radio" name="Q10" value="No">
N/A<input type="radio" name="Q10" value="N/A">
</fieldset>
</div>
<br/>
<div>
<fieldset>
<legend>Subject</legend>
<label for="Q11">Question 11</label>
Yes<input type="radio" name="Q11" value="Yes">
No<input type="radio" name="Q11" value="No">
N/A<input type="radio" name="Q11" value="N/A">
<br/>
<label for="Q12">Question 12</label>
Yes<input type="radio" name="Q12" value="Yes">
No<input type="radio" name="Q12" value="No">
N/A<input type="radio" name="Q12" value="N/A">
</fieldset>
</div>
<br/>
<div>
<fieldset>
<legend>Subject/legend>
<label for="Q13"> Question 13</label>
Yes<input type="radio" name="Q13" value="Yes">
No<input type="radio" name="Q13" value="No">
N/A<input type="radio" name="Q13" value="N/A">
</fieldset>
</div>
<br/>
<div>
<fieldset>
<legend>Subject</legend>
<label for="Q14">Question 14</label>
Yes<input type="radio" name="Q14" value="Yes">
No<input type="radio" name="Q14" value="No">
N/A<input type="radio" name="Q14" value="N/A">
<br/>
<label for="Q15">Question 15</label>
Yes<input type="radio" name="Q15" value="Yes">
No<input type="radio" name="Q15" value="No">
N/A<input type="radio" name="Q15" value="N/A">
<br/>
<label for="Q16">Question 16</label>
Yes<input type="radio" name="Q16" value="Yes">
No<input type="radio" name="Q16" value="No">
N/A<input type="radio" name="Q16" value="N/A">
<br/>
<label for="Q17">Question 17</label>
Yes<input type="radio" name="Q17" value="Yes">
No<input type="radio" name="Q17" value="No">
N/A<input type="radio" name="Q17" value="N/A">
<br/>
<label for="Q18">Question 18</label>
Yes<input type="radio" name="Q18" value="Yes">
No<input type="radio" name="Q18" value="No">
N/A<input type="radio" name="Q18" value="N/A">
<br/>
<label for="Q19">Question 19</label>
Yes<input type="radio" name="Q19" value="Yes">
No<input type="radio" name="Q19" value="No">
N/A<input type="radio" name="Q19" value="N/A">
<br/>
<label for="Q20">Question 20</label>
Yes<input type="radio" name="Q20" value="Yes">
No<input type="radio" name="Q20" value="No">
N/A<input type="radio" name="Q20" value="N/A">
</fieldset>
</div>
<br/>
<div>
<fieldset>
<legend>Notes</legend>
<textarea name="Notes" rows="10" cols="50"></textarea>
<br/>
<input type="submit" name="saveMonitoring" value="Save Monitoring" />
</fieldset>
</div>
<br/>
</form>
</body>
</html>
我感觉单选按钮中的值没有分配给变量,因此没有什么要提交的,但是如果其他人可以提供帮助,将不胜感激。
【问题讨论】:
如果你的任何值是null
??那你需要通过DBNull.Value
从堆栈跟踪“参数名称:0”未提供。所以最好给出断点并检查 var Agent 是否有一些值。
@dreamviewer 请检查Agent = Request.Form["Agent"];
值。
【参考方案1】:
发现问题。下拉列表被分配给变量,但我在同一页面上有 2 个表单。一切都需要包含在相同的形式中。现在我已经把它变成了一种形式,一切都很好。
【讨论】:
【参考方案2】:问题在于,当您传递一个参数值是对SqlParameterCollection.Add
方法的空引用时,它不会假定您的意思是DBNull.Value
,它只是不添加参数。由于您的每个单选按钮或下拉列表都没有默认值,我认为当没有选择任何内容时,您将获得空值,因此如果没有为 Agent
下拉列表选择任何内容,Request.Form["Agent"]
将是 null
.因此在这一行:
Agent = Request.Form["Agent"];
您正在将变量 Agent
设置为 null。这样的事情可以解决这个问题:
object Agent = DBNull.Value;
if (Request.Form["Agent"] != null)
Agent = Request.Form["Agent"];
但是,对于一个非常频繁的问题,这可能会变得非常麻烦和冗长,因此我通常会为 SqlParameterCollection.AddWithValue 方法提供扩展。以下是来自code project的此类扩展示例
public static SqlParameter AddWithValue(this SqlParameterCollection target, string parameterName, object value, object nullValue)
if (value == null)
return target.AddWithValue(parameterName, nullValue ?? DBNull.Value);
return target.AddWithValue(parameterName, value);
编辑
我现在看到了问题。您的代理下拉列表包含在GET
表单中,您的其他单选框包含在帖子表单中:
<form method="get">
<div>
<fieldset>
Select Agent: @Html.DropDownList("Agent", agentdropdownlistdata)
</fieldset>
</div>
</form>
<br/>
<form method="post">
... All other controls
</from>
所以在这一行:
if(IsPost)
Agent = Request.Form["Agent"];
Request.Form["Agent"]
为 null,因为它不包含在 POST
表单中。将下拉列表移动到与其余控件相同的表单中。
【讨论】:
感谢您迄今为止的所有帮助。问题是,即使所有字段都有值,我也会收到此错误,这就是为什么我认为没有填充变量的原因。我是否正确设置了代码,以便将值从单选按钮传递给变量? 尝试调试,看看运行时Request.Form["Q2"]
的值是多少,可能是你没有正确访问单选按钮的值?
有问题的参数是“0”,对应的是Agent,不是Q2。你真的应该检查Agent = Request.Form["Agent"];
是否给你一个值。
这是真的,我使用Q2
作为导致问题的示例,因为当我回到问题获取示例时,它是我面前的第一个变量。我已经更新了答案以避免混淆。
好的,我已经删除了对 Agent 元素的所有引用,并且表单正确提交,所以你说得对,这就是问题所在。 Agent 的值是一个数据库下拉列表,看起来所选值没有分配给变量。现在的问题是如何将 Agent 下拉列表分配给变量 Agent?以上是关于ASP.NET C# SQL 提交错误的主要内容,如果未能解决你的问题,请参考以下文章
win7+iis7.5+asp.net下 CS0016: 未能写入输出文件“c:WindowsMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NE
在 ASP.NET MVC Core(C#) 中执行 Oracle 存储过程 (PL/SQL)
命令行应用程序中的 asp.net 4.0 到 excel 2010 不起作用 - 即使在驱动程序安装后也找不到驱动程序