更新现有数据库条目C#VS2010

更新现有数据库条目C#VS2010,c#,visual-studio-2010,C#,Visual Studio 2010,我正在使用Visual Studio 2010在c#中创建一个Win表单。它有一些组合框和文本框,用户可以填写这些组合框,然后提交给Access DB。当我尝试更新现有条目时,会出现问题。我加载现有条目,进行更改,然后单击“更新”。我没有收到任何系统错误,我与数据库的连接成功,但实际上没有对数据进行任何更改。我完全错过了什么吗?提前感谢您提供的任何帮助或见解 以下是“更新”按钮的代码: private void updateButton_Click_1(object sender, Ev

我正在使用Visual Studio 2010在c#中创建一个Win表单。它有一些组合框和文本框,用户可以填写这些组合框,然后提交给Access DB。当我尝试更新现有条目时,会出现问题。我加载现有条目,进行更改,然后单击“更新”。我没有收到任何系统错误,我与数据库的连接成功,但实际上没有对数据进行任何更改。我完全错过了什么吗?提前感谢您提供的任何帮助或见解

以下是“更新”按钮的代码:

    private void updateButton_Click_1(object sender, EventArgs e)
    {
        {

        OleDbConnection conn = new OleDbConnection();
        conn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\servicereq1.mdb";

      OleDbCommand cmd = new OleDbCommand("UPDATE servicereq SET DateLogged = @datelogged, LoggedBy = @loggedby, Function = @function, [Other Impacts] = @summary, Account = @earningsaccount, [From] = @from, [To] = @to, Description = @description, Fixer = @fixer, [Time Estimate] = @timeestimate, [Actual Start] = @actualstart, [Actual Finish] = @actualfinish, [Actual Time] = @actualtime, [Programs/Forms] = @programsforms, Comments = @comments, [Retest Date] = @requestdate, Tester = @tester, Status = @status, [Problem In Environment] = @problemfoundin, [Code In Environment] = @codein WHERE (ServiceRequestNumber = @servreq)");
        cmd.Connection = conn;

        conn.Open();

        if (conn.State == ConnectionState.Open)
        {
            cmd.Parameters.AddWithValue("@servreq", serviceRequestNumberTextBox.Text);                
            cmd.Parameters.AddWithValue("@datelogged", dateLoggedTextBox.Text);                
            cmd.Parameters.AddWithValue("@loggedby", loggedByComboBox.Text);                
            cmd.Parameters.AddWithValue("@problemfoundin", problem_In_EnvironmentComboBox.Text);                
            cmd.Parameters.AddWithValue("@function", functionTextBox.Text);               
            cmd.Parameters.AddWithValue("@summary", other_ImpactsTextBox.Text);                
            cmd.Parameters.AddWithValue("@earningsaccount", accountTextBox.Text);                
            cmd.Parameters.AddWithValue("@from", fromTextBox.Text);               
            cmd.Parameters.AddWithValue("@to", toTextBox.Text);                
            cmd.Parameters.AddWithValue("@status", statusComboBox.Text);              
            cmd.Parameters.AddWithValue("@description", descriptionTextBox.Text);                
            cmd.Parameters.AddWithValue("@fixer", fixerComboBox.Text);               
            cmd.Parameters.AddWithValue("@codein", code_In_EnvironmentComboBox.Text);               
            cmd.Parameters.AddWithValue("@programsforms", programs_FormsTextBox.Text);
            cmd.Parameters.AddWithValue("@timeestimate", time_EstimateTextBox.Text);              
            cmd.Parameters.AddWithValue("@actualstart", actual_StartTextBox.Text);               
            cmd.Parameters.AddWithValue("@actualfinish", actual_FinishTextBox.Text);                
            cmd.Parameters.AddWithValue("@actualtime", actual_TimeTextBox.Text);                
            cmd.Parameters.AddWithValue("@requestdate", retest_DateTextBox.Text);                
            cmd.Parameters.AddWithValue("@tester", testerComboBox.Text);                
            cmd.Parameters.AddWithValue("@comments", commentsTextBox.Text);            
            try
            {
                cmd.ExecuteNonQuery();
                MessageBox.Show("Form Updated Successfully");
                conn.Close();
            }
            catch (OleDbException ex)
            {
                MessageBox.Show(ex.Message);
                conn.Close();
            }
        }
        else
        {
            MessageBox.Show("Connection Failed");
        }
        }
    }

您不应该将数据库参数放在引号内——如果您这样做,它们将作为纯文本而不是参数进行计算。ServiceRequestNumber不等于文本字符串'@servreq'的行,因此不会更新任何内容

此外,DataCommands不会将局部变量作为参数拉入—它们必须显式地添加到DataCommand对象(在本例中为cmd)。删除参数添加代码时不会出现任何错误的原因是,如上所述,查询不需要任何参数

另外,在您删除的代码中添加参数的方式至少可以说很奇怪。这更正常,也更容易阅读:

cmd.Paramaters.AddWithValue("@paramName", paramData);
//or
cmd.Parameters.Add(new OleDbParameter("@paramName", paramData));

在花了更多的时间编辑和移动代码之后,我无意中发现了这样一个事实:参数在查询中的顺序必须与绑定值时的顺序相同。在按照建议对语法进行更改并将参数按正确顺序排列后,我能够对表单中的现有数据进行编辑。

而且我知道,将列标题与空格一起设置是很糟糕的。我从其他人那里继承了这个表,但有人要求我不要更改它们:-(在SQL语句中使用变量有什么原因吗?通常使用参数。AddWithValue()因为您正在调用存储过程以消除SQL注入。您尝试以这种方式运行它还有其他原因吗?我将尝试对其进行更改,看看是否有更好的结果。您如何知道“实际上没有对数据进行任何更改”?您的代码中没有检查更改的内容。cmd.Parameters.Add已被删除,因此最好使用cmd.Parameters。AddWithValueAdd(字符串,对象)已过时(在当前版本的框架中甚至不存在),但Add(SqlParameter)可以使用。请参阅.Add(字符串,对象)仍然在4.5版本中,我正在将一组软件从2.0更新到4.5版本,它只是给出了关于它被弃用的警告。您让我查看的同一文档显示了这一点。啊。我的错误。也许Visual Studio没有显示过时重载的IntelliSense?在查找该文档之前,我甚至不知道存在重载,所以我(错误地)认为它不再存在于框架中。是的,VS2012和VS2013停止了IntelliSense,因为不推荐使用的方法。啊-我显然在SQL Server上做了太多的工作。看起来这是标准的。