一个简单的查询修改页,其功能如下: 一个下拉列表选择从data.mdb数据库wenzhang表里的id字段列出各条id号,2个文本框填修改wenzhang表的title和writer字段,一个Command按钮控件update保存,很简单。 控件:dorpdownlist 属性:id: ddlid   autopsotback: true
 控件:textbox      属性: id: txttitle  
 控件:textbox      属性:id: txtwriter
 控件:button       属性:id: btnsave过程是创建了3个数据库命令对象,一个用来读全部数据cmdgetall,一个用来查询从下拉列表选择的项对应数据库里的id字段的值cmdgetbyid,一个用来update.修改后的数据的cmdupdate.
选择下来列表项后在两个文本框显示title和writer字段,并且可以修改后点btnsave来提交。代码如下: using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;namespace aspnet
{
/// <summary>
/// WebForm2 的摘要说明。
/// </summary>
public class WebForm2 : System.Web.UI.Page
{
protected System.Data.OleDb.OleDbConnection oleDbConnection1;
protected System.Data.OleDb.OleDbCommand cmdgetall;
protected System.Data.OleDb.OleDbCommand cmdgetbyid;
protected System.Data.OleDb.OleDbCommand comupdate;
protected System.Web.UI.WebControls.DropDownList ddlid;
protected System.Web.UI.WebControls.TextBox txttitle;
protected System.Web.UI.WebControls.TextBox txtwriter;
protected System.Web.UI.WebControls.Button btnsave;

private void Page_Load(object sender, System.EventArgs e)
{
if(!IsPostBack)
{
System.Data.OleDb.OleDbDataReader dr;
this.oleDbConnection1.Open();
dr=this.cmdgetall.ExecuteReader();
bool firstrow=true;
while (dr.Read())
{
ddlid.Items.Add(new ListItem(dr[0].ToString()));
if (firstrow)
{
txttitle.Text=(string)dr["title"];
txtwriter.Text=(string)dr["writer"];
firstrow=false;
}
}
dr.Close();
this.oleDbConnection1.Close();
}
} private void ddlid_SelectedIndexChanged(object sender, System.EventArgs e)
{
string id=ddlid.SelectedItem.Text;
this.cmdgetbyid.Parameters["@id"].Value=id;
this.oleDbConnection1.Open();
System.Data.OleDb.OleDbDataReader dr;
dr=this.cmdgetbyid.ExecuteReader(CommandBehavior.SingleRow);
if (dr.Read())
{
txttitle.Text=(string)dr["title"];
txtwriter.Text=(string)dr["writer"];
}
dr.Close();
this.oleDbConnection1.Close();
} private void btnsave_Click(object sender, System.EventArgs e)
{
this.comupdate.Parameters["@id"].Value=ddlid.SelectedItem.Text;
this.comupdate.Parameters["@title"].Value=txttitle.Text;
this.comupdate.Parameters["@writer"].Value=txtwriter.Text;
this.oleDbConnection1.Open();
this.comupdate.ExecuteNonQuery();
this.oleDbConnection1.Close();
} #region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}

/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{    
this.oleDbConnection1 = new System.Data.OleDb.OleDbConnection();
this.cmdgetall = new System.Data.OleDb.OleDbCommand();
this.cmdgetbyid = new System.Data.OleDb.OleDbCommand();
this.comupdate = new System.Data.OleDb.OleDbCommand();
// 
// oleDbConnection1
// 
this.oleDbConnection1.ConnectionString = @"Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Registry Path=;Jet OLEDB:Database Locking Mode=1;Data Source=""D:\aspnet\data\data.mdb"";Mode=Share Deny None;Jet OLEDB:Engine Type=5;Provider=""Microsoft.Jet.OLEDB.4.0"";Jet OLEDB:System database=;Jet OLEDB:SFP=False;persist security info=False;Extended Properties=;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Create System Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;User ID=Admin;Jet OLEDB:Global Bulk Transactions=1";
// 
// cmdgetall
// 
this.cmdgetall.CommandText = "SELECT * FROM wenzhang";
this.cmdgetall.Connection = this.oleDbConnection1;
// 
// cmdgetbyid
// 
this.cmdgetbyid.CommandText = "SELECT title, writer FROM wenzhang WHERE (id = @ id)";
this.cmdgetbyid.Connection = this.oleDbConnection1;
// 
// comupdate
// 
this.comupdate.CommandText = "UPDATE wenzhang SET title = @ title, wrter = @ writer WHERE (id = @ id)";
this.comupdate.Connection = this.oleDbConnection1;
this.ddlid.SelectedIndexChanged += new System.EventHandler(this.ddlid_SelectedIndexChanged);
this.btnsave.Click += new System.EventHandler(this.btnsave_Click);
this.Load += new System.EventHandler(this.Page_Load); }
#endregion
}
}错误如下:“/aspnet”应用程序中的服务器错误。
--------------------------------------------------------------------------------此 OleDbParameterCollection 中未包含带有 ParameterName“@id”的 OleDbParameter。 
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.IndexOutOfRangeException: 此 OleDbParameterCollection 中未包含带有 ParameterName“@id”的 OleDbParameter。源错误: 
行 52:  {
行 53:  string id=ddlid.SelectedItem.Text;
行 54:  this.cmdgetbyid.Parameters["@id"].Value=id;
行 55:  this.oleDbConnection1.Open();
行 56:  System.Data.OleDb.OleDbDataReader dr;
 源文件: d:\aspnet\webform2.aspx.cs    行: 54 堆栈跟踪: 
[IndexOutOfRangeException: 此 OleDbParameterCollection 中未包含带有 ParameterName“@id”的 OleDbParameter。]
   System.Data.OleDb.OleDbParameterCollection.RangeCheck(String parameterName) +48
   System.Data.OleDb.OleDbParameterCollection.get_Item(String parameterName) +10
   aspnet.WebForm2.ddlid_SelectedIndexChanged(Object sender, EventArgs e) in d:\aspnet\webform2.aspx.cs:54
   System.Web.UI.WebControls.ListControl.OnSelectedIndexChanged(EventArgs e) +108
   System.Web.UI.WebControls.DropDownList.System.Web.UI.IPostBackDataHandler.RaisePostDataChangedEvent() +26
   System.Web.UI.Page.RaiseChangedEvents() +115
   System.Web.UI.Page.ProcessRequestMain() +1099 
--------------------------------------------------------------------------------
版本信息: Microsoft .NET Framework 版本:1.1.4322.2032; ASP.NET 版本:1.1.4322.2032   ·只要一选择列表框中的项或者点按钮提交保存,就会出现上面的错误,
   我的wenzhang 表里的id字段是自动编号的整型的主键,会不会是这个用冲突呢?还有 总是说 某某附近的 "@"有错误,无法分析查询和UPDATE文本云云,我的cmdgetbyid 的commandtext属性是:
SELECT title, writer FROM wenzhang WHERE (id = @ id)
    
cmdupdate 的 commandtext属性是:
UPDATE wenzhang SET title = @ title, wrter = @ writer WHERE (id = @ id)是不是这样句有问题啊?查询生成器的确定按钮就报以上错误呢?
请大家帮帮我,我搞了24个小时以上了,这个问题依然么有解决,好郁闷啊,
我第一次装VS.net 就喜欢上她了,我想把ASP.NET学好,我好孤独,没人教也没人交流,
教教我这个新手吧

解决方案 »

  1.   

    this.cmdgetbyid.Parameters["@id"].Value=id;这句,是否应先定义@id属性,再赋值呢??比如 cmdgetbyid..Parameters.Add("@id",OleDbType.Char,10);
      

  2.   

    cmdgetbyid.Parameters.Add("@id",OleDbType.Integer,10);
    cmdgetbyid.Parameters["@id"].Value=id;其他各属性类似.
      

  3.   

    this.cmdgetbyid.Parameters.Add("@id");
    this.cmdgetbyid.Parameters["@id"].Value=id;
      

  4.   

    Appleat: cmdgetbyid.Parameters.Add("@id",OleDbType.Integer,10);
    加了这句总提示   
    找不到类型或命名空间名称“OleDbType”,(是否缺少using指令或程序集引用)
      

  5.   

    回复人: bingbingcha(不思不归,不孟不E,原来是头大灰狼)加了你这句 this.cmdgetbyid.Parameters.Add("@id");就选择其他下拉列表项就提示如下:“/aspnet”应用程序中的服务器错误。
    --------------------------------------------------------------------------------OleDbParameterCollection 仅接受非空的 OleDbParameter 类型对象,不接受 String 对象。 
    是不是我的id字段是自动编号有关呢?
      

  6.   

    cmdgetbyid.Parameters.Add("@id",OleDbType.Integer,10);
    cmdgetbyid.Parameters["@id"].Value=id;这个 oledb 要引用 using System.Data.OleDb;命名空间
      

  7.   

    你这个id取的是textbox里的,如果不行的话,换成字符型试试
    cmdgetbyid.Parameters.Add("@id",OleDbType.Char,10);
    cmdgetbyid.Parameters["@id"].Value=id;oledb 要引用 using System.Data.OleDb;命名空间
      

  8.   

    我点了,添加引用,但是找不到using System.Data.OleDb这一条
    我直接写在.cs文件开头里试一试
      

  9.   

    我加了你这2句成功了,只不过他说我的sql表达式的语法错误:语法错误 (操作符丢失) 在查询表达式 '(id = @ id)' 中。 
    说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.Data.OleDb.OleDbException: 语法错误 (操作符丢失) 在查询表达式 '(id = @ id)' 中。源错误: 
    行 57:  this.oleDbConnection1.Open();
    行 58:  System.Data.OleDb.OleDbDataReader dr;
    行 59:  dr=this.cmdgetbyid.ExecuteReader(CommandBehavior.SingleRow);
    行 60:  if (dr.Read())
    行 61:  {
     
    源文件: d:\aspnet\webform2.aspx.cs    行: 59 
    我的两个command控件的情况是:cmdgetbyid 的commandtext属性是:
    SELECT title, writer FROM wenzhang WHERE (id = @ id)
        
    cmdupdate 的 commandtext属性是:
    UPDATE wenzhang SET title = @ title, wrter = @ writer WHERE (id = @ id)好象是有错误是不是这个sql语句不能这样写?还是我之前要声明"@id"等这样的变量?
    cmdgetbyid.Parameters.Add("@id",OleDbType.Char,10); 这一句不就行了吗?
    还改SQL语句吗?
      

  10.   

    你数据库中 id 这个字段 是自动编号?那应该是 int型吧.
    你这样试试:
    cmdgetbyid.Parameters.Add(New OleDbParameter("@id",OleDbType.Integer));
    cmdgetbyid.Parameters["@id"].Value=id;//确保这个id是int型的.如果是textbox里取出来的,先把它转换为int.
      

  11.   

    private void ddlid_SelectedIndexChanged(object sender, System.EventArgs e)
    {
    int id=ddlid.SelectedItem.Text;//无法转换string为integer
    cmdgetbyid.Parameters.Add("@id",OleDbType.Integer,10);
    this.cmdgetbyid.Parameters["@id"].Value=id;
    this.oleDbConnection1.Open();
    System.Data.OleDb.OleDbDataReader dr;
    dr=this.cmdgetbyid.ExecuteReader(CommandBehavior.SingleRow);
    if (dr.Read())
    {
    txttitle.Text=(string)dr["title"];
    txtwriter.Text=(string)dr["writer"];
    }
    dr.Close();
    this.oleDbConnection1.Close();
    } private void btnsave_Click(object sender, System.EventArgs e)
    {
    ing id=ddlid.SelectedItem.Text;//无法转换string为integer
    this.comupdate.Parameters["@id"].Value=id;
    this.comupdate.Parameters["@title"].Value=txttitle.Text;
    this.comupdate.Parameters["@writer"].Value=txtwriter.Text;
    this.oleDbConnection1.Open();
    this.comupdate.ExecuteNonQuery();
    this.oleDbConnection1.Close();
    }我不知道怎么把 ddlid.SelectedItem.Text 转成Integer
    哎 没有办法,才入门一星期水平低,语法都不熟
      

  12.   

    我已经把项目目录上传到网络硬盘里了
    http://free.ys168.com/?nada
    这个是我的网络硬盘地址,可以下载,在ASP NET 目录里
    有空帮我看看吧,谢谢啊
      

  13.   

    ddlid.SelectedItem.Text 内容是数字的话,这样写
    int id=int.Parse(ddlid.SelectedItem.Text);

    int id=Convert.ToInt32(ddlid.SelectedItem.Text);
      

  14.   

    http://andromedad.mofile.com/0900883211924400/3290132072835470/10/44FFA46ADB2B57764950296C1026B55F/aspnet练习.rar这个地址也可以下
      

  15.   

    “/aspnet”应用程序中的服务器错误。
    --------------------------------------------------------------------------------语法错误 (操作符丢失) 在查询表达式 '(id = @ id)' 中。 
    说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.Data.OleDb.OleDbException: 语法错误 (操作符丢失) 在查询表达式 '(id = @ id)' 中。源错误: 
    行 57:  this.oleDbConnection1.Open();
    行 58:  System.Data.OleDb.OleDbDataReader dr;
    行 59:  dr=this.cmdgetbyid.ExecuteReader(CommandBehavior.SingleRow);
    行 60:  if (dr.Read())
    行 61:  {
     看来下拉列表的项目数据类型搞好了没什么问题了,对应id字段也是int类型的了
    还是这两个command对象的commandtext属性有问题cmdgetbyid 的commandtext属性是:
    SELECT title, writer FROM wenzhang WHERE (id = @ id)
        
    cmdupdate 的 commandtext属性是:
    UPDATE wenzhang SET title = @ title, wrter = @ writer WHERE (id = @ id)这可能是最后的错误了,真是麻烦你了555
      

  16.   

    不知道为什么我这里打不开你的项目文件.我把你的两个函数重新写了一下.
    你需要在开始添加命名空间 using System.Data.OleDb;
    private void ddlid_SelectedIndexChanged(object sender, System.EventArgs e)
            {
                int id=int.Parse(ddlid.SelectedItem.Text);
                cmdgetbyid.Parameters.Add(new OleDbParameter("@id",OleDbType.Integer));
                cmdgetbyid.Parameters["@id"].Value=id;
                oleDbConnection1.Open();
                OleDbDataReader dr;
                dr=cmdgetbyid.ExecuteReader(CommandBehavior.SingleRow);
                if (dr.Read())
                {
                    txttitle.Text=(string)dr["title"].ToString();
                    txtwriter.Text=(string)dr["writer"].ToString();
                }
                dr.Close();
                oleDbConnection1.Close();
            }        private void btnsave_Click(object sender, System.EventArgs e)
            {
                int id = int.Parse(ddlid.SelectedItem.Text);
                comupdate.Parameters.Add(new OleDbParameter("@id",OleDbType.Integer));
                comupdate.Parameters.Add(new OleDbParameter("@title",OleDbType.Char));
                comupdate.Parameters.Add(new OleDbParameter("@write",OleDbType.Char));
                comupdate.Parameters["@id"].Value = id;
                comupdate.Parameters["@title"].Value = txttitle.Text;
                comupdate.Parameters["@writer"].Value = txtwriter.Text;
                oleDbConnection1.Open();
                comupdate.ExecuteNonQuery();
                oleDbConnection1.Close();
            }那两个commandtext好像没什么问题.不过你是用数据库控件直接放在页面上的,我一般不这么写,所以感觉很混乱.
    有什么问题可以qq 19908050
      

  17.   

    UPDATE wenzhang SET title = @ title, wrter = @ writer WHERE (id = @ id)
    注意:
    ID是关键字,应该用[]括起来
      

  18.   

    哦,我是在IIS里新建了一个虚拟目录,名为aspnet就可以打开了我刚回家,我马上试试你的代码研究一下
      

  19.   

    songxiaozhao(雨朋) :关键字?是SQL里的关键字吗?是不要要这样写?UPDATE wenzhang SET title = @ title, wrter = @ writer WHERE ([id] = @ id)
    还是这样?
    UPDATE wenzhang SET title = @ title, wrter = @ writer WHERE (id = [@id])
    或者是这样?
    UPDATE wenzhang SET title = @ title, wrter = @ writer WHERE (id = @[id])啊,我好郁闷。。