我使用Microsoft Access文件作为数据库。我对SELECT
和INSERT
查询没有任何问题,但是当我尝试UPDATE
时,数据库中的记录不会更改。
以下是我用来运行更新的代码。调试日志中没有异常或错误。
cnn = new OleDbConnection(connetionString);
OleDbCommand command = new OleDbCommand("UPDATE [Wpisy] SET [wpis]=@wpis, [id_kat]=@id_kat, [tytul]=@tytul WHERE [ID]=@id_wpis" , cnn);
command.Parameters.Add(new OleDbParameter("@wpis", tresc_wpisu.Text));
command.Parameters.Add(new OleDbParameter("@id_kat", lista_kategorii.SelectedValue));
command.Parameters.Add(new OleDbParameter("@tytul", tytul_wpisu.Text));
command.Parameters.Add(new OleDbParameter("@id_wpis", Request["id"].ToString() ));
command.Connection = cnn;
try
{
if(cnn.State.ToString() != "Open")
cnn.Open();
command.ExecuteNonQuery();
cnn.Close();
}
catch (OleDbException ex)
{
Response.Clear();
Response.Write(ex);
Response.End();
}
答案 0 :(得分:0)
我会转到Microsoft Access并在那里输入命令,看看会发生什么。它应该告诉你有多少行受到影响。如果它表示零行,则将查询分成更小的部分,例如:
选择*其中[ID] =值
然后你应该能够找到问题所在。
答案 1 :(得分:0)
我知道这不是一个确切的答案,但是使用MS Access有一些怪癖。
以下是一个示例方法,为数据库提供了一些适当的异常处理。对于Object
,创建一个表示表中行字段的类。我使用Exception ex
而不是db库异常,因为我使用DataReaders
进行选择。
private String connectionString = "someOleDbConnectionString";
public String UpdateObject(Object obj)
{
OleDbConnection connection = GetMyOleDbConnection(); //returns new OleDbConnection with proper connection string
String updateSql = "UPDATE [Wpisy] SET [wpis]=@wpis, [id_kat]=@id_kat, [tytul]=@tytul WHERE [ID]=@id_wpis";
OleDbCommand command = new OleDbCommand(updateSql, connection);
command.CommandType = System.Data.CommandType.Text; //this can be changed if you have stored procedures in your db.
//you may have to define the OleDbType of the parameter being defined
command.Parameters.Add(new OleDbParameter("@wpis", OleDbType.VarChar, obj.tresc_wpisu));
command.Parameters.Add(new OleDbParameter("@id_kat", OleDbType.VarChar, obj.lista_kategorii));
command.Parameters.Add(new OleDbParameter("@tytul", OleDbType.VarChar, obj.tytul_wpisu));
command.Parameters.Add(new OleDbParameter("@id_wpis", OleDbType.Integer, obj.id.ToString()));
return Execute(connection, command);
}
private OleDbConnection GetMyOleDbConnection()
{
return new OleDbConnection(connectionString);
}
private String Execute(OleDbConnection connection, OleDbCommand command)
{
try
{
connection.Open();
command.ExecuteNonQuery();
//I also know with Access databases,
//sometimes you have to close the table if it is open in MS Access
connection.Close();
return "SUCCESS";
}
catch (Exception ex)
{
connection.Close(); //important or you will have left open connections
Response.Clear();
Response.Write(ex.Message);
Response.End();
return ex.Message;
}
}
答案 2 :(得分:0)
我可能错了,但是从我记忆中来看,OleDB并不允许命名参数,而是使用"?"作为占位符,参数需要按照它们在SQL语句中出现的顺序添加。比如
String updateSql = "UPDATE [Wpisy] SET [wpis]=?, [id_kat]=?, [tytul]=? WHERE [ID]=?";
command.Parameters.Add(new OleDbParameter("parm_wpis", OleDbType.VarChar, obj.tresc_wpisu));
command.Parameters.Add(new OleDbParameter("parm_id_kat", OleDbType.VarChar, obj.lista_kategorii));
command.Parameters.Add(new OleDbParameter("parm_tytul", OleDbType.VarChar, obj.tytul_wpisu));
command.Parameters.Add(new OleDbParameter("parm_id_wpis", OleDbType.Integer, obj.id.ToString()));
命名参数只是为了澄清哪些是哪个。另一个问题可能是您使用与正在更新的列相同的名称命名参数,这可能是一个问题,几乎就像一个常量......
设置X = X而不是现在设置X = parmX ...您设置的PARAMETER值没有歧义。但总的来说,我认为它可以通过使用"?"作为参数占位符。