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.NE网站发布注意事项

在 ASP.NET MVC Core(C#) 中执行 Oracle 存储过程 (PL/SQL)

缩放 ASP.NET 应用程序

理解ASP.NET Core

命令行应用程序中的 asp.net 4.0 到 excel 2010 不起作用 - 即使在驱动程序安装后也找不到驱动程序