Avatar billede strafenmacher Nybegynder
12. oktober 2003 - 19:39 Der er 25 kommentarer og
1 løsning

Ændring af data i alle rækker i én kolonne i en database

Jeg har en tabel (Billeder), hvor der er oprettet en kolonne (FilPlacering), som angiver stien på harddisken, hvor alle de filer/billeder der er placeret i denne tabel ligger (eks. C:\\Galleri\Fodboldkamp\Mål.jpg). Denne sti er den samme for alle billeder, men filnavnene er naturligvis forskellige (Mål.jpg er bare én af filerne/billederne i tabellen). Når jeg i min ASP.NET-applikation vil ændre mappenavnet "Fodboldkamp" til et hvilket som helst andet navn (hvilket ikke er noget problem), ønsker jeg samtidigt at ændre dataene i databasen, så "FilPlaceringen" passer til den nye mappe på harddisken.

Nu kommer spørgsmålet:

Hvordan ændrer jeg den lille del af teksten i alle rækkerne til kolonnen "FilPlacering", der i ovenstående eksempel er "Fodbold". Hvis nu den nye mappe hvor billederne er flyttet over i (på harddisken) kaldes "Håndbold", hvordan får jeg så ændret alle dataene i databasen, så det passer til stien til denne nye mappe, og stadig har alle filerne/billednavnene (eks. Mål.jpg samt flere andre)stående til sidst i FilPlaceringen ?
Sagt med andre ord - FilPlaceringen skal nu hedde C:\\Galleri\Håndboldkamp\Mål.jpg (her er "Fodboldkamp" byttet ud med "Håndboldkamp"). Dette skal gælde for alle de filer/billeder der ligger i denne tabel.

Jeg håber det er forståeligt, for det er lidt kompliceret at forklare.
Jeg håber der er én der kan hjælpe !
På forhånd tak.
Avatar billede arne_v Ekspert
12. oktober 2003 - 19:46 #1
SQL Server specifik løsning (inkl. MSDE):

Bare lad din kode eksekvere følgende SQL sætning:

UPDATE tabelnavn SET feltnavn=REPLACE(feltnavn,'Fodboldkamp','Håndbåldkamp');
Avatar billede arne_v Ekspert
12. oktober 2003 - 19:48 #2
Database uafhængig løsning:

hent hver record, hent feltet som string, Replace metoden, gem igen
Avatar billede arne_v Ekspert
12. oktober 2003 - 19:48 #3
OK ?
Avatar billede strafenmacher Nybegynder
12. oktober 2003 - 20:03 #4
UPDATE tabelnavn SET feltnavn=REPLACE(feltnavn,'Fodboldkamp','Håndbåldkamp');

Den vil muligvis være OK, hvis der kun er én række i tabellen som skal ændres, men ikke når der er flere !
Er man så nødt til, at hente hver en række fra databasen én ad gangen, og derefter igen gemme dem med den nye sti én ad gangen ?
Jeg havde håbet på en simpel SQL-kommando, der ville kunne ændre alle rækker på én gang !
Avatar billede strafenmacher Nybegynder
12. oktober 2003 - 20:10 #5
Tilføjelse til sidste melding:

UPDATE tabelnavn SET feltnavn=REPLACE(feltnavn,'Fodboldkamp','Håndbåldkamp');

"feltnavn" er jo forskelligt fra række til række, da hver fil/billede selvfølelig har et unikt navn. Derfor mener jeg, at den ikke vil virke, når der er flere rækker. Jeg formoder "feltnavn" skal være ens i alle rækker, for at denne SQL-kommando kan fungere ?
Avatar billede arne_v Ekspert
12. oktober 2003 - 20:16 #6
Øh.

feltnavn er kolonne navnet.

Og en UPDATE uden WHERE udføres på alle rækker.

Og REPLACE laver en tekst substitition i værdierne.

Hvilket var sådan jeg forstod opgave.
Avatar billede arne_v Ekspert
12. oktober 2003 - 20:16 #7
Snakker jeg sort ?
Avatar billede strafenmacher Nybegynder
12. oktober 2003 - 20:19 #8
Det tror jeg ikke. Jeg er sgu bange for det er mig der har talt sort. Det må du undskylde. Jeg checker den lige ud.
Tak for hjælpen.
Avatar billede arne_v Ekspert
12. oktober 2003 - 20:22 #9
Skriv igen hvis det driller.

Så finder vi ud af det.
Avatar billede strafenmacher Nybegynder
12. oktober 2003 - 20:38 #10
Det driller !
Første argument er ikke korrekt (det er den kedelige tilbagemelding man får, når man kører applikationen).
Kan det være fordi, at teksten/mappenavnet "Fodboldkamp" ligger midt inde i stinavnet ?
Jeg ved snart ikke. Jeg synes jeg har prøvet alt (næsten).
Avatar billede arne_v Ekspert
12. oktober 2003 - 20:40 #11
Du har erstattet feltnavn med det rigtige feltnavn ?
Avatar billede arne_v Ekspert
12. oktober 2003 - 20:41 #12
Måtte jeg lige se et par linie kode omkring stedet som den præcise
fejl besked ?
Avatar billede strafenmacher Nybegynder
12. oktober 2003 - 20:41 #13
Ja da.
Avatar billede strafenmacher Nybegynder
12. oktober 2003 - 20:55 #14
Her er lidt af koden, som naturligvis ikke kører som den står her !
Men du kan da se SQL-kommandoen, og måske ud fra denne se hvad problemet måtte være.


public string ændreKatalogNavn(string xGammeltKatalogNavn, string xNytKatalogNavn)
{

string gammeltKatalogNavn = xGammeltKatalogNavn;
string nytKatalogNavn = xNytKatalogNavn;
       
string sqlKommando2 = "UPDATE Billeder SET FilPlacering = REPLACE(FilPlacering, '" + gammeltKatalogNavn + "', '" + nytKatalogNavn + "')";

DataSet datasetObjekt2 = new DataSet();
SqlDataAdapter adapterObjekt2 = new SqlDataAdapter(sqlKommando2, forbindelsesObjekt);
adapterObjekt2.Fill(datasetObjekt2, "Billeder");
forbindelsesObjekt.Close();

return ("You have changed the catalogue title into " + "<b><i>" + nytKatalogNavn + "</i></b>");
}
Avatar billede arne_v Ekspert
12. oktober 2003 - 20:59 #15
Jeg tror at du kalder forkert.

Jeg prøver lige at lave et eksempel.
Avatar billede arne_v Ekspert
12. oktober 2003 - 21:01 #16
Her er et eksempel:

using System;
using System.Data;
using System.Data.SqlClient;

class MainClass
{
    public static void Main(string[] args)
    {
        SqlConnection con = new SqlConnection("server=ARNEPC2\\ARNEPC2RUN;Integrated Security=SSPI;database=TestMSDE");
        con.Open();
        SqlCommand cre = new SqlCommand("CREATE TABLE MyTable (MyField VARCHAR(50))", con);
        cre.ExecuteNonQuery();
        SqlCommand ins = new SqlCommand("INSERT INTO MyTable VALUES('abc_123_def')", con);
        ins.ExecuteNonQuery();
        SqlCommand upd = new SqlCommand("UPDATE MyTable SET MyField = REPLACE(MyField, '123', 'entotre')", con);
        upd.ExecuteNonQuery();
        SqlCommand sel = new SqlCommand("SELECT * FROM MyTable", con);
        SqlDataReader rdr = sel.ExecuteReader();
        while(rdr.Read()) {
            Console.WriteLine(rdr[0]);
        }
        rdr.Close();
        SqlCommand drp = new SqlCommand("DROP TABLE MyTable", con);
        drp.ExecuteNonQuery();
        con.Close();
    }
}
Avatar billede arne_v Ekspert
12. oktober 2003 - 21:03 #17
Prøv at bruge SqlCommand og ExecuteNonQuery til at lave UPDATE med.
Avatar billede arne_v Ekspert
12. oktober 2003 - 21:05 #18
Svarende til linierne:

SqlCommand upd = new SqlCommand("UPDATE MyTable SET MyField = REPLACE(MyField, '123', 'entotre')", con);
        upd.ExecuteNonQuery();
Avatar billede strafenmacher Nybegynder
12. oktober 2003 - 21:26 #19
Jeg får nøjagtig den samme tilbagemelding, når jeg kører din kode.
Beskeden ser således ud:

(Argument data type text is invalid for argument 1 of replace function).
Avatar billede arne_v Ekspert
12. oktober 2003 - 21:30 #20
Mystisk - ovenståend ekod er nemlig testet op mod min MSDE.

Hvad datatype er feltet FilPlacering ?
Avatar billede strafenmacher Nybegynder
12. oktober 2003 - 21:32 #21
Datatypen Er: text
Avatar billede arne_v Ekspert
12. oktober 2003 - 21:40 #22
Det er fejlen.

Jeg bruger VARCHAR.

Hvis jeg ændrer til TEXT får jeg også:

Unhandled Exception: System.Data.SqlClient.SqlException: Argument data type text
is invalid for argument 1 of replace function.
  at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()

Hvorfor bruger du TEXT til det fekt ?

VARCHAR håndterer op til 8000 tegn (TEXT op til 2 GB).

VARCHAR burde være rigeligt til fil-stier (og af froskellige tekniske
årsager performer VARCHAR bedre end TEXT).
Avatar billede arne_v Ekspert
12. oktober 2003 - 21:42 #23
Men det kan løses med en CAST !

Se følgende:

using System;
using System.Data;
using System.Data.SqlClient;

class MainClass
{
    public static void Main(string[] args)
    {
        SqlConnection con = new SqlConnection("server=ARNEPC2\\ARNEPC2RUN;Integrated Security=SSPI;database=TestMSDE");
        con.Open();
        //SqlCommand cre = new SqlCommand("CREATE TABLE MyTable (MyField VARCHAR(50))", con);
        SqlCommand cre = new SqlCommand("CREATE TABLE MyTable (MyField TEXT)", con);
        cre.ExecuteNonQuery();
        SqlCommand ins = new SqlCommand("INSERT INTO MyTable VALUES('abc_123_def')", con);
        ins.ExecuteNonQuery();
        SqlCommand upd = new SqlCommand("UPDATE MyTable SET MyField = REPLACE(CAST(MyField AS VARCHAR(255)), '123', 'entotre')", con);
        //SqlCommand upd = new SqlCommand("UPDATE MyTable SET MyField = REPLACE(MyField, '123', 'entotre')", con);
        upd.ExecuteNonQuery();
        SqlCommand sel = new SqlCommand("SELECT * FROM MyTable", con);
        SqlDataReader rdr = sel.ExecuteReader();
        while(rdr.Read()) {
            Console.WriteLine(rdr[0]);
        }
        rdr.Close();
        SqlCommand drp = new SqlCommand("DROP TABLE MyTable", con);
        drp.ExecuteNonQuery();
        con.Close();
    }
}
Avatar billede arne_v Ekspert
12. oktober 2003 - 21:43 #24
Så prøv med:

... = REPLACE(CAST(FilPlacering AS VARCHAR(255)), ...
Avatar billede strafenmacher Nybegynder
12. oktober 2003 - 21:44 #25
Jeg ved ikke hvorfor jeg lige valgte "text", men du har ret, -der er ikke grund til ressourcespild.
Jeg prøver det lige !
Avatar billede strafenmacher Nybegynder
12. oktober 2003 - 21:51 #26
Det virker.
Du er sgu for hård !
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
Kurser inden for grundlæggende programmering

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