SQL更新命令始终返回0

时间:2014-12-25 11:56:07

标签: c# sql winforms ms-access-2007

我想知道为什么这段代码不起作用;它总是返回零(任何受影响的行)。该数据库是Access数据库。我可以插入和删除但不更新数据。它是Windows Forms C#App。

        string sql = "";
        try
        {
            string[] parametrosNomes = new string[3];
            parametrosNomes[0] = "@CatId";
            parametrosNomes[1] = "@CatNome";
            parametrosNomes[2] = "@CatDescricao";

            object[] parametrosValores = new object[3];
            parametrosValores[0] = oCateg.categoriaid;
            parametrosValores[1] = oCateg.categoriaNome;
            parametrosValores[2] = oCateg.categoriaDescricao;

            sql = "UPDATE Categorias SET categoriaNome = @CatNome, categoriaDescricao=@CatDescricao Where categoriaId=@CatId";
            int retorno = AcessoDB.CRUD(sql, parametrosNomes, parametrosValores);
            return retorno;
        }
        catch (Exception ex)
        {
            throw ex;
        }

注意:在CRUD方法中,我只填充参数并执行sqlcommand

int retorno = command.ExecuteNonQuery();
return retorno;

我验证了所有参数,字段名称和命令执行没有错误但始终返回零并且不更新数据库中的表。

我的代码中没有看到任何错误,但它不起作用。

任何人都可以睁开眼睛吗?

3 个答案:

答案 0 :(得分:1)

试试这个。参数应与sql中的顺序相同。在sql本身中,您需要使用'?'

    string sql = "";
    try
    {
        string[] parametrosNomes = new string[3];
        parametrosNomes[0] = "@CatNome";
        parametrosNomes[1] = "@CatDescricao";
        parametrosNomes[2] = "@CatCatId";

        object[] parametrosValores = new object[3];
        parametrosValores[0] = oCateg.categoriaNome;
        parametrosValores[1] = oCateg.categoriaDescricao;
        parametrosValores[2] = oCateg.categoriaid;

        sql = "UPDATE Categorias SET categoriaNome = ?, categoriaDescricao = ? Where categoriaId = ?";
        int retorno = AcessoDB.CRUD(sql, parametrosNomes, parametrosValores);
        return retorno;
    }
    catch (Exception ex)
    {
        throw ex;
    }

答案 1 :(得分:1)

我要感谢大家的答案。

问题已解决:参数未按照使用顺序传递。

我只是更正了参数顺序:

string[] parametrosNomes = new string[3];
parametrosNomes[0] = "@CatNome";
parametrosNomes[1] = "@CatDescricao";
parametrosNomes[2] = "@CatId";
object[] parametrosValores = new object[3];
parametrosValores[0] = oCateg.categoriaNome;
parametrosValores[1] = oCateg.categoriaDescricao;
parametrosValores[2] = oCateg.categoriaid;
sql = "UPDATE Categorias SET categoriaNome = @CatNome, categoriaDescricao=@CatDescricao Where categoriaId=@CatId";

现在表格正在正确更新。

答案 2 :(得分:0)

我一直想使用一个字典来将值与查询中的名称(例如id = @id)相匹配,这意味着在向OleDbCommand.Parameters列表中添加参数时顺序无关紧要。确实,.NET和Oracle或SQL Server数据库从未遇到过此问题。但是,使用msaccess(或者可能是OleDb)时,我发现当id参数(请参阅下面的单行)作为OleDbCommand.Parameters列表中的第一项时,ExecuteNonQuery始终返回0。将行移至参数的末尾列表(在WHERE子句中使用了id),ExecuteNonQuery返回1(预期结果)。

cmd.Parameters.AddWithValue("@id", pi.Id);