我已经搜索过,但没有任何反应,我只是开始使用C#.NET而且我在表单上有一个文本框。我从数据库中检索一些数据,然后通过组合框显示到文本框,指示我想要显示的部分(我已经这样做了!),但是当我尝试更新没有任何工作时,我点击我的按钮来更新访问数据库(访问2007)并没有任何反应,用户只是更改了一些东西,按钮必须更新访问数据库,我希望你能帮助我:D 到目前为止,这是我的代码:
String textTobeUpdated = textBox3.Text;
String thing = comboBox2.Text;
using (var conn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=MyDataBase.accdb"))
using (var cmd = conn.CreateCommand())
{
cmd.CommandText = "UPDATE Section SET content = [@content] WHERE name= thing";
cmd.Parameters.AddWithValue("@content",content);
conn.Open();
int rowsAffected = cmd.ExecuteNonQuery();
if (rowsAffected == 1)
{
MessageBox.Show("Success");
}
else
{
MessageBox.Show(string.Format("{0} Rows Affected", rowsAffected));
}
此代码显示一条消息,告诉“未处理的异常。如果单击继续,应用程序将忽略此错误并继续意图。如果单击退出,应用程序将立即关闭”没有为某些所需的值指定值参数。
答案 0 :(得分:0)
看起来您执行了两次查询(您调用cmd.ExecuteNonQuery();
的两个区域)
删除第一个并留下
行int rowsAffected = cmd.ExecuteNonQuery();
此行将执行更新,然后计算更新的行数。然后,此计数用于向用户显示消息。
你也没有为content
变量设置一个值,(我猜它应该是文本框值),更新查询本身似乎有点奇怪,你没有参数化'东西'你正在更新,所以我想它应该是:
cmd.CommandText = "UPDATE Section SET content=[@content] WHERE name=[@thing]";
cmd.Parameters.AddWithValue("@content", textTobeUpdated);
cmd.Parameters.AddWithValue("@thing", thing);
答案 1 :(得分:0)
如果您是.NET新手并使用最新版本的C#,那么我建议您使用LINQ编写数据访问代码。
你必须学习LINQ,但这比学习ADO.NET更自然。
然后,您将使用Repository类为您的应用程序编写数据访问权限,并最终获得更易维护的代码库。
我认为Slartibartfast的解决方案是正确的,考虑到代码,但我发布这个作为答案而非评论,因为使用LINQ是更容易学习的曲线。然后,如果需要,您可以学习ADO.NET。
编辑:
我认为您需要阅读的C#位是LINQ,LINQ to SQL,LINQ to Entities,以及用于封装数据访问代码的存储库模式。上面的代码是使用ADO.NET编写的,这是一种难以实现的低级方法。除非你有大量的遗留代码,否则LINQ就是我要走的路。
一个。 LINQ:
LINQ代表语言集成查询,它允许您像查询数据库一样查询对象集合。但它的LINQ to SQL和LINQ to Entities风格也是一种数据访问技术。它允许您查询,创建,编辑和删除数据库(或其他数据存储区)中的数据。它“看起来”像SQL,但是强类型。
湾存储库模式:
存储库模式是一种模式,允许您标准化(并测试是否如此倾向)您的数据访问代码,所有这些都封装在类中。它使您的代码更易于维护。
互联网充斥着关于如何使用LINQ的讨论,博客和示例。
编辑提供示例LINQ to SQL选项:
你想要做的事情的基本原则是:
假设您已创建名为dbDataContext的DBML文件,并且您要更新的记录位于名为MyTable的表中:
// instantiate the datacontext object using the connection string
var db = new dbDataContext("myConnectionString");
// retrieve the record to update
var record = (from r in db.Section where r.Name == "thing" select r).Single();
if (record != null) record.Content = "Content";
try
{
// try to update the database
db.SubmitChanges();
MessageBox.Show("Success!");
}
catch
{
// Darn! Didn't work...
MessageBox.Show("Ooops!");
}
请注意这是多么可读。
答案 2 :(得分:0)
更改:cmd.CommandText = "UPDATE Section SET content = [@content] WHERE name= thing";
收件人:cmd.CommandText = "UPDATE Section SET content = ? WHERE name= thing";
通过OleDB我认为你不能将命令文本中的参数命名为Jet / ACE。如果你有多个参数,你必须保持它们的顺序并继续使用'?'。
...Where [This] = ? AND [That] = ?;
以正确的顺序添加参数。