2012-03-03 12 views
1

ユーザーが個人情報を送信し、データがAccessデータベースに保存される小さなアプリケーションを作成しようとしています。ASP.Netでカスタムデータベースに接続

戻ってきたエラーは、正しい量の値を表に挿入しようとしているため意味を持ちません。

値は、first、last、age、およびgenderです。

これは自分のコードで、送信ボタンを押したときに表示されるエラーです。

ご協力いただきありがとうございます。

<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フィールドは、私の挿入ステートメントで乱雑でした。デザインビューでテーブルを表示した後、 "ID"フィールドを削除して、挿入ステートメントが正常に動作します。

1

テーブルに明示的に入力する列を指定する必要がある場合があります。挿入しようとしている列の名前は何ですか?

はこれにあなたのコードを変更してみてください:

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

、あなたとなど列名を姓を交換してください。

+0

ありがとうございます。これは動作しません。 – Geo

+0

アクセステーブルに値を挿入する必要のある列がいくつかある可能性があります。いずれかがヌルではないと設定されていますか?または、値を必要とする主キーがありますか?あなたは上記の "ID"フィールドに言及していますが、プライマリキーは 'autonumber'カラムに設定しない限りデフォルト値を挿入しません。 – Bauhaus

+0

IDが私のINSERTを乱していました。助けをありがとう – Geo

2

テーブル定義に4つ以上の列がある可能性が最も高い問題です。余分な列にデフォルトの挿入値(データベースがサポートしている場合)を与えるか、または挿入コードを変更して一致させる必要があります。

また、このコードがSQLインジェクション攻撃の対象であることを指摘する価値もあります。このようなSQL文を作成してデータベースに直接フィードしないでください。代わりにSQLパラメータに変換して送信します。

+0

私はそれが攻撃の対象であることを知っていますが、この方法では公開されません。これを原案として考えてください。私は前にこのようなことはしていませんでしたので、私は基本をモデリングしています。テーブルに「ID」列があります。これは問題ですか?私は主キーが自動的に生成されると思った。 – Geo

+0

ちょうど開始点として機能するようになっていれば十分です。あなたのIDフィールドが自動番号に設定されていることを確認してください。また、フィールド名を上記のように含めるには、insert文を変更する必要があります。 – toddles2000

+0

私はそれを修正しました。助けてくれてありがとう – Geo

関連する問題