执行EditCommand和CancelCommand时都好使,我想说说UpdateCommand的问题:
................................
private void StudentDataGrid_UpdateCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
//string dbname=Server.MapPath("shili.mdb");
SqlConnection MyConnection = new SqlConnection("server=server;uid=sa;pwd=;database=shili");
// 建立 UPDATE 命令字符串
string UpdateCmd = "UPDATE 学生 SET 学生姓名 = @SName, 性别 = @Gender, 家长姓名 = @PName," +
"身高 = @Height, 体重 = @Weight, 血型 = @BloodType WHERE 身份证号码 = @uid";

SqlCommand MyCommand = new SqlCommand(UpdateCmd, MyConnection);

// 设定 UPDATE 命令字串中各个参数的数据类型与长度
MyCommand.Parameters.Add(new SqlParameter("@uid", SqlDbType.VarChar, 50));
MyCommand.Parameters.Add(new SqlParameter("@SName", SqlDbType.VarChar, 50));
MyCommand.Parameters.Add(new SqlParameter("@Gender", SqlDbType.VarChar, 50));
MyCommand.Parameters.Add(new SqlParameter("@PName", SqlDbType.VarChar, 50));
MyCommand.Parameters.Add(new SqlParameter("@Height", SqlDbType.VarChar, 50));
MyCommand.Parameters.Add(new SqlParameter("@Weight", SqlDbType.VarChar, 50));
MyCommand.Parameters.Add(new SqlParameter("@BloodType", SqlDbType.VarChar, 50));

// 取得主索引键之值(此处为身份证号码)
MyCommand.Parameters["@uid"].Value = StudentDataGrid.DataKeys[e.Item.ItemIndex];

string[] Cols = new string[] {"@uid", "@SName", "@Gender", "@PName", "@Height", "@Weight", "@BloodType"};

// 取得 TableCell 物件的数目,也就是每一数据列之储存格的数目(等於 DataGrid 伺服器控制项中数据行的数目)
int NumCols = e.Item.Cells.Count;

// 略过第一栏与第二栏。因为第一栏是按钮,第二栏的身份证号码则已在之前取得。
for (int i = 2; i<= NumCols - 1; i++)
{
TextBox CurrentTextBox = (TextBox)e.Item.Cells[i].Controls[0];
string ColValue = CurrentTextBox.Text;

// 检查字段(储存格)的内容是否为 Null 值
if (ColValue == "")
{
Message.Text = "错误: 每一个字段都必须输入数据不允许 Null 值!";
return;
}

// 将各字段(储存格)的数据指派给 UPDATE 命令中的参数
if (i == 3)
{
// 第四个字段(储存格)是「性别」,因此必须将 True 转换成 1,
// 并将 False 转换成 0,然後再指派给参数 @Gender 。
if (CurrentTextBox.Text == "true")
MyCommand.Parameters["@Gender"].Value = 1;
else
MyCommand.Parameters["@Gender"].Value = 0;
}
else
MyCommand.Parameters[Cols[i - 1]].Value = ColValue;
} // 开启连接
MyCommand.Connection.Open();

//try
//{
// 呼叫 ExecuteNonQuery() 方法以便针对数据来源执行 UPDATE 命令
MyCommand.ExecuteNonQuery();
Message.Text = "<b>已更新数据纪录</b><br>";

// 完成更新作业后使数据行跳出编辑模式
StudentDataGrid.EditItemIndex = -1;
//}
//catch (Exception Exp)
//{
//if (Exp.Message == "2627")
//Message.Text = "错误: 具有相同主索引键的数据纪录已经存在。";
//else
//Message.Text = "错误: 无法更新数据纪录,请确定各字段是否都已正确输入。";
//}

// 关闭连接
MyCommand.Connection.Close();
BindGridToSource();
} private void BindGridToSource()
{
//string dbname=Server.MapPath("shili.mdb");
SqlConnection MyConnection = new SqlConnection("server=server;uid=sa;pwd=;database=shili");
SqlDataAdapter MyCommand = new SqlDataAdapter("SELECT 身份证号码,学生姓名,性别,家长姓名,身高,体重,血型 FROM 学生", MyConnection);
DataSet ds = new DataSet();

MyCommand.Fill(ds, "学生");
StudentDataGrid.DataSource = ds.Tables["学生"].DefaultView;

StudentDataGrid.DataBind();
}
用以上的代码实现Update功能没有任何问题,但是我把Sql改为OleDb出问题了,当然,首先是改
using System.Data.OleDb;
......
修改后的代码如下:
private void StudentDataGrid_UpdateCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
//string dbname=Server.MapPath("shili.mdb");
OleDbConnection MyConnection = new OleDbConnection("provider=SQLOLEDB;server=server;uid=sa;pwd=;database=shili");
// 建立 UPDATE 命令字符串
string UpdateCmd = "UPDATE 学生 SET 学生姓名 = @SName, 性别 = @Gender, 家长姓名 = @PName," +
"身高 = @Height, 体重 = @Weight, 血型 = @BloodType WHERE 身份证号码 = @uid";

OleDbCommand MyCommand = new OleDbCommand(UpdateCmd, MyConnection);

// 设定 UPDATE 命令字串中各个参数的数据类型与长度
MyCommand.Parameters.Add(new OleDbParameter("@uid", OleDbType.VarChar, 50));
MyCommand.Parameters.Add(new OleDbParameter("@SName", OleDbType.VarChar, 50));
MyCommand.Parameters.Add(new OleDbParameter("@Gender", OleDbType.VarChar, 50));
MyCommand.Parameters.Add(new OleDbParameter("@PName", OleDbType.VarChar, 50));
MyCommand.Parameters.Add(new OleDbParameter("@Height", OleDbType.VarChar, 50));
MyCommand.Parameters.Add(new OleDbParameter("@Weight", OleDbType.VarChar, 50));
MyCommand.Parameters.Add(new OleDbParameter("@BloodType", OleDbType.VarChar, 50));

// 取得主索引键之值(此处为身份证号码)
MyCommand.Parameters["@uid"].Value = StudentDataGrid.DataKeys[e.Item.ItemIndex];

string[] Cols = new string[] {"@uid", "@SName", "@Gender", "@PName", "@Height", "@Weight", "@BloodType"};

// 取得 TableCell 物件的数目,也就是每一数据列之储存格的数目(等於 DataGrid 伺服器控制项中数据行的数目)
int NumCols = e.Item.Cells.Count;

// 略过第一栏与第二栏。因为第一栏是按钮,第二栏的身份证号码则已在之前取得。
for (int i = 2; i<= NumCols - 1; i++)
{
TextBox CurrentTextBox = (TextBox)e.Item.Cells[i].Controls[0];
string ColValue = CurrentTextBox.Text;

// 检查字段(储存格)的内容是否为 Null 值
if (ColValue == "")
{
Message.Text = "错误: 每一个字段都必须输入数据不允许 Null 值!";
return;
}

// 将各字段(储存格)的数据指派给 UPDATE 命令中的参数
if (i == 3)
{
// 第四个字段(储存格)是「性别」,因此必须将 True 转换成 1,
// 并将 False 转换成 0,然後再指派给参数 @Gender 。
if (CurrentTextBox.Text == "true")
MyCommand.Parameters["@Gender"].Value = 1;
else
MyCommand.Parameters["@Gender"].Value = 0;
}
else
MyCommand.Parameters[Cols[i - 1]].Value = ColValue;
} // 开启连接
MyCommand.Connection.Open();

//try
//{
// 呼叫 ExecuteNonQuery() 方法以便针对数据来源执行 UPDATE 命令
MyCommand.ExecuteNonQuery();
Message.Text = "<b>已更新数据纪录</b><br>";

// 完成更新作业后使数据行跳出编辑模式
StudentDataGrid.EditItemIndex = -1;
//}
//catch (Exception Exp)
//{
//if (Exp.Message == "2627")
//Message.Text = "错误: 具有相同主索引键的数据纪录已经存在。";
//else
//Message.Text = "错误: 无法更新数据纪录,请确定各字段是否都已正确输入。";
//}

// 关闭连接
MyCommand.Connection.Close();
BindGridToSource();
} private void BindGridToSource()
{
//string dbname=Server.MapPath("shili.mdb");
OleConnection MyConnection = new OleConnection("provider=SQLOLEDB;server=server;uid=sa;pwd=;database=shili");
OleDataAdapter MyCommand = new OleDataAdapter("SELECT 身份证号码,学生姓名,性别,家长姓名,身高,体重,血型 FROM 学生", MyConnection);
DataSet ds = new DataSet();

MyCommand.Fill(ds, "学生");
StudentDataGrid.DataSource = ds.Tables["学生"].DefaultView;

StudentDataGrid.DataBind();
}
出现的错误是@SName未声明,为什么呀,为什么我用Sql不会出现这个错误,改成OleDb却出现这个错误了?我估计用OleDb,@SName,"@uid", "@SName", "@Gender", "@PName", "@Height", "@Weight", "@BloodType"都要
声明,那么该如何声明?(string @SName,不行)