2012-03-03 146 views
1

我试图创建一个用户提交个人信息并将数据保存在Access数据库中的小应用程序。连接到ASP.Net中的自定义数据库

返回的错误没有任何意义,因为我试图将正确数量的值插入表中。

这些值是第一个,最后一个,年龄和性别。

这是我的代码,然后按我提交按钮时得到的错误。

感谢您的帮助。

<pre> 
<%@ Page Language="C#" %> 
<%@ Import Namespace="System.Data" %> 
<%@ Import Namespace="System.Data.OleDb" %> 

<script runat="server"> 
public void btnSubmit_Click(object sender, EventArgs e) 
{ 
    // Create and configure connection string. 
    OleDbConnection c = new OleDbConnection(); 
    c.ConnectionString = 
     "Provider=Microsoft.ACE.OLEDB.12.0;" + 
     "Data Source=d:/ectserver/gnicolai/Database/application.accdb;"; 

    // Open connection. 
    c.Open(); 

    // Get data from textboxes. 
    string last = txtLastName.Text; 
    string first = txtFirstName.Text; 
    string gender = txtGender.Text; 
    int age = int.Parse(txtAge.Text); 

    // Compose SQL command string. 
    string sql = "INSERT INTO Applicant VALUES" + 
     "('" + last + "', '" + first + 
     "', '" + gender + "'," + age + ");"; 

    // Show SQL insert statement. 
    litMessage.Text = 
     "Data submitted with SQL query string<br />" + sql; 

    // Create command object and execute insert statement. 
    OleDbCommand command = new OleDbCommand(sql, c); 
    command.ExecuteNonQuery(); 

    // Close connection. 
    c.Close(); 
} 
</script> 

<html> 

<head> 
<title>grocery-display3.aspx Example</title> 
<link rel="stylesheet" class="text/css" 
         href="../examples.css" /> 
<style type="text/css"> 
td { padding-left:0.15cm; 
     padding-right:0.15cm; 
     padding-top:0.15cm; 
     padding-bottom:0.15cm; } 
</style> 
</head> 

<body> 

<h2>PersonInfo3 Example</h2> 

<p>Submit age, gender, and age for a person; 
    store this information in a database. 
    Retrieve this data with the ViewPersons page. </p> 

<form id="frmSelect" runat="server"> 

<table> 
<tr> 
    <td class="r">Last Name</td> 
    <td><asp:TextBox ID="txtFirstName" runat="server" 
      CssClass="ctrl" /></td> 
</tr> 
<tr> 
    <td class="r">First Name</td> 
    <td><asp:TextBox ID="txtLastName" runat="server" 
      CssClass="ctrl" /></td> 
</tr> 
<tr> 
    <td class="r">Gender</td> 
    <td><asp:TextBox ID="txtGender" runat="server" 
      CssClass="ctrl" /></td> 
</tr> 
<tr> 
    <td class="r">Age</td> 
    <td><asp:TextBox ID="txtAge" runat="server" 
      CssClass="ctrl" /></td>  
</tr> 
<tr> 
    <td> </td> 
    <td><asp:Button ID="btnSubmit" runat="server" 
      Text="Submit" CssClass="ctrl" Width="128px" 
      OnClick="btnSubmit_Click" /></td> 
</tr> 
</table> 

<p><asp:RangeValidator ID="RangeValidator1" Type="Integer" runat="server" 
     ControlToValidate="txtAge" Display="Static" MinimumValue="0" 
     MaximumValue="130" ErrorMessage="Age must be between 0 and 130" /></p> 

<p><asp:Literal ID="litMessage" runat="server" /></p> 
</form> 

</body> 
</html>   

</pre> 


<strong>Error</strong> 

<pre> 
Server Error in '/' Application. 

Number of query values and destination fields are not the same. 

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.Data.OleDb.OleDbException: Number of query values and destination fields are not the same. 

Source Error: 


Line 32:  // Create command object and execute insert statement. 
Line 33:  OleDbCommand command = new OleDbCommand(sql, c); 
Line 34:  command.ExecuteNonQuery(); 
Line 35:   
Line 36:  // Close connection. 

Source File: d:\DePaul\Winter 2012\IT 330\Projects\Proj5-Nicolaides\Proj5-Nicolaides\Default.aspx Line: 34 

Stack Trace: 


[OleDbException (0x80004005): Number of query values and destination fields are not the same.] 
    System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr) +992124 
    System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult) +255 
    System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult) +188 
    System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult) +58 
    System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method) +161 
    System.Data.OleDb.OleDbCommand.ExecuteNonQuery() +113 
    ASP.default_aspx.btnSubmit_Click(Object sender, EventArgs e) in d:\DePaul\Winter 2012\IT 330\Projects\Proj5-Nicolaides\Proj5-Nicolaides\Default.aspx:34 
    System.Web.UI.WebControls.Button.OnClick(EventArgs e) +111 
    System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +110 
    System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10 
    System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13 
    System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +36 
    System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1565 


</pre> 

回答

0

我在数据库表上的ID字段与我的insert语句混淆。在设计视图中查看表格之后,我删除了“ID”字段,并且我的插入语句按原样工作。

1

您可能需要指定你想在你的表填充明确列。你想要插入的列的名称是什么?

试着改变你的代码如下:

string sql = "INSERT INTO Applicant" + 
    "(LastName, FirstName, Gender, Age)" + 
    "VALUES" + 
    "('" + last + "', '" + first + 
    "', '" + gender + "'," + age + ");"; 

更换名字,与你等列名。

+0

谢谢,但这不起作用 – Geo 2012-03-03 06:28:22

+0

您的访问表中可能有一些需要插入值的列。他们中的任何一个是否设置为非空?还是有一个主键需要一个值?您在上面提到了“ID”字段,但主键不会插入默认值,除非您已将其设置为“自动编号”列。 – Bauhaus 2012-03-03 06:37:40

+0

ID正在搞乱我的INSERT。感谢您的帮助 – Geo 2012-03-05 00:51:32

2

最可能的问题是您的表定义有4列以上。您需要为额外的列提供默认插入值(如果您的数据库支持它)或更改插入代码以匹配。

还值得指出的是,此代码受到sql注入攻击。你永远不应该建立一个像这样的sql语句直接提供给数据库。而是把它变成一个SQL参数,然后发送。

+0

我知道这会受到攻击,但不会以这种方式发布。把这看成是一个粗略的草案。我从来没有做过这样的事情,所以我只是对基础进行建模。我的桌子上有一个“ID”列。这很重要吗?我认为主键会自动生成。 – Geo 2012-03-03 06:18:40

+0

只要把它作为一个起点就够了。确保您的Id字段设置为自动编号。您可能还需要修改插入语句以包含其他人提到的字段名称。 – toddles2000 2012-03-03 20:30:41

+0

我修好了。谢谢您的帮助 – Geo 2012-03-05 00:51:47