Avatar billede Kim Neesgaard Seniormester
13. november 2005 - 17:14 Der er 38 kommentarer og
2 løsninger

INSERT i en Access database med ASP.NET

Når jeg forsøger at indsætte en record i en Access database via ASP.NET kode på en webserver, får jeg en fejl som beskrevet i http://www.eksperten.dk/spm/658458. Nu har jeg fundet årsagen og løsningen, men jeg kan ikke få løsningen til at fungere - derfor et nyt spørgsmål.

Se:
http://support.microsoft.com/?id=316675  og
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconASPNETImpersonation.asp

Når jeg følger anbefalingen med at sætte denne i web.config

<!-- Web.config file. -->
<identity impersonate="true"/>

så får jeg fejlen:

System.Data.OleDB.OleDBException: Unspecified error

nå jeg vil lave forbindelse til databasen med objConn.Open - som virker, når impersonate er false.

Jeg er forvirret på et højere plan - er det virkelig så kompliceret at 'snakke' med en Access database via ASP.NET på en webserver??

Alt virker, når jeg kører på min egen lokale maskine.
Avatar billede innercitydk Nybegynder
13. november 2005 - 17:19 #1
prøv lige at rette det her til dine behov og se om det ikke virker.

void Button2_Click(object sender, System.EventArgs e)
{
        {
            bool gennemfoert=false;
            string strDSN=@"Provider=Microsoft.Jet.OLEDB.4.0 ;Data Source=";
            strDSN+=Server.MapPath("//stitildb//db.mdb");
            OleDbConnection myConn = new OleDbConnection(strDSN);
            string sql = "Insert into arg (overskrift, indhold) Values (@overskrift, @indhold)";   
            OleDbCommand insertCommand = new OleDbCommand(sql,myConn);
            if((overskrift.Text!="")&(argIndhold.Text!=""))
            {   
            insertCommand.Parameters.Add("@overskrift",OleDbType.VarChar).Value = overskrift.Text;
            insertCommand.Parameters.Add("@indhold",OleDbType.VarChar).Value = argIndhold.Text;
            try
            {
                myConn.Open();
                insertCommand.ExecuteNonQuery();
                gennemfoert=true;
            }
            catch
            {
                Response.Write("Fejl try/catch");
            }
            finally
            {
                myConn.Close();
            }
            }
            else
                Response.Write("FEJL! Ikke alle tekstfelter er udfyldt.");
               
            if(gennemfoert==true)
            {
                Response.Redirect("../gennemfoert.aspx");
            }
            else
            {
                Response.Redirect("../fejl.aspx");
            }

        }


Det virker for mig

mvh Nicki
Avatar billede innercitydk Nybegynder
13. november 2005 - 17:19 #2
Det burde være ret enkelt at rette til dine behov også selvom du bruger en anden type db
Avatar billede Kim Neesgaard Seniormester
13. november 2005 - 17:29 #3
Jeg bruger VB og har prøvet at oversætte:

string strDSN=@"Provider=Microsoft.Jet.OLEDB.4.0 ;Data Source=";
            strDSN+=Server.MapPath("//stitildb//db.mdb");
            OleDbConnection myConn = new OleDbConnection(strDSN);

men jeg får fejl i oversættelsen - kan du evt. give mig den i VB?
Avatar billede innercitydk Nybegynder
13. november 2005 - 17:39 #4
Har en anden idé.. prøv lige det her.. her er koden lagt som script på selve html siden. Om din insert side er i vb eller c# kan vel være ligegyldigt (jeg kan ikke vb desværre)..


<%@ Page Language="C#" ContentType="text/html" ResponseEncoding="iso-8859-1" Debug="true" %>
<%@ Import Namespace="System.Data.OleDb" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<script language="c#" runat="server">
void Button2_Click(object sender, System.EventArgs e)
{
        {
            bool gennemfoert=false;
            string strDSN=@"Provider=Microsoft.Jet.OLEDB.4.0 ;Data Source=";
            strDSN+=Server.MapPath("//db//cafe.mdb");
            OleDbConnection myConn = new OleDbConnection(strDSN);
            string sql = "Insert into arg (overskrift, indhold) Values (@overskrift, @indhold)";   
            OleDbCommand insertCommand = new OleDbCommand(sql,myConn);
            if((overskrift.Text!="")&(argIndhold.Text!=""))
            {   
            insertCommand.Parameters.Add("@overskrift",OleDbType.VarChar).Value = overskrift.Text;
            insertCommand.Parameters.Add("@indhold",OleDbType.VarChar).Value = argIndhold.Text;
            try
            {
                myConn.Open();
                insertCommand.ExecuteNonQuery();
                gennemfoert=true;
            }
            catch
            {
                Response.Write("Fejl try/catch");
            }
            finally
            {
                myConn.Close();
            }
            }
            else
                Response.Write("FEJL! Ikke alle tekstfelter er udfyldt.");
               
            if(gennemfoert==true)
            {
                Response.Redirect("../gennemfoert.aspx?id=cafe");
            }
            else
            {
                Response.Redirect("../fejl.aspx");
            }

        }
}
</script>
<title>Side Titel</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css">
<!--
.style12 {
    font-size: 36px;
    font-style: italic;
}
-->
</style>
</head>
<body class="body">
<table width="750" align="center"
  <tr>
    <td><br>     
      <h2>Tilf&oslash;j et arrangement <br>
        </h2>
          <TABLE width="300" border="0" align="left" cellPadding="1" cellSpacing="1" id="Table1">
          <form id="Form1" method="post" runat="server">
                <TR>
                    <TD style="WIDTH: 82px">Overskrift</TD>
                    <TD>
                        <asp:TextBox id="overskrift" runat="server"></asp:TextBox></TD>
                </TR>
                <TR>
                    <TD style="WIDTH: 82px">Indhold:</TD>
                    <TD>
                        <P>
                            <asp:TextBox id="argIndhold" runat="server" TextMode="MultiLine" Height="157px"></asp:TextBox></P>
                        <P>
                            <asp:Button id="Button2" runat="server" Text="Gem Arrangement" onclick="Button2_Click"></asp:Button></P>
                        <P>
                          <asp:Label id="Label1" runat="server" Width="123px" Font-Italic="True" ForeColor="Red" Visible="False">Fejl pr&oslash;v igen!</asp:Label>
                        </P></TD>
                </TR></form>
        </TABLE>
       
    </TABLE>
    </td></tr>
</table>


</body>
</html>
Avatar billede dr_chaos Nybegynder
13. november 2005 - 17:44 #5
du har ikke access databasen åben når du connecter til den ?
Avatar billede Kim Neesgaard Seniormester
13. november 2005 - 17:46 #6
Men jeg kan ikke c#....! Hvad er funktionen af strDSN?
Avatar billede Kim Neesgaard Seniormester
13. november 2005 - 17:47 #7
Nej - den er lukket. Jeg får samme fejl på 2 forskellige servere.
Avatar billede innercitydk Nybegynder
13. november 2005 - 17:48 #8
bare et variabelnavn. Det er der databasen er placeret.

strDSN+=Server.MapPath("//db//cafe.mdb"); //Skal ændres til din db sti

string sql = "Insert into arg (overskrift, indhold) Values (@overskrift, @indhold)";    //SKal ændres
Avatar billede innercitydk Nybegynder
13. november 2005 - 17:48 #9
det var da underligt.. hvad skriver den af fejl
Avatar billede innercitydk Nybegynder
13. november 2005 - 17:51 #10
hvad skal den indsætte så kan jeg lige lave det hvis du have den i C#, ellers kan jeg ikke hjælpe

Prøv lige at lave 2 slashes i din egen kode til hvor db ligger. ligesom det her "//db//cafe.mdb"
Avatar billede innercitydk Nybegynder
13. november 2005 - 17:53 #11
har du skrevet debug=true i første linie så den fortæller dig den nøjagtige fejl?

som her

<%@ Page Language="VB" ContentType="text/html" ResponseEncoding="iso-8859-1" Debug="true" %>
Avatar billede Kim Neesgaard Seniormester
13. november 2005 - 17:58 #12
Jeg vil meget gerne have det i c#, da jeg normalt bare kan oversætte det via et websted. Koden, der giver fejl, er sådan her - oversat til c#:

OleDbConnection objConn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=" + server.mappath("/data/A-Nees.mdb") + ";");
objConn.Open();
OleDbCommand SQLTekst;
string strSQL;
strSQL = "INSERT INTO tblMinOrdliste (Bruger, Sprog, Ord, Udtale, Oversaettelse, Modsaetning, Synonym, Grammatisk, Om) " + "VALUES ('" + Session("Bruger") + "', '" + Session("Sprogkode") + "', '" + txtOrd.Text + "', '" + txtUdtale.Text + "', '" + txtOversaettelse.Text + "', '" + txtModsaetning.Text + "', '" + txtSynonym.Text + "', '" + txtGrammatisk.Text + "', '" + txtOm.Text + "')";
SQLTekst = new OleDbCommand(strSQL, objConn);
SQLTekst.ExecuteNonQuery();
objConn.Close();
Avatar billede Kim Neesgaard Seniormester
13. november 2005 - 18:01 #13
Jeg havde ikke indsat debug="true", men den giver samme fejl, når dette er indsat.
Avatar billede innercitydk Nybegynder
13. november 2005 - 18:06 #14
Prøv lige det her:

OleDbConnection objConn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=" + server.mappath("//data//A-Nees.mdb") + ";");
OleDbCommand SQLTekst;
string strSQL;
strSQL = "INSERT INTO tblMinOrdliste (Bruger, Sprog, Ord, Udtale, Oversaettelse, Modsaetning, Synonym, Grammatisk, Om) " + "VALUES ('" + Session("Bruger") + "', '" + Session("Sprogkode") + "', '" + txtOrd.Text + "', '" + txtUdtale.Text + "', '" + txtOversaettelse.Text + "', '" + txtModsaetning.Text + "', '" + txtSynonym.Text + "', '" + txtGrammatisk.Text + "', '" + txtOm.Text + "')";
SQLTekst = new OleDbCommand(strSQL, objConn);
objConn.Open();
try
{
SQLTekst.ExecuteNonQuery();
}
catch
{
Response.Write("FEJL i SQL");
}
finally
{
objConn.Close();
}
Avatar billede innercitydk Nybegynder
13. november 2005 - 18:13 #15
eller det her


bool gennemfoert=false;
            string strDSN=@"Provider=Microsoft.Jet.OLEDB.4.0 ;Data Source=";
            strDSN+=Server.MapPath("//data//A-Nees.mdb");
            OleDbConnection myConn = new OleDbConnection(strDSN);
            string sql = "INSERT INTO tblMinOrdliste (Bruger, Sprog, Ord, Udtale, Oversaettelse, Modsaetning, Synonym, Grammatisk, Om) " + "VALUES ('" + Session("Bruger") + "', '" + Session("Sprogkode") + "', '" + txtOrd.Text + "', '" + txtUdtale.Text + "', '" + txtOversaettelse.Text + "', '" + txtModsaetning.Text + "', '" + txtSynonym.Text + "', '" + txtGrammatisk.Text + "', '" + txtOm.Text + "')";    
            OleDbCommand insertCommand = new OleDbCommand(sql,myConn);
            try
            {
                myConn.Open();
                insertCommand.ExecuteNonQuery();
                gennemfoert=true;
            }
            catch
            {
                Response.Write("Fejl");
            }
            finally
            {
                myConn.Close();
            }
            }
               
            if(gennemfoert==true)
            {
                Response.Write("Gennemført!");
            }
            else
            {
                Response.Write("Fejl");
            }
Avatar billede Kim Neesgaard Seniormester
13. november 2005 - 18:14 #16
Så giver den: FEJL i SQL.
Avatar billede innercitydk Nybegynder
13. november 2005 - 18:14 #17
prøv den sidste version
Avatar billede innercitydk Nybegynder
13. november 2005 - 18:15 #18
der er en } for meget efter myConn.Close();  :)
Avatar billede innercitydk Nybegynder
13. november 2005 - 18:15 #19
skal du lige rette
Avatar billede Kim Neesgaard Seniormester
13. november 2005 - 18:17 #20
Den sidste giver FejlFejl
Avatar billede Kim Neesgaard Seniormester
13. november 2005 - 18:17 #21
Ja - det fandt oversætteren!!
Avatar billede innercitydk Nybegynder
13. november 2005 - 18:21 #22
bool gennemfoert=false;
            string strDSN=@"Provider=Microsoft.Jet.OLEDB.4.0 ;Data Source=";
            strDSN+=Server.MapPath("//data//A-Nees.mdb");
            OleDbConnection myConn = new OleDbConnection(strDSN);
            string sql = "INSERT INTO tblMinOrdliste (Bruger, Sprog, Ord, Udtale, Oversaettelse, Modsaetning, Synonym, Grammatisk, Om) " + "VALUES ('" + Session("Bruger") + "', '" + Session("Sprogkode") + "', '" + txtOrd.Text + "', '" + txtUdtale.Text + "', '" + txtOversaettelse.Text + "', '" + txtModsaetning.Text + "', '" + txtSynonym.Text + "', '" + txtGrammatisk.Text + "', '" + txtOm.Text + "')";   
            OleDbCommand insertCommand = new OleDbCommand(sql,myConn);
            try
            {
                myConn.Open();
}
catch
{
Response.Write("Kan ikke åbne db");
}
try
{
                insertCommand.ExecuteNonQuery();
gennemfoert=true;
}
catch
{
Response.Write("Fejl i SQL");
}

            finally
            {
                myConn.Close();
            }
            }
               
            if(gennemfoert==true)
            {
                Response.Write("Gennemført!");
            }
            else
            {
                Response.Write("Fejl");
            }
Avatar billede Kim Neesgaard Seniormester
14. november 2005 - 10:24 #23
Nu har jeg prøvet dit sidste forslag, men får desværre stadig fejl: Kan ikke åbne dbFejl i SQLFejl.
Avatar billede Kim Neesgaard Seniormester
14. november 2005 - 10:25 #24
Jeg har også prøvet at indsætte <identity impersonate="true"/> i web.config (som Microsoft anbefaler), men her giver den også fejl?
Avatar billede Kim Neesgaard Seniormester
14. november 2005 - 10:31 #25
Jeg har lavet en simpel testapplikation og kørt den lokalt på min egen maskine - den kører uden problemer!
Avatar billede innercitydk Nybegynder
14. november 2005 - 11:17 #26
Det er meget underligt. Prøv at lave en simpel app og test den på dit webhotel. Jeg tror det er din host der er en fejl hos. Hvilken host bruger du?
Avatar billede Kim Neesgaard Seniormester
14. november 2005 - 12:01 #27
Jeg har netop lavet en simpel app, der kun laver INSERT. Det mærkelige er, at samme fænomen optræder hos min private host (BuyDomains) og på mit firmas server, så det er helt uafhængigt.
Avatar billede Kim Neesgaard Seniormester
14. november 2005 - 12:38 #28
Nu virker det! Jeg forstår ikke, hvorfor det jeg gjorde, fik det til at virke, så derfor vil jeg skrive det HELT som jeg gjorde (det er nemlig et utroligt forløb):

1/ På sikkerhedsfanen kunne jeg se, at maskinnavn\ASPNET havde Read&Execute, Read og Write (denne write havde jeg tidligere givet den uden at det hjalp).

2/ Jeg gav nu Full Control og Modify.

3/ Nu kunne INSERT finde sted.

4/ Jeg tog nu Full Control af.

5/ INSERT virkede.

6/ Jeg tog nu Modify af.

7/ INSERT virkede.

Dvs. jeg er nu helt tilbage ved de rettigheder, som den havde, da det IKKE virkede - kan du forklare det?

Den kode, jeg kan få til at virke nu, er min egen oprindelige:

Dim Sti As String

Sti = server.mappath("Test.mdb")
Dim objConn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=" & Sti & ";")
objConn.Open()

Dim SQLTekst As OleDbCommand
Dim strSQL As String
strSQL = "INSERT INTO tblTest (F1, F2) VALUES ('Susanne', 'Kjær')"
SQLTekst = New OleDbCommand(strSQL, objConn)
SQLTekst.ExecuteNonQuery
objConn.Close

Din sidsttilsendte giver stadig fejl - også selv om de to sidste rettigheder tilvælges.

Er det ikke underligt?!
Avatar billede innercitydk Nybegynder
14. november 2005 - 14:50 #29
Det lyder vildt mærkeligt!! Du har en anden sti i den her test app. Virker det så med det oprindelige kode?
Avatar billede innercitydk Nybegynder
14. november 2005 - 14:52 #30
det kunne tyde på at der er problemer med at læse fra mappen db ligger i. da der er lavet try catch og den melder at den ikke kan åbne db må det jo være det samme problem. I din test app ligger db jo i roden. Prøv at lave samme trick som du gjore på den mappe din oprindelige db ligger i
Avatar billede stinejh1980 Nybegynder
15. november 2005 - 15:24 #31
Du kan måske bruge dette. Det er godtnok en slet funktion, men du kan jo rette den til.

<%@ Page Language="VB" Debug="true" %>
<%@ import Namespace="System.Data" %>
<%@ import Namespace="System.Data.Oledb" %>
<script runat="server">

Dim strConn As String
Dim objConn As OleDbConnection
Dim objComm As OleDbCommand
Dim objRs As OleDbDataReader

Sub Page_Load()
    smartnavigation="true"
    strConn = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.Mappath("test.MDB") & ";"
    objConn = New OleDbConnection(strConn)
End Sub

Sub btnDelete_Click(sender As Object, e As EventArgs)
    Dim strSQL as string
    Dim Clientno as integer
   
    objConn.Open()
   
    strSQL="DELETE from Clients where Clientno =" & txtClientno.text & ";"
    'response.write(strsql)
    objComm = New OLEDBcommand(strSQL, objConn)
    objComm.ExecuteNonQuery()
   
    Show_Confirmation(Clientno)
   
    objConn.Close()
End Sub

Sub Show_Confirmation(Clientno)
    lblMessage.text += "<hr><table width='80%' border='0' cellspacing='2' cellpadding='2' class='tekst'><tr>"
    lblMessage.text += "<td>The client with the number</td></tr>"
    lblMessage.text += "<tr><td><strong>" & txtClientno.text & "</strong></td></tr>"
    lblMessage.text += "<tr><td>has now been permanently removed</td></tr></table><hr>"
End Sub

/Elvstine
Avatar billede stinejh1980 Nybegynder
15. november 2005 - 15:41 #32
Du skal bare skrive dit db navn i i stedet for test.mdb
Avatar billede Kim Neesgaard Seniormester
16. november 2005 - 09:00 #33
innercitydk -> Jeg kan desværre ikke prøve det samme af på den første kode, da den ligger hos BuyDomains og her kan jeg ikke stille på sikkerheden. Jeg har lavet samme forsøg med en db, der ligger et andet sted end .aspx og her er det åbenbart også sådan, at den skal op at 'runde' fulde rettigheder og så kan man tage dem af igen til en tilstand, hvor det først ikke virkede. Gud ved, hvad forklaringen er på det?

elvstine -> Problemet var/er, at udførelse af objComm.ExecuteNonQuery() gav beskeden Operation must use an updateable query.
Avatar billede innercitydk Nybegynder
16. november 2005 - 09:15 #34
Jeg havde samme problem på min lokalserver, men alt virkede da jeg loadede det op. Så hvis det ikke virker hos BuyDomains må det da være hos dem fejlen ligger. Jeg bruger needhost og der funker det!
Avatar billede Kim Neesgaard Seniormester
16. november 2005 - 09:42 #35
Ja - det vil jeg også mene. Det kan jo blive nødvendigt at skifte, hvis de ikke kan rette adgangen. Needhost ser godt nok billige ud - og det er godt nok?
Avatar billede innercitydk Nybegynder
16. november 2005 - 17:25 #36
Ja det kører rigtig godt. Der er så mange at vælge imellem efterhånden og de presser hinanden i pris. Jeg har kun haft gode oplevelser med Needhost.
Avatar billede dr_chaos Nybegynder
04. februar 2006 - 16:46 #37
Du mangler at lukke spørgsmålet.
Avatar billede Kim Neesgaard Seniormester
04. februar 2006 - 16:54 #38
innercity.dk -> Vil du også lægge et svar?
Avatar billede innercitydk Nybegynder
18. maj 2006 - 13:24 #39
Sry for forsinkelsen. Jeg havde 152 spms hvor jeg deltager.. Bedre sent end aldrig ;)
Avatar billede Kim Neesgaard Seniormester
18. maj 2006 - 17:37 #40
Helt ok og forståeligt!!
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