Avatar billede idiotbarn Nybegynder
11. juni 2005 - 15:13 Der er 26 kommentarer og
1 løsning

Indsæt data i mySQL

Jeg prøver på at indsætte data i en mysql database hvilket ikke går specielt godt. Jeg har oprettet en lille database med tabellen og feltet:

Database: test
Tabel: TestTabel
Kolonner: Id (varchar(20))

Jeg prøver nu at indsætte med koden:
<%@ Page Language="C#" %>
<%@ assembly name="MySql.Data" %>
<%@ import Namespace="MySql.Data.MySqlClient" %>
<%@ import Namespace="System.Data" %>
<script runat="server">

    // Insert page code here
    //
    public void Page_Load(Object sender, EventArgs E){

    MySqlConnection conn = new MySqlConnection(ConfigurationSettings.AppSettings["connectionstring"]);
    MySqlCommand cmd = new MySqlCommand("INSERT INTO test.TestTabel (Id) VALUES (@Id)",conn);



      conn.Open();
    cmd.Parameters.Add("@Id","asdzxc");
    cmd.ExecuteNonQuery();
      conn.Close();
    }

</script>






Og får fejlen:
Exception Details: MySql.Data.MySqlClient.MySqlException: Column 'Id' cannot be null




Udkommenter jeg linien:
cmd.ExecuteNonQuery();
og erstatter den med:
   
for(int j=0;j<cmd.Parameters.Count;j++){
Response.Write(cmd.Parameters[j]+" : "+cmd.Parameters[j].Value+" - ");
}

Skriver den:

Id : asdzxc -


Har i nogen gode ideer til hvorfor den brokker sig?
Avatar billede nielle Nybegynder
11. juni 2005 - 15:19 #1
Prøv noget i stil med:

cmd.Parameters.Add("@Id", OdbcType.VarChar, 50).Value = "asdzxc";
Avatar billede nielle Nybegynder
11. juni 2005 - 15:21 #2
Eller også hedder typen MySqlType.VarChar i stedet for OdbcType.VarChar:

cmd.Parameters.Add("@Id", MySqlType.VarChar, 50).Value = "asdzxc";
Avatar billede idiotbarn Nybegynder
11. juni 2005 - 15:23 #3
får en:
The best overloaded method match for 'MySql.Data.MySqlClient.MySqlParameterCollection.Add(string, MySql.Data.MySqlClient.MySqlDbType, int)' has some invalid arguments
Avatar billede idiotbarn Nybegynder
11. juni 2005 - 15:26 #4
hvis jeg gør det med:
cmd.Parameters.Add("@Id", MySqlDbType.VarChar, 50).Value = "asdzxc";

får jeg det samme...altså at den ikke kan være null
Avatar billede nielle Nybegynder
11. juni 2005 - 15:37 #5
Jeg kan simpelthen ikke se at der skulle være noget som helst galt i din kode. Er der et linjenummer på fejlmeddelesen?
Avatar billede idiotbarn Nybegynder
11. juni 2005 - 15:40 #6
Mja...Det er cmd.Execute...

Fejlsiden er her:

Source Error:


Line 18:    //cmd.Parameters.Add("@Id","asdzxc");
Line 19:    cmd.Parameters.Add("@Id", MySqlDbType.VarChar, 50).Value = "asdzxc";
Line 20:    cmd.ExecuteNonQuery(); <----Markeret med rød
Line 21:
Line 22:    for(int j=0;j<cmd.Parameters.Count;j++){


Stack Trace:


[MySqlException: Column 'Id' cannot be null]
  MySql.Data.MySqlClient.PacketReader.CheckForError() +94
  MySql.Data.MySqlClient.PacketReader.ReadHeader() +229
  MySql.Data.MySqlClient.PacketReader.OpenPacket() +107
  MySql.Data.MySqlClient.NativeDriver.ReadResult(UInt64& affectedRows, Int64& lastInsertId) +17
  MySql.Data.MySqlClient.CommandResult.ReadNextResult(Boolean isFirst) +62
  MySql.Data.MySqlClient.NativeDriver.SendQuery(Byte[] bytes, Int32 length, Boolean consume) +123
  MySql.Data.MySqlClient.MySqlCommand.GetNextResultSet(MySqlDataReader reader) +320
  MySql.Data.MySqlClient.MySqlCommand.Consume() +13
  MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery() +110
  ASP.Database_aspx.Page_Load(Object sender, EventArgs E) in Database.aspx:20
  System.Web.UI.Control.OnLoad(EventArgs e) +67
  System.Web.UI.Control.LoadRecursive() +35
  System.Web.UI.Page.ProcessRequestMain() +750
Avatar billede nielle Nybegynder
11. juni 2005 - 15:52 #7
Hmmm... Hvis du nu går ind i din MySQL DB og - bare som en test for at komme videre - fjerner markeringen af at Id er NOT NULL. Så burde dit script kunne komme viderer. Se så hvad der så blev sat ind i tabellen; Din streng eller NULL?
Avatar billede idiotbarn Nybegynder
11. juni 2005 - 15:56 #8
Der bliver sat NULL ind...det er ret underlig...kan godt læse fra databasen
Avatar billede nielle Nybegynder
11. juni 2005 - 16:05 #9
Meget mystisk. :^|

Hvordan har du egentligt defineret dit Id felt?
Avatar billede idiotbarn Nybegynder
11. juni 2005 - 16:09 #10
varchar(20) hvis det er det du tænker på?
Avatar billede nielle Nybegynder
11. juni 2005 - 16:13 #11
<%@ Page Language="C#" %>
<%@ assembly name="MySql.Data" %>
<%@ import Namespace="MySql.Data.MySqlClient" %>
<%@ import Namespace="System.Data" %>
<script runat="server">
    // Insert page code here
    public void Page_Load(Object sender, EventArgs E)
    {
        MySqlConnection conn = new MySqlConnection(ConfigurationSettings.AppSettings["connectionstring"]);
        MySqlCommand cmd = new MySqlCommand("INSERT INTO test.TestTabel (Id) VALUES (@Id)", conn);
        cmd.Parameters.Add("@Id", MySqlDbType.VarChar, 20).Value = "asdzxc";

        conn.Open();
        cmd.ExecuteNonQuery();
        conn.Close();
    }
</script>

Jeg tror dog ikke at det gør nogen forskel.
Avatar billede idiotbarn Nybegynder
11. juni 2005 - 16:21 #12
nix...får en NULL ind igen
kan de være inde fra dem der er noget galt?
Avatar billede nielle Nybegynder
11. juni 2005 - 16:28 #13
Det er godt nok mystisk det her - ja det er da muligt at der er noget galt hos din udbyder, men det ved jeg ikke noget om.

Prøv om du kan gennemføre din INSERT uden at bruge parametre:

"INSERT INTO test.TestTabel (Id) VALUES ('asdzxc')"
Avatar billede idiotbarn Nybegynder
11. juni 2005 - 16:34 #14
fantastisk...det virker
Er der nogen grund til at bruge parametre istedet for ovenstående? For så gør jeg det bare på den måde
Avatar billede nielle Nybegynder
11. juni 2005 - 16:40 #15
Hvis du bruger parametre behøver du ikke at skulle tage stilling til sikkerheds-ricici som f.eks. SQL-injection.
Avatar billede idiotbarn Nybegynder
11. juni 2005 - 16:46 #16
ah ok...
Hvor meget er der der? jeg kender den med at erstatte ' med '', men ellers ikke.

Jeg får jo godt nok proppet værdier ind i mine parametre, men de kommer bare ikke videre til databasen...
Avatar billede nielle Nybegynder
11. juni 2005 - 16:53 #17
Der er mange forskellige teknikker, men den med at injekte et '-tegn er jo nok den værste. Hvis du koder mod at imødegå denne, så behøver du ikke at være ret bekymret mere.
Avatar billede idiotbarn Nybegynder
11. juni 2005 - 16:55 #18
ok...gør det bare på denne måde så...men stadig underligt. tak for hjælpen, ligger du et svar?
Avatar billede arne_v Ekspert
11. juni 2005 - 17:07 #19
prøv lige og erstat @id med ?id
Avatar billede idiotbarn Nybegynder
11. juni 2005 - 17:11 #20
hmm...det fungere også? Hvad er forskellen?
Avatar billede nielle Nybegynder
11. juni 2005 - 17:14 #21
Jeg har set '?' notationen for tilfældet Oracle - gættede ikke lige at det måske også skulle bruges for MySQL.

Gad vide hvorfor de gode MySQL udviklere har valgt denne version...
Avatar billede arne_v Ekspert
11. juni 2005 - 17:16 #22
ADO.NET angiver ikke hvad der skal bruges til parameter navne @xx eller :xx eller ?xx.

Der er et endnu bedre spørgsmål: @xx virkede med MySQL i ældre versioner af
driveren - hvorfor har du ændret det så det ikke virker i nyeste version ?
Avatar billede nielle Nybegynder
11. juni 2005 - 17:28 #23
arne_v> Kan man selv angive hvilket tegn man ønsker at bruge?

idiotbarn> Jeg vil klart anbefale at du bruger parameters hvis der er mulighed for det.
Avatar billede arne_v Ekspert
11. juni 2005 - 17:30 #24
den der implementerer driver/provider kan selv vælge
Avatar billede nielle Nybegynder
11. juni 2005 - 17:40 #25
idiotbarn> Hvem vil du have et svar af?
Avatar billede idiotbarn Nybegynder
11. juni 2005 - 17:42 #26
Ok. Det fungere også med "?" i stedet...så det vil jeg gøre. Tak for hjælpen.
Svare du her?
og arne_v, svare du i spørgsmålet om conn. string?
Avatar billede nielle Nybegynder
11. juni 2005 - 17:44 #27
Svar :^)
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester