20. december 2010 - 22:22Der er
57 kommentarer og 2 løsninger
MySQL, tjekke om den kan UPDATE ellers bruge INSERT.
Hej Eksperten.
Jeg har lavet et MySQL script, og det hele virker perfekt. Men problemet er bare, at jeg skal kunne finde info om et brugernavn allerede er der.
Lige nu bruger jeg try { UPDATE } catch { INSERT }. Men nogen gange så kommer de på flere gange, jeg ved ikke lige hvorfor. Nogen som kan hjælpe mig med en simpel udgave, af at tjekke om et brugernavn allerede findes i feltet "Brugernavn"?
public void MySQLDATA() { try { string query = "UPDATE users SET kode='21' WHERE brugernavn='Test'"; if (this.OpenConnection() == true) { MySqlCommand cmd = new MySqlCommand(query, connection); cmd.ExecuteNonQuery(); this.CloseConnection(); } } catch { string query = "INSERT INTO users (brugernavn, kode) VALUES('Test', '123')"; if (this.OpenConnection() == true) { MySqlCommand cmd = new MySqlCommand(query, connection); cmd.ExecuteNonQuery(); this.CloseConnection(); } } }
Ved ikke hvor meget I får ud af dette, men håber I kan hjælpe mig videre :-)
hmm, haha Arne, det kan du faktisk have ret i. Omend det ikke ville være noget man ville ramme specielt tit, så kan det jo selvfølgelig ske som du siger.
Tak for kommentarerne, jeg vil lige kigge lidt på det. Men der er ikke en måde, ligesom i PHP. Hvor man kan if(mysql_query(result) == 1) { Der findes allerede data }
$result = mysql_query("SELECT * FROM table1", $link); $num_rows = mysql_num_rows($result);
echo "$num_rows Rows\n";
?>
Som vil give dig antal rows ... og så er vi tilbage til arne og min version ... du bliver nød til på en måde først at sikre dig at brugeren ikke findes ved en select SELECT Id FROM users WHERE Email = 'foo@bar.tld'
Affected rows af din select vil så være 1 eller 0 alt efter om han findes. Jeg går ud fra du har en unique constraint på Email, så den ikke kan eksistere flere gange.
MySql.Data.MySqlClient.MySqlException (0x80004005): You have an error in your SQ L syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SET Kode='21' WHERE Brugernavn='1'' at line 1 at MySql.Data.MySqlClient.MySqlStream.ReadPacket() at MySql.Data.MySqlClient.NativeDriver.GetResult(Int32& affectedRow, Int32& i nsertedId) at MySql.Data.MySqlClient.Driver.GetResult(Int32 statementId, Int32& affected Rows, Int32& insertedId) at MySql.Data.MySqlClient.Driver.NextResult(Int32 statementId) at MySql.Data.MySqlClient.MySqlDataReader.NextResult() at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior ) at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader() at MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery()
Og jeg har prøvet med 'SET Kode='21' WHERE Brugernavn='1'' - det hjalp heller ikke.
string query = "INSERT INTO test (Brugernavn, Kode) VALUES (1,2) ON DUPLICATE KEY UPDATE test SET Kode='21' WHERE Brugernavn='1'";
MySql.Data.MySqlClient.MySqlException (0x80004005): You have an error in your SQ L syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE Brugernavn='1'' at line 1 at MySql.Data.MySqlClient.MySqlStream.ReadPacket() at MySql.Data.MySqlClient.NativeDriver.GetResult(Int32& affectedRow, Int32& i nsertedId) at MySql.Data.MySqlClient.Driver.GetResult(Int32 statementId, Int32& affected Rows, Int32& insertedId) at MySql.Data.MySqlClient.Driver.NextResult(Int32 statementId) at MySql.Data.MySqlClient.MySqlDataReader.NextResult() at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior ) at MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery()
$result = mysql_query("update test set col='test' where col_id='1';"); if (mysql_affected_rows()==0) { $result = mysql_query("insert into test (col_id, col) values ('1','test');"); }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using MySql.Data.MySqlClient; namespace ConsoleApplication1 { class Program { static void Main() { try { string brugernavn = "2";
string query = "SELECT * FROM test WHERE Brugernavn = '" + brugernavn + "'"; string query_update = "update test set Kode='test' where Brugernavn='" + brugernavn + "'"; string query_new = "insert into test (Brugernavn, Kode) values ('" + brugernavn + "','test_new')"; string connectionString; connectionString = "SERVER=" + MySQLserver + ";" + "DATABASE=" + MySQLdatabase + ";" + "UID=" + MySQLuid + ";" + "PASSWORD=" + MySQLpassword + ";";
connection = new MySqlConnection(connectionString);
connection.Open();
MySqlCommand MySQLcmd = new MySqlCommand(query, connection); Console.WriteLine(MySQLcmd.ExecuteNonQuery()); if (MySQLcmd.ExecuteNonQuery() <= 0) { Console.WriteLine("Brugeren oprettes."); new MySqlCommand(query_new, connection); } else { Console.WriteLine("Brugeren opdateres"); new MySqlCommand(query_update, connection); } } catch { } Console.WriteLine("Done."); Console.ReadKey(); } } }
Den virker bare ikke som den skal. Lige meget om brugeren eksistere eller ikke, så skriver ExecuteNonQuery() "-1".
Nu er den der også snart ... med hjælp fra os (Da jeg ikke løser opgaver for folk, men hjælper dem på vej)
I din "if" sætning ... smider du dit command object lige efter du har oprettet det ... dvs du når aldrig at fyre det af mod din database.
Du skal nok gøre noget ala: (kan indeholde fejl) if (MySQLcmd.ExecuteNonQuery() <= 0) { Console.WriteLine("Brugeren oprettes."); MySQLcmd = new MySqlCommand(query_new, connection); } else { Console.WriteLine("Brugeren opdateres"); MySQLcmd = new MySqlCommand(query_update, connection); } MySQLcmd.ExecuteNonQuery();
Der bruger MS selv et eksemple som mit, måske du kan se en forskel, jeg kan i hvert fald ikke lige regne ud hvad der skulle være forskel, med mindre MySQL returnere noget andet.
Men glad for at det endelig er kommet til at virke, og det var dig selv der lavede løsningen i stedet for os :-) Det lærer man mest af.
Det giver god mening at lade typen af COUNT være fast uanset den faktisk værdi, så selvom værdien kun er 0 eller 1, så har den jo den type som den har.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.