从Textbox帮助更新Access数据库的问题?

时间:2010-10-02 16:14:22

标签: c# ms-access data-binding textbox

我已经搜索过,但没有任何反应,我只是开始使用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));
            }

此代码显示一条消息,告诉“未处理的异常。如果单击继续,应用程序将忽略此错误并继续意图。如果单击退出,应用程序将立即关闭”没有为某些所需的值指定值参数。

3 个答案:

答案 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] = ?;

以正确的顺序添加参数。