为什么点击按钮无法添加数据?提示这么个东西:“当传递具有新行的 DataRow 集合时,更新要求有效的 InsertCommand。 ”

jackrong427 2004-04-29 05:25:02
表的格式:(id自动编号)
id name chinese math
1 周荣 100 100
2 jack 90 90


dataset.aspx如下:

<%@ Page language="c#" Codebehind="Dataset.aspx.cs" AutoEventWireup="false" Inherits="dbms.dataset" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<title>dataset</title>
<meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR">
<meta content="C#" name="CODE_LANGUAGE">
<meta content="JavaScript" name="vs_defaultClientScript">
<meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema">
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
<asp:label id="Label1" style="Z-INDEX: 101; LEFT: 24px; POSITION: absolute; TOP: 32px" runat="server"
Width="184px" Height="32px" BackColor="LavenderBlush" BorderColor="#0000C0">DataSet演示</asp:label>
<asp:Button id="Button1" style="Z-INDEX: 105; LEFT: 48px; POSITION: absolute; TOP: 232px" runat="server"
BackColor="Tomato" Text="添加学生资料1"></asp:Button>
<asp:datagrid id="DataGrid1" style="Z-INDEX: 102; LEFT: 48px; POSITION: absolute; TOP: 88px" runat="server"
Width="408px" HeaderStyle-BackColor="#ff3333" AutoGenerateColumns="False">
<Columns>
<asp:BoundColumn HeaderText="编号" DataField="id"></asp:BoundColumn>
<asp:BoundColumn HeaderText="姓名" DataField="name"></asp:BoundColumn>
<asp:BoundColumn HeaderText="语文" DataField="chinese"></asp:BoundColumn>
<asp:BoundColumn HeaderText="数学" DataField="math"></asp:BoundColumn>
</Columns>
</asp:datagrid></form>
</body>
</HTML>



dataset.aspx.cs如下:

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
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 dbms
{
/// <summary>
/// dataset 的摘要说明。
/// </summary>
public class dataset : System.Web.UI.Page
{
protected System.Web.UI.WebControls.Label Label1;
protected System.Web.UI.WebControls.Button Button1;
protected System.Web.UI.WebControls.DataGrid DataGrid1;
public SqlConnection conn;
public string sql;

private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
conn=new SqlConnection("server=localhost;uid=sa;pwd=;database=test");
conn.Open();
sql="select * from score";
DataSet ds=new DataSet();
SqlDataAdapter myadapt=new SqlDataAdapter(sql,conn);
myadapt.Fill(ds,"score");
DataGrid1.DataSource=ds;
DataGrid1.DataMember="score";
DataGrid1.DataBind();
ds.Clear();
}

#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}

/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.Button1.Click += new System.EventHandler(this.Button1_Click);
this.Load += new System.EventHandler(this.Page_Load);

}
#endregion

private void Button1_Click(object sender, System.EventArgs e)
{
DataSet addscore=new DataSet();
SqlDataAdapter myscore=new SqlDataAdapter(sql,conn);
myscore.Fill(addscore,"score");

DataGrid1.DataSource=addscore;
DataGrid1.DataMember="score";
DataGrid1.DataBind();

DataRow rs=addscore.Tables["score"].NewRow();
rs["name"]="jack";
rs["chinese"]=60;
rs["math"]=80;
addscore.Tables["score"].Rows.Add(rs);
myscore.Update(addscore,"score");
}

}
}
...全文
122 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
空地上的奶牛 2004-06-17
  • 打赏
  • 举报
回复
在myscore.Update(addscore,"score");前面加
SqlCommandBuilder builder = new SqlCommandBuilder(myscore);

DataAdapter有4个重要属性:
SelectCommand
InsertCommand
UpdateCommand
DeleteCommand
当SqlDataAdapter myscore=new SqlDataAdapter(sql,conn);创建DataAdapter时,构造函数会
自动初始化SelectCommand,但是其他几个属性(包括InsertCommand)仍未空,所以当你的myscore调用Update时,便会抛出异常,提示"更新要求有效的 InsertCommand".

利用SqlCommandBuilder可以根据DataAdapter和初始化的SelectCommand自动生成Insert,Update,Delete命令. 可以用SqlCommandBuilder的几个方法返回查看这些命令:

string insertStr = builder.GetInsertCommand().CommandText;
string updateStr = builder.GetUpdateCommand().CommandText;
string deleteStr = builder.GetDeleteCommand().CommandText;

如果要提高效率的化,还是自己写语句比较好!
refuly 2004-04-30
  • 打赏
  • 举报
回复
kanshangren(小彻小悟) 说得有道理!DataAdapter包含对四个Command对象的引用,其中每个对象都有CommandText属性用来包含实际要执行的SQL命令:InsertCommand,DeleteCommand,UpDateCommand和使用的最多的SelectCommand
lxcc 2004-04-30
  • 打赏
  • 举报
回复
int MyInsertMethod(string au_id, string address, string city, string state, string zip, bool contract) {
string connectionString = "server=\'(local)\'; user id=\'sa\'; password=\'\'; database=\'pubs\'";
System.Data.IDbConnection dbConnection = new System.Data.SqlClient.SqlConnection(connectionString);

string queryString = "INSERT INTO [authors] ([au_id], [au_lname], [au_fname], [address], [city], [state" +
"], [zip], [contract]) VALUES (@au_id, , , @address, @city, @state, @zip, @contra" +
"ct)";
System.Data.IDbCommand dbCommand = new System.Data.SqlClient.SqlCommand();
dbCommand.CommandText = queryString;
dbCommand.Connection = dbConnection;

System.Data.IDataParameter dbParam_au_id = new System.Data.SqlClient.SqlParameter();
dbParam_au_id.ParameterName = "@au_id";
dbParam_au_id.Value = au_id;
dbParam_au_id.DbType = System.Data.DbType.String;
dbCommand.Parameters.Add(dbParam_au_id);
System.Data.IDataParameter dbParam_address = new System.Data.SqlClient.SqlParameter();
dbParam_address.ParameterName = "@address";
dbParam_address.Value = address;
dbParam_address.DbType = System.Data.DbType.String;
dbCommand.Parameters.Add(dbParam_address);
System.Data.IDataParameter dbParam_city = new System.Data.SqlClient.SqlParameter();
dbParam_city.ParameterName = "@city";
dbParam_city.Value = city;
dbParam_city.DbType = System.Data.DbType.String;
dbCommand.Parameters.Add(dbParam_city);
System.Data.IDataParameter dbParam_state = new System.Data.SqlClient.SqlParameter();
dbParam_state.ParameterName = "@state";
dbParam_state.Value = state;
dbParam_state.DbType = System.Data.DbType.StringFixedLength;
dbCommand.Parameters.Add(dbParam_state);
System.Data.IDataParameter dbParam_zip = new System.Data.SqlClient.SqlParameter();
dbParam_zip.ParameterName = "@zip";
dbParam_zip.Value = zip;
dbParam_zip.DbType = System.Data.DbType.StringFixedLength;
dbCommand.Parameters.Add(dbParam_zip);
System.Data.IDataParameter dbParam_contract = new System.Data.SqlClient.SqlParameter();
dbParam_contract.ParameterName = "@contract";
dbParam_contract.Value = contract;
dbParam_contract.DbType = System.Data.DbType.Boolean;
dbCommand.Parameters.Add(dbParam_contract);

int rowsAffected = 0;
dbConnection.Open();
try {
rowsAffected = dbCommand.ExecuteNonQuery();
}
finally {
dbConnection.Close();
}

return rowsAffected;
}
kanshangren 2004-04-30
  • 打赏
  • 举报
回复
没有定义myscore的UpdateCommand
singleflower 2004-04-30
  • 打赏
  • 举报
回复
这一行该成这样试试:
DataRow rs=addscore.Tables["score"].NewRow();
--》
DataRow rs=new DataRow();
stuhome 2004-04-30
  • 打赏
  • 举报
回复

……
rs["name"]="jack";
rs["chinese"]=60;
rs["math"]=80;
addscore.Tables["score"].Rows.Add(rs);
myscore.Update(addscore,"score");
……

改成
……
rs["name"]="jack";
rs["chinese"]=60;
rs["math"]=80;
addscore.Tables["score"].Rows.Add(rs);
addscore.AcceptChanges();
rs["name"]="jack";
myscore.Update(addscore,"score");
……
看一看Microsoft 的Duwamish就知道为什么这样应该这样改。(MSDN帮助里有相关介绍)

win_feng 2004-04-30
  • 打赏
  • 举报
回复
zhaozhongju说的有道理
zhaozhongju 2004-04-30
  • 打赏
  • 举报
回复
你的DataAdapter中没有InsertCommond
listhome 2004-04-29
  • 打赏
  • 举报
回复
学习一下!
vzxq 2004-04-29
  • 打赏
  • 举报
回复
帮你UP 来高手
jackrong427 2004-04-29
  • 打赏
  • 举报
回复
表名是score

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧