2015-06-04 63 views
1

我使用Microsoft Access文件作爲數據庫。我對SELECTINSERT查詢沒有問題,但是當我嘗試UPDATE時,數據庫中的記錄不會更改。OleDB更新命令不改變數據

下面是我用來運行更新的代碼。調試日誌中沒有例外或錯誤。

cnn = new OleDbConnection(connetionString); 

    OleDbCommand command = new OleDbCommand("UPDATE [Wpisy] SET [wpis][email protected], [id_kat][email protected]_kat, [tytul][email protected] WHERE [ID][email protected]_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

您是否驗證過請求[「id」] .ToString()是否給您正確的ID? –

+0

請求[「id」]是否包含參數「@ id_wpis」的值,並且您的更新是否在數據庫中正確執行? – rageit

+0

@BrianDishaw @rageit是的,'Request [「id」]'包含適當的值並且沒有錯誤。 – Forien

回答

0

我會去的Microsoft Access,進入那裏的命令,並看看會發生什麼。它應該告訴你有多少行受到影響。如果說零行,然後打破你的查詢成小塊,如:

選擇*其中[ID] =價值

然後你應該能夠追查問題的所在。

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][email protected], [id_kat][email protected]_kat, [tytul][email protected] WHERE [ID][email protected]_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; 
    } 
} 
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值被應用時沒有歧義。但總的來說,我認爲它會通過使用「?」作爲參數佔位符。