Avatar billede keenkbh Nybegynder
29. august 2006 - 16:46 Der er 45 kommentarer og
1 løsning

Opret forbindelse til access db på webhotel

hej Eksperter.

Jeg vil gerne høre om det er muligt at oprette forbindelse til en access database som ligger på et webhotel, via en C# win-applikation, som bliver kørt lokalt på en pc.

Jeg har set andet steds på eksperten, at det er muligt at tilgå den via en ASP-side, men ved ikke om det også kan bruges til at opdatere, slette og indsætte data i tabellerne.
Avatar billede thesurfer Nybegynder
29. august 2006 - 16:52 #1
Det kan man (så vidt jeg ved) ikke..

ASP filen ligger på samme server/computer som databasen, og kan derfor godt opdatere/oprette/slette data i tabellerne.

ASP er ikke det samme som ASP.NET.
Avatar billede thesurfer Nybegynder
29. august 2006 - 16:53 #2
..med andre ord:
Access databasen kan kun tilgåes fra samme server.. imodsætning til en MySQL database..
Avatar billede keenkbh Nybegynder
29. august 2006 - 17:16 #3
Det spørgsmål jeg kiggede på var godt nok også med en SQL-server, men der så det ud til, at man kunne benytte ASP'en.

Du kan se her: http://www.eksperten.dk/spm/542944

Det kan selvfølgelig være at jeg har misforstået det... ;)
Avatar billede arne_v Ekspert
29. august 2006 - 17:25 #4
win app ----(HTTP)---- ASP side ----(ADO)---- Jet database (Access MDB)
win app ----(HTTP)---- ASP.NET side ----(ADO.NET OleDb)---- Jet database (Access MDB)
win app ----(SOAP/HTTP)---- ASP.NET web service ----(ADO.NET OleDb)---- Jet database (Access MDB)

er vist de oplagte muligheder

med de foerste to skal du selv angive form felter og lave scripts

med den sidste kan du programmere med et API og lade .NET haandtere
det tekniske
Avatar billede keenkbh Nybegynder
29. august 2006 - 17:46 #5
Så vidt jeg lige har kunnet finde ud af, tager cliche ikke ASP.NET sider, og jeg kan da noget af good old ASP, så det vil jeg tro er den bedste løsning lige i det her tilfælde, men det kan selvfølgelig godt være jeg tager fejl.
Avatar billede thesurfer Nybegynder
29. august 2006 - 17:54 #6
Hvis du allerede kan ASP, vil jeg anbefale en password-beskyttet side, som du placerer på din server.

Derefter kan du kalde siden, med forskellige argumenter.

Eksempel:
- Opret ny kunde med navnet "Hans":
sys.asp?mode=opret&navn=hans
-> Ny bruger oprettes

- Opdater/ændrer navnet på "Hans" til "Ole":
sys.asp?mode=opdater&id=4&nyt_navn=Ole
-> post med id 4, før ændret navn til "Ole"

- Slet kunde med id 4:
sys.asp?mode=slet&id=4

osv..
Avatar billede thesurfer Nybegynder
29. august 2006 - 17:54 #7
Rettelse/tilføjelser:

"før" = får

- Slet kunde med id 4:
sys.asp?mode=slet&id=4
-> post med id 4 bliver slettet
Avatar billede thesurfer Nybegynder
29. august 2006 - 17:55 #8
Hvordan dit system i ASP filen bliver, er op til dig.. bare noget du selv kan finde ud af..
Avatar billede arne_v Ekspert
29. august 2006 - 17:57 #9
lyder som om det er den eneste loesning ...
Avatar billede keenkbh Nybegynder
29. august 2006 - 17:58 #10
Det er nu heller ikke ASP-siden jeg er mest bekymret for, men mere C#-delen... :) Det hele er stadig lidt nyt, og jeg står selvfølgelig og skal til at bruge det...
Avatar billede thesurfer Nybegynder
29. august 2006 - 18:05 #11
arne_v ved muligvis hvordan man laver posts i C#..
Det er sådan set det du skal bruge.. og så lige få svaret tilbage.. f.eks. hvis du skal have id tilbage til dit program..

Dvs: Send til asp + aflæse svar fra server/asp script
Avatar billede arne_v Ekspert
29. august 2006 - 18:40 #12
(Http)WebRequest klassen kan lave POST requests
Avatar billede arne_v Ekspert
29. august 2006 - 18:45 #13
noget a la:

        HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://arne/htbin/tell2");
        req.Method = "POST";
        req.ContentType = "application/x-www-form-urlencoded";
        StreamWriter post = new StreamWriter(req.GetRequestStream());
        post.Write("field1=value1&field2=value2");
        post.Close();
        HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
        StreamReader sr = new StreamReader(resp.GetResponseStream());
        string html = sr.ReadToEnd();
        sr.Close();
        resp.Close();
Avatar billede keenkbh Nybegynder
29. august 2006 - 18:59 #14
det vil jeg lige rode lidt med... Vender tilbage hvis jeg slet ikke kan håndtere det... :)

I mellemtiden kan I begge smide et svar...
Avatar billede thesurfer Nybegynder
29. august 2006 - 19:08 #15
Det er nok arne_v der kommer til at lave alt arbejdet.. han får bare pointsne.. :-)
Avatar billede arne_v Ekspert
30. august 2006 - 03:00 #16
svar

jeg synes at vi skal dele
Avatar billede thesurfer Nybegynder
30. august 2006 - 09:20 #17
Nah.. det er helt iorden med mig.. :-)
Avatar billede keenkbh Nybegynder
31. august 2006 - 11:51 #18
Nu har jeg rodet med det, og jeg sidder ærlig talt lidt fast, så Arne, kan jeg overtale dig til at komme med et lidt mere sammenhængende eksempel angående WebRequest..?
Avatar billede arne_v Ekspert
01. september 2006 - 15:16 #19
koden er saadan set komplet

den submitter til en form med 2 felter ved navn field1 og field2 vaerdierne
value1 og value2 (sikke ne fantasi jeg har !)

den form kan saa gemme de 2 vaerdier i databasen

eller lave en query og returnere data til programmet
Avatar billede keenkbh Nybegynder
01. september 2006 - 15:32 #20
okay, så hvis vi siger, at jeg har en listbox, hvor jeg vælger forskellige ting, og jeg så trykker på en knap(f.eks. accepter), og jeg skal sende nogle værdier som QueryString() til ASP, kan jeg bare gøre det her:

HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://domæne.dk/mappe/fil.asp?mode=accepter&vaerdi=1");

Og hvis jeg har beskyttet den pågældende ASP-side med et brugernavn og kodeord, kan de blive sendt via:

post.Write("brugernavnsfelt=brugernavn&kodeordsfelt=kodeord");
Avatar billede arne_v Ekspert
01. september 2006 - 18:39 #21
jeg tror at du skal vaere konsekvent og enten sende alt over i URL eller
alt over i POST data ("form felter")
Avatar billede arne_v Ekspert
01. september 2006 - 19:07 #22
Jeg kan lave et C# eksempel i weekendden.

Men kan du leve med et Java eksempel i mellemtiden ?
Avatar billede arne_v Ekspert
01. september 2006 - 19:12 #23
private String select() {
        StringBuffer res = new StringBuffer("");
        try {
            URL url = new URL("http://localhost/select.asp");
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            con.setRequestMethod("GET");
            con.connect();
            if (con.getResponseCode() == HttpURLConnection.HTTP_OK) {
                BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream()));
                String line;
                while ( (line = br.readLine()) != null) {
                    res.append(line);
                    res.append("\r\n");
                }
                con.disconnect();
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        return res.toString();
    }
    private void insert(String f1, String f2) {
        try {
            URL url = new URL("http://localhost/insert.asp");
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            con.setRequestMethod("POST");
            String info = "F1=" + f1 + "&F2=" + f2;
            con.setDoOutput(true);
            con.getOutputStream().write(info.getBytes());
            con.connect();
            if (con.getResponseCode() != HttpURLConnection.HTTP_OK) {
                System.err.println("POST failed");
            }
            con.disconnect();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
Avatar billede arne_v Ekspert
01. september 2006 - 19:17 #24
<%
Set con = Server.CreateObject("ADODB.Connection")
con.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Database\MSAccess\Test.mdb;User Id=admin;Password=;"
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open "SELECT * FROM T1",con
Do While Not rs.EOF
%>
<%=rs("F1")%> <%=rs("F2")%><br>
<%
rs.MoveNext
Loop
Set rs = Nothing
Set con = Nothing
%>

og

<%
Set con = Server.CreateObject("ADODB.Connection")
con.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Database\MSAccess\Test.mdb;User Id=admin;Password=;"
con.Execute "INSERT INTO T1(F1,F2) VALUES(" & Request.Form("F1") & ",'" & Request.Form("F2") & "')"
Set con = Nothing
%>
Avatar billede keenkbh Nybegynder
01. september 2006 - 19:31 #25
Det er godt nok noget tid siden jeg har beskæftiget mig med JAVA, men så er det jo en god måde at genopfriske det på... ;-)

Hvis det ikke er for meget at spørge om, kan du så i C# eksemplet vise hvordan man lægger det man har fået fra SQL'en på ASP-siden ned i en listbox i applikationen?
Avatar billede arne_v Ekspert
01. september 2006 - 20:08 #26
jeg laver et C# eksempel med en ListBox i weekenden
Avatar billede thesurfer Nybegynder
01. september 2006 - 22:59 #27
Noget der ligner lidt (ASP <> ASP): http://www.eksperten.dk/spm/729151#rid6408513
Avatar billede arne_v Ekspert
02. september 2006 - 03:09 #28
lidt hurtigt sammenbixet
Avatar billede arne_v Ekspert
02. september 2006 - 03:09 #29
<%
Response.ContentType = "text/plain"
Set con = Server.CreateObject("ADODB.Connection")
con.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Databases\MSAccess\Test.mdb;User Id=admin;Password=;"
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open "SELECT * FROM T1 WHERE f1 <= " & Request("max"),con
Do While Not rs.EOF
  Response.Write rs("F1") & " " & rs("F2") & vbCrLf
  rs.MoveNext
Loop
Set rs = Nothing
Set con = Nothing
%>
Avatar billede arne_v Ekspert
02. september 2006 - 03:09 #30
using System;
using System.Drawing;
using System.Windows.Forms;
using System.IO;
using System.Net;

namespace E
{
    public class MainForm : Form
    {
        private Button button1;
        private ListBox listBox1;
        public MainForm()
        {
            InitializeComponent();
        }
       
        [STAThread]
        public static void Main(string[] args)
        {
            Application.Run(new MainForm());
        }
       
        private void InitializeComponent() {
            int maxval = 3;
            listBox1 = new ListBox();
            button1 = new Button();
            SuspendLayout();
            listBox1.Location = new Point(50, 50);
            listBox1.Size = new Size(100, 100);
            HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://localhost/select.asp");
            req.Method = "POST";
            req.ContentType = "application/x-www-form-urlencoded";
            StreamWriter post = new StreamWriter(req.GetRequestStream());
            post.Write("max=" + maxval);
            post.Close();
            HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
            StreamReader sr = new StreamReader(resp.GetResponseStream());
            string line;
            while((line = sr.ReadLine()) != null)
            {
                string[] parts = line.Split(" ".ToCharArray());
                listBox1.Items.Add(parts[1]);
            }
            sr.Close();
            resp.Close();
            button1.Location = new Point(50, 200);
            button1.Size = new Size(100, 20);
            button1.Text = "OK";
            button1.Click += new EventHandler(Button1Click);
            ClientSize = new Size(200, 300);
            Controls.Add(button1);
            Controls.Add(listBox1);
            Text = "Demo";
            ResumeLayout(false);
        }
        private void Button1Click(object sender, System.EventArgs e)
        {
            MessageBox.Show(listBox1.SelectedItem.ToString());
        }
    }
}
Avatar billede keenkbh Nybegynder
03. september 2006 - 14:50 #31
HJÆLP!

Nu har jeg siddet og rodet lidt med koden, og den vil ikke helt som jeg vil...

her er min kode:

C#

noget kode...

private const int firmaId = 1;

private void OpdaterASP(String test)
        {
            HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://domæne.dk/Testing-Area/transport/klient.asp");
            req.Method = "POST";
            req.ContentType = "application/x-www-form-urlencoded";
            StreamWriter post = new StreamWriter(req.GetRequestStream());
            post.Write("firmaId=" + firmaId + "mode=" + test);
            post.Close();
            HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
            StreamReader sr = new StreamReader(resp.GetResponseStream());
            string line;
            while ((line = sr.ReadLine()) != null)
            {
                string[] parts = line.Split(" ".ToCharArray());
                listBox1.Items.Add(parts[1]);
            }
            sr.Close();
            resp.Close();
        }

        private void opdater_Click(object sender, EventArgs e)
        {
            OpdaterASP("opdater");
        }

ASP:

<%@LANGUAGE="VBSCRIPT" CODEPAGE="1252"%>

<%
    'opret forbindelse til database
    Set con = Server.CreateObject("ADODB.Connection")
    DSN = "DRIVER={Microsoft Access Driver (*.mdb)}; "
    DSN = DSN & "DBQ=" & Server.MapPath("db/transport.mdb")
    con.Open DSN

    Response.ContentType = "text/plain"

        'Denne IF-sætning håndterer alle forespørgsler til db fra klientprogrammet.
        IF Request.Form("mode") = "opdater" THEN
       
            strSQL = "SELECT * FROM ORDRER WHERE FirmaId=" & cInt(Request.Form("firmaId")
            SET ordrer = con.Execute(strSQL)
           
            DO WHILE NOT ordrer.EOF
                Response.Write ordrer("FraNavn") & " " & ordrer("TilNavn") & vbCrlf
                ordrer.MoveNext
            LOOP
       
        ELSE
           
            Response.Write "Intet at gøre her"
           
        END IF

    'lukker forbindelsen til databasen
    con.Close
    Set con = Nothing
%>

Jeg ved ikke helt hvor det er, at den fejler...
Avatar billede keenkbh Nybegynder
03. september 2006 - 23:12 #32
Lige meget...

Jeg har fundet ud af det...
Avatar billede keenkbh Nybegynder
04. september 2006 - 15:41 #33
når jeg nu henter tingene fra min db... Hvis der er records med (æ ø å) i, bliver disse ikke vist i applikationen. Hvordan kan jeg få den til det? synes ikke jeg lige har kunnet finde en tilfredsstillende løsning her på eksperten...
Avatar billede arne_v Ekspert
04. september 2006 - 16:03 #34
StreamReader sr = new StreamReader(resp.GetResponseStream(), Encoding.Default);

eller

StreamReader sr = new StreamReader(resp.GetResponseStream(), Encoding.UTF8);
Avatar billede keenkbh Nybegynder
04. september 2006 - 16:19 #35
ja, jeg fandt en eller anden artikel eller indlæg som du havde på gatogo eller sådan noget...

Nu har jeg så et andet problem... (Jeg er vist et værre problembarn)

Kan jeg ikke tildele hver Item(række i listBox'en) en værdi som passer til det ID, som det har i databasen, og så få vist nogle andre værdier...

f.eks. parts[0] indeholder ID, parts[1] indeholder et navn, i listbox bliver der vist parts[1], men hvis man tager værdien er det ID man får fat i...

er det muligt? jeg har prøvet med ValueMember, men kunne ikke få det til at virke...
Avatar billede arne_v Ekspert
04. september 2006 - 16:38 #36
hvis du laver en klasse med 2 felter id og val, læser data fra databasen ind
i en ArrayList af disse kna du vise val og hente id
Avatar billede keenkbh Nybegynder
04. september 2006 - 17:39 #37
kan jeg ikke gøre det direkte i det eksempel, som du gav tidligere i tråden?
Avatar billede keenkbh Nybegynder
04. september 2006 - 20:53 #38
er det her helt forkert:

while ((line = sr.ReadLine()) != null)
{
  string[] parts = line.Split(" ".ToCharArray());
  //listBox1.Items.Add(parts[1] + ", " + parts[2]);

  liste.Add(new Lister(parts[0],parts[1],parts[2]));
  listBox1.DataSource = liste;
  listBox1.DisplayMember = "fraNavn";
  listBox1.ValueMember = "ordrenr";
}
sr.Close();
resp.Close();


class Lister:

public class Lister
{
  private string ordrenr;
  private string fraNavn;
  private string tilNavn;

  public Lister(string ordrenr, string fraNavn, string tilNavn)
  {
    this.ordrenr = ordrenr;
    this.fraNavn = fraNavn;
    this.tilNavn = tilNavn;
  }
}

Den vil ikke helt acceptere det...
Avatar billede arne_v Ekspert
04. september 2006 - 20:56 #39
det ser meget rigtigt ud

jeg tror kun at du mangler at tilføje public properties for dine fields
Avatar billede keenkbh Nybegynder
04. september 2006 - 20:57 #40
det skal lige nævnes, at arrayList liste er defineret højere oppe i koden...
Avatar billede keenkbh Nybegynder
04. september 2006 - 21:05 #41
public properties er sådan noget lignende ikke:

public ordrenr
{
  get
  {
    return ordrenr;
  }
}

hvis jeg skriver dem sådan, siger den fejl... at 'ordrenr' allerede er defineret... eller er jeg alt for avanceret nu... skal jeg "bare" ændre private til public?
Avatar billede arne_v Ekspert
04. september 2006 - 21:08 #42
public Ordrenr
{
  get
  {
    return ordrenr;
  }
}
Avatar billede arne_v Ekspert
04. september 2006 - 21:09 #43
listBox1.ValueMember = "Ordrenr";
Avatar billede keenkbh Nybegynder
04. september 2006 - 21:18 #44
nu virker det... tak endnu engang...
Avatar billede keenkbh Nybegynder
05. september 2006 - 14:07 #45
Nu skal jeg så acceptere en given ordre, og sende status til ASP-siden, om hvilken ordre der skal accepteres...

Jeg ville tro, at nedenstående kode ville virke:

C#:

string ordre = listBox1.SelectedValue.ToString();
            HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://golfbolde-shoppen.dk/Testing-Area/transport/klient.asp");
            req.Method = "POST";
            req.ContentType = "application/x-www-form-urlencoded";
            StreamWriter post = new StreamWriter(req.GetRequestStream(),Encoding.Default);
            post.Write("mode=accepter&ordre=" + ordre);
            post.Close();
           
            //Opdater inholdet af listBox1
            OpdaterASP();

ASP:

'test SQL-streng
strSQL1 = "UPDATE Ordrer SET TilNavn = 'hehehehe' WHERE ID=" & cInt(Request.Form("ordre"))
con.Execute(strSQL1)
Avatar billede arne_v Ekspert
05. september 2006 - 16:29 #46
det ser ikke helt forkert ud
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