Avatar billede trekkies Juniormester
16. juli 2009 - 14:15 Der er 23 kommentarer og
1 løsning

Insert data i database

Jeg er ved at lave et program, men er løbet ind i et stort problem.
Jeg kan godt forbinde til databasen, men ved ikke hvordan jeg kommer videre.

Her er min kode:

private void btsend_Click(object sender, System.EventArgs e)
    {
    System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection();
    conn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;" +
    @"Data source= C:\Inetpub\wwwroot\" +
    @"xxx\bin\Debug\xxx\xxx.mdb";
    try
    {
    conn.Open();
    MessageBox.Show("Connection lykkes");            }
        catch (Exception ex)
        {
            MessageBox.Show("Connection fejlede");
        }
        finally
        {
            conn.Close();
        }
    }


Håber at der er nogle som kan hjælpe mig.
Avatar billede Slettet bruger
16. juli 2009 - 14:33 #1
Prøv med noget ala:

IDbCommand command = null;
command = conn.CreateCommand();

command.CommandText = "INSERT INTO Table_Name(kolonne1, kolonne2, kollone3) VALUES(Værdi1, Værdi2, Værdi)";

command.ExecuteNonQuery();
Avatar billede Slettet bruger
16. juli 2009 - 14:36 #2
Hmmm, du skriver jo ikke noget med at du vil indsætte data i databasen.

Men det er samme princip ved udtræk af data. Noget i retning af:

IDbCommand command = null;
command = conn.CreateCommand();

command.CommandText = "SELECT * FROM Table_Name WHERE Værdi1 = '" + variabel1 + "'";

Og så kan du fx. benytte en DataReader, som:

IDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection);
        while (reader.Read())
        {
            intId = (int)reader["Id"];
            strDate = (string)reader["Date"].ToString().Substring(0, 10);
;
        }
        reader.Close();
Avatar billede Slettet bruger
16. juli 2009 - 14:38 #3
Og så kan jeg se at du faktisk skriver at du VIL indsætte data i overskriften. Så det er vidst tid for mig at gå hjem fra arbejde nu. Det tyder ikke på at jeg kan yde noget produktivt lige nu :-)
Avatar billede trekkies Juniormester
16. juli 2009 - 14:50 #4
Hvis jeg bruger koden som du skrev 16. juli 2009 kl. 14:33:48
så kommer den frem og siger "Connection fejlede", men kode ser sådan ud:
IDbCommand command = null;
command = conn.CreateCommand();
command.CommandText = "INSERT INTO varer(txtname) VALUES(txtname)";
command.ExecuteNonQuery();

Hvadk kan fejlen være?
Avatar billede sandrasmurf Nybegynder
16. juli 2009 - 15:02 #5
Du kunne jo prøve at udvide din try-catch uden om koden og se hvad den siger. Der kan jo ske mange "uheld" udover at "Connection fejlede".

try
{
...
}
catch (Exception ex)
{
  Console.WriteLine(ex.Message);
  Console.WriteLine(ex.StackTrace);
  Console.WriteLine(ex.InnerException.Message);
}

Et bud kunne være, at du skal skrive '' uden om din value string command.CommandText = "INSERT INTO varer(txtname) VALUES('txtname')";
Avatar billede sandrasmurf Nybegynder
16. juli 2009 - 15:05 #6
ET eksempel fra w3schools.com på en gyldig Insert Into statement er

INSERT INTO Persons
VALUES (4,'Nilsen', 'Johan', 'Bakken 2', 'Stavanger')

Så der skal enkelt pinds gåseøjne uden om strings.
Avatar billede trekkies Juniormester
16. juli 2009 - 15:26 #7
Nu er det nok mig som er lidt træt, men er faldet helt af.

Kan I linke til et sted hvor man har et eksemple?

Skal være til C# winform
Avatar billede sandrasmurf Nybegynder
16. juli 2009 - 15:45 #8
Må nok hellere komme Arne i forkøbet og anbefale dig at bruge parameters.

Forudsat at din tabel i Access hedder "varer" og, at din VarChar kolonne hedder txtname, så kan du bruge følgende tilgang.

string rowStringToAdd = "MyGoods";

OleDbConnection conn = new OleDbConnection();
conn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;" +
    @"Data source= C:\Inetpub\wwwroot\" +
    @"xxx\bin\Debug\xxx\xxx.mdb";

try
{
  conn.Open();

  OleDbCommand insertCommand = conn.CreateCommand();
  insertCommand.CommandText = "INSERT INTO varer (txtname) VALUES(?)";

  insertCommand.Parameters.Add("@txt", OleDbType.VarChar);
  insertCommand.Parameters["@txt"].Value = rowStringToAdd;

  insertCommand.ExecuteNonQuery();

catch (Exception ex)
{
  Console.WriteLine(ex.Message);
  Console.WriteLine(ex.StackTrace);
}
finally
{
  conn.Close();
}

Ovenstående er ikke testet, men frit fra hoften.
Avatar billede sandrasmurf Nybegynder
16. juli 2009 - 15:47 #9
Ovenstående tilføjer en ny række i varer-tabellen, hvor kolonnen txtname er sat til værdien "MyGoods".
Avatar billede trekkies Juniormester
16. juli 2009 - 16:02 #10
Hvis jeg bruger din kode, og retter den til, så sker der intet, ingen fejl meddelse eller noget, hvad kan fejlen være?
Avatar billede trekkies Juniormester
16. juli 2009 - 16:08 #11
Ups, jeg glemte at se i databasen, nu skriver den "MyGoods" i databasen.
Skal bare rettet det hele lidt til.
Avatar billede sandrasmurf Nybegynder
16. juli 2009 - 16:15 #12
Du er blevet for vant til fejl :-)

Men så har du vel nået målet
Avatar billede trekkies Juniormester
16. juli 2009 - 17:15 #13
Hvis jeg vil indsætte flere ting i databasen, så kommer den med fejl.
Min kode ser sådan ud nu:
string rowStringToAdd = this.txtname.Text;
string rowStringToAdd1 = this.txtfirma.Text;

OleDbConnection conn = new OleDbConnection();
conn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;" +
    @"Data source= C:\Inetpub\wwwroot\" +
    @"xxx\bin\Debug\xxx\xxx.mdb";

try
{
  conn.Open();

OleDbCommand insertCommand = conn.CreateCommand();
insertCommand.CommandText = "INSERT INTO varer (txtname, txtfirma) VALUES(txtname, txtfirma)";

insertCommand.Parameters.Add("@txt", OleDbType.VarChar);
insertCommand.Parameters["@txt"].Value = rowStringToAdd;
insertCommand.Parameters["@txt"].Value = rowStringToAdd1;

insertCommand.ExecuteNonQuery();

catch (Exception ex)
{
MessageBox.Show(ex.Message);
MessageBox.Show(ex.StackTrace);
}
finally
{
  conn.Close();
}

Hvad gør jeg forkert?
Hvis det kun er med en ting, så virker det fint.
Avatar billede sandrasmurf Nybegynder
17. juli 2009 - 00:16 #14
En nem udvidelse kunne være at gemme dine strings i en liste og foreache over query'en:

Bemærk nedenstående er ikke testet i Visual Studio
--------------------------------------------------

List<string> stringsToAdd = new List<string();
stringsToAdd(this.txtname.Text);
stringsToAdd(this.txtfirma.Text);
// add more here if you have to

OleDbConnection conn = new OleDbConnection();
conn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;" +
    @"Data source= C:\Inetpub\wwwroot\" +
    @"xxx\bin\Debug\xxx\xxx.mdb";

try
{
  conn.Open();

OleDbCommand insertCommand = conn.CreateCommand();
insertCommand.CommandText = "INSERT INTO varer (txtname) VALUES (?)";

insertCommand.Parameters.Add("@txt", OleDbType.VarChar);

foreach(string item in stringsToAdd)
{
  insertCommand.Parameters["@txt"].Value = item;
  insertCommand.ExecuteNonQuery();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
MessageBox.Show(ex.StackTrace);
}
finally
{
  conn.Close();
}

------------------------------------------

Kan se, at du også havde ændret SQL kaldet fra min tidligere post. Princippet i ovenstående kode er, at du kalder kode til at indsætte 1 række flere gange, ved at lave en foreach løkke.

Hvis du havde 2 kolonner i databasen ved navn txtname og txtfirma, så skulle din kode se nogenlunde ud som følger. Bemærk at vi nu har 2 spørgsmålstegn i sql values paranteserne og derfor skal der addes 2 parameters og 2 values inden query'en udføres.

OleDbCommand insertCommand = conn.CreateCommand();
insertCommand.CommandText = "INSERT INTO varer (txtname, txtfirma) VALUES (?, ?)";

insertCommand.Parameters.Add("@txt", OleDbType.VarChar);
insertCommand.Parameters.Add("@firm", OleDbType.VarChar);

insertCommand.Parameters["@txt"].Value = "SomeString";
insertCommand.Parameters["@firm"].Value = "AnotherString"
insertCommand.ExecuteNonQuery();
}

Håber det giver mening
Avatar billede sandrasmurf Nybegynder
17. juli 2009 - 00:18 #15
Skal naturligvis være

List<string> stringsToAdd = new List<string();
stringsToAdd.Add(this.txtname.Text);
stringsToAdd.Add(this.txtfirma.Text);

Skal nok have lært at bruge preview funktionen
Avatar billede trekkies Juniormester
17. juli 2009 - 15:33 #16
Jeg er på arbejde lige nu, og er ikke ved en computer den næste uge, men kigger på det senere :)

Der går nok ca. 2-3 uger...
Avatar billede trekkies Juniormester
07. august 2009 - 22:53 #17
Jeg har kigget lidt på din kode i dag.

Men hvad mener du med:
<string>
i denne linie:
List<string> stringsToAdd = new List<string>();

???
Avatar billede arne_v Ekspert
07. august 2009 - 23:02 #18
C# 2.0 generics

List<string> er en List som indeholder objekter af type string
Avatar billede sandrasmurf Nybegynder
08. august 2009 - 10:45 #19
Hvis du vil indsætte flere linier i databasen med kun 1 kald, så er det smartest at opsamle alle disse nye værdier i en liste. For så kan du genbruge forbindelsen til databasen uden at skulle åbne/lukke adgangen for hver ny linie.

I stedet for List<string> kunne du også have brugt ArrayList, hvis du er mere vant til at bruge den. txtname og txtfirma lyder som string felter.

Jeg bliver lidt i tvivl, når jeg nærlæser din tidligere kommentar. Hvilke af følgende vil du gerne opnå:
1) tilføje mange linier til en database, hvor kun 1 kolonne værdi skal sættes,
2) tilføje 1 linie, hvor flere kolonners værdi skal sættes.
3) en kombination af de 2: mange linier med mange værdier.
Avatar billede trekkies Juniormester
08. august 2009 - 12:27 #20
Jeg har Visual Studio .NET 2003.

Jeg vil gerne indsætte 1 linie med flere kolonners værdi, hvordan gør det bedst, da Visual Studio ikke kender <string>.
Avatar billede sandrasmurf Nybegynder
09. august 2009 - 14:59 #21
SÅ synes jeg at du skulle prøve følgende(står også i svar #14):

OleDbConnection conn = new OleDbConnection();
conn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;" +
    @"Data source= C:\Inetpub\wwwroot\" +
    @"xxx\bin\Debug\xxx\xxx.mdb";

try
{
  conn.Open();

  OleDbCommand insertCommand = conn.CreateCommand();
  insertCommand.CommandText = "INSERT INTO varer (txtname, txtfirma) VALUES (?, ?)";

  insertCommand.Parameters.Add("@txt", OleDbType.VarChar);
  insertCommand.Parameters.Add("@firm", OleDbType.VarChar);

  insertCommand.Parameters["@txt"].Value = this.txtname.Text;
  insertCommand.Parameters["@firm"].Value = this.txtfirma.Text;
  insertCommand.ExecuteNonQuery();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
MessageBox.Show(ex.StackTrace);
}
finally
{
  conn.Close();
}
Avatar billede trekkies Juniormester
13. august 2009 - 13:38 #22
Nu virker det, mange tak.
Har kun et problem, men det kigger jeg selv på.
Læg venligst et svar :)
Avatar billede sandrasmurf Nybegynder
13. august 2009 - 23:26 #23
Svar
Avatar billede trekkies Juniormester
22. august 2009 - 17:02 #24
Mange tak for hjælpen.
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