——此文章摘自《C#高级编程(第3版)》定价:128元 特价:100.1元 购买
daEvents.Fill(ds, "Events");
eventTable = ds.Tables["Events"];
calendar.SelectedDate =
getFreeDate(calendar.SelectedDate.AddDays(1));
}
如果ExecuteNonQuery()返回的数字不是1,就会有问题。在本例中不必担心,只需要在resultLabel中显示一个故障通知:
else
{
resultLabel.Text = "Event not added due to DB access "
+ "problem.";
}
最后再次断开连接,支持数据的会议登记应用程序的就完成了。
oleDbConnection1.Close();
}
}
注意:由于SQL INSERT查询的语法,必须避免在会议名称中使用某些字符,例如单引号“'”,因为它们会导致出错。实施一个定制的验证规则是相当简单的,可以防止用户使用这些字符,或者在插入数据之前和读取数据之后,使用某种类型的转义字符,但这里没有介绍这段代码。
submitButton_Click()事件处理程序目前从会议特性中组合了一个字符串,并在 reulstLabel控件中显示它。要给数据库添加一个会议,需要把创建出来的字符串重新格式化到一个SQL INSERT查询中,并执行它。
注意:为了把数据写入Access数据库,ASPNET用户(在默认情况下运行ASP.NET进程的账户)必须明确地拥有文件的写入许可。这可以使用Windows资源管理器来赋予。在比较高级的场合下,可以使用其他账户访问资源,例如域账户用于访问网络上其他地方的SQL Server实例。在ASP.NET中有这个功能(通过模拟、COM+服务或其他方式实现),但它超出了本书的范围。
下面的许多代码都是很熟悉的:
protected void submitButton_Click(object sender, System.EventArgs e)
{
if (this.IsValid)
{
String attendees = "";
foreach (ListItem attendee in attendeeList.Items)
{
if (attendee.Selected)
{
attendees += attendee.Text + " (" + attendee.Value + "), ";
}
}
attendees += " and " + nameBox.Text;
String dateString =
calendar.SelectedDate.Date.Date.ToShortDateString();
String oleDbCommand = "INSERT INTO Events (Name, Room, " +
"AttendeeList, EventDate) VALUES ('" +
eventBox.Text + "', '" +
roomList.SelectedItem.Value + "', '" +
attendees + "', '" + dateString + "')";
创建了SQL查询字符串后,就可以使用它构建OleDb.OleDbCommand对象了:
System.Data.OleDb.OleDbCommand insertCommand =
new System.Data.OleDb.OleDbCommand(oleDbCommand,
oleDbConnection1);
接着重新打开在Page_Load()中断开的连接(这可能不是最高效的方式,但很适合于演示),执行查询:
oleDbConnection1.Open();
int queryResult = insertCommand.ExecuteNonQuery();
ExecuteNonQuery()返回一个整数,表示查询会影响表中的多少行。如果它等于1,插入就是成功的。此时如果把一个成功的信息放在resultLabel中,执行一个新查询,用会议的新列表重新填充eventTable和数据集(首先清除数据集中的数据,否则会议日期就会重叠),把日历选择改为一个新的、没有会议的日期:
if (queryResult == 1)
{
resultLabel.Text = "Event Added.";
daEvents = new System.Data.OleDb.OleDbDataAdapter(
"SELECT * FROM Events", oleDbConnection1);
ds.Clear();