通过访问数据库2007中的查询更新更新datagridview中的数据的问题?

时间:2010-10-09 00:30:38

标签: c# ms-access datagridview variable-assignment

其他时间我需要你的帮助,我正在使用Access数据库(2007)在C#中开发一个应用程序,我认为这个问题是查询更新,我在互联网上搜索但没有任何作用,我有一个datagridview它有用户需要将3列数据放到最后2列(5行)中,我已经这样做了,但是当我填充datagridview中的列时,它确实将数据存储在数据库访问中。所以,我需要你帮助这是我的代码,帮助非常apreciated:D

private void btnGuardar_Click(object sender, EventArgs e)
    {

        //using (OleDbConnection conn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Databsename.accdb"))
        //{

        OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Databasename.accdb;Persist Security Info=false");


        int grade = 1;
        string x;
        string comment;

            for (int i = 0; i < this.dataGridView4.Rows.Count-1; i++)
            {

                x = dataGridView4.Rows[i].Cells[1].Value.ToString();
                //Console.WriteLine(x);
                MessageBox.Show(x);

                grade = int.Parse(x);


                comment = dataGridView4.Rows[i].Cells[2].Value.ToString();
                MessageBox.Show(comment);

                OleDbCommand cmd = new OleDbCommand("Update archievemnet set grade= @GRADE comment=@COMMENT WHERE idLine =1  ", conn);

                cmd.Parameters.Add(new OleDbParameter("@GRADE", OleDbType.Integer));
                cmd.Parameters["@GRADE"].Value = grade;

                cmd.Parameters.Add(new OleDbParameter("@comment", OleDbType.VarChar));
                cmd.Parameters["@COMMENT"].Value = comment;

                cmd.Connection.Open();
                cmd.ExecuteNonQuery();
                cmd.Connection.Close();
            }



        //}



    }

3 个答案:

答案 0 :(得分:1)

您的UPDATE语句需要在评论=

之前使用逗号

看看这个适用于我的系统的例子:

UPDATE tblFoo AS f SET f.parent_id = 99, f.foo_text = "updated"
WHERE (((f.id)=10));

99后没有逗号......:

UPDATE tblFoo AS f SET f.parent_id = 99 f.foo_text = "updated"
WHERE (((f.id)=10));

...访问抱怨:

Syntax error (missing operator) in query expression '99 f.foo_text = "updated"'.

答案 1 :(得分:0)

这不是最佳解决方案,但您可以尝试直接在查询中提供值。

OleDbCommand cmd = new OleDbCommand("UPDATE archievemnet SET " + 
" grade = " + textBoxGrade.Text +
" comment = " + textBoxComment.Text +
" WHERE idLine = 1  ", conn);

cmd.Connection.Open();
cmd.ExecuteNonQuery();
cmd.Connection.Close();

修改

OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Databasename.accdb;Persist Security Info=false");

int idLine;
double grade;
string comment;

for (int i = 0; i < this.dataGridView4.Rows.Count-1; i++)
{    
    idLine  = Convert.ToInt32(dataGridView4[0, i].Value);
    grade = Convert.ToDouble(dataGridView4[1, i].Value);
    comment = Convert.ToString(dataGridView4[2, i].Value);

    OleDbCommand cmd = new OleDbCommand("UPDATE archievemnet SET " + 
    " grade = " + grade +
    " comment = '" + comment + "' WHERE idLine = "+ idLine, conn);

    cmd.Connection.Open();
    cmd.ExecuteNonQuery();
    cmd.Connection.Close();
}

答案 2 :(得分:0)

在您的代码中,您有“Update archievemnet ...”。这可能是你桌子的名字,但正确的英文单词是“Achievement”。检查您是否正确拼写了表的名称。您还应该在代码周围使用try / catch块来捕获Access或db连接器抛出的任何异常,以及异常块中的一些日志记录。 (我使用并推荐NLog。)你说你得到一个例外,它是什么类型,消息是什么?

我认为你最好在你的最终代码中使用参数(就像你开始做的那样),而不是像yonan2236推荐的字符串连接 - 但它有时可以帮助调试。你可以试试:

    String updateStmt = "UPDATE archievemnet SET " + 
        " grade = " + grade +
        " comment = '" + comment + "' WHERE idLine = "+ idLine;
    OleDbCommand cmd = new OleDbCommand(updateStmt, conn);

并在创建命令之前停止调试器中的代码。将updateStmt的值复制到Access中,看看是否可以直接执行该语句。