Avatar billede rastamand Nybegynder
26. januar 2005 - 17:04 Der er 20 kommentarer

Database connection i ASP.Net, Access db, C#

Jeg er relativt ny med ASP.Net og .Net iøvrigt. Skal udvikle et site hvor man via et datagrid kan update en Access db.

I første omgang skal jeg connecte til min db. Jeg bruger pt en Sql Connection string således:

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

    SqlConnection myConnection;

    protected void Page_Load(Object Src, EventArgs E)
    {
        myConnection = new SqlConnection("Integrated Security=SSPI;Database=Economy;Data Source=(local)");

        if (!IsPostBack)
            BindGrid();
    }

    public void BindGrid()
    {

        String SqlString = "Select * from Economy";

        SqlDataAdapter myCommand = new SqlDataAdapter( SqlString, myConnection);

        DataSet ds = new DataSet();
        myCommand.Fill(ds, "Economy");

        MyDataGrid.DataSource=ds.Tables["Economy"].DefaultView;
        MyDataGrid.DataBind();
    } 
-------------------------------------------
Jeg får en fejl på linien:
myCommand.Fill(ds, "Economy");

desuden denne besked:
[SqlException: SQL Server findes ikke, eller adgang blev nægtet.]

Er det noget med rettigheder til db? Når jeg i min Connection string skriver "Data Source=(local)" betyder det så at db ligger i samme katalog som siden eller sættes det andensteds? Fungere sql connection også med Access 97?(min er 2000, men skal køre på en sådan senere)

På forhånd mange tak for hjælpen..
Avatar billede burningice Nybegynder
26. januar 2005 - 17:36 #1
SqlConnection er kun til MS SQL databasem desværre

du skal istedet bruge OleDbConnection (og tisvarende OleDb-klasser)

Din connectionstring passer heller ikke til en access db. Du kan finde de rigtige på http://connectionstrings.com/

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\somepath\mydb.mdb;User Id=admin;Password=;"

Hvis du lige for rettet de ting til, så burde det virke
Avatar billede arne_v Ekspert
26. januar 2005 - 17:44 #2
Et eksempel jeg havde på lager:

Imports System
Imports System.Data
Imports System.Data.OleDb
Imports System.Drawing
Imports System.Windows.Forms

Namespace DefaultNamespace
    Public Class MainForm
        Inherits Form
        Private dg As DataGrid
        Private save As Button
        Private con As OleDbConnection
        Private da As OleDbDataAdapter
        Private cb As OleDbCommandBuilder
        Private ds As DataSet

        Public Shared Sub Main
            Dim fMainForm As New MainForm
            fMainForm.ShowDialog()
        End Sub

        Public Sub New()
            MyBase.New
            Me.InitializeComponent
        End Sub

        Private Sub InitializeComponent()
            con = New OleDbConnection ("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Database\MSAccess\Test.mdb;UserId=admin;Password=")
            con.Open
            da = New OleDbDataAdapter("SELECT * FROM T1", con)
            cb = New OleDbCommandBuilder(da)
            da.UpdateCommand = cb.GetUpdateCommand
            ds = New DataSet
            da.Fill(ds, "T1")
            dg = New DataGrid
            save = New Button
            SuspendLayout
            dg.Location = New Point(50, 50)
            dg.Size = New Size(300, 200)
            dg.SetDataBinding(ds, "T1")
            save.Location = New Point (50, 300)
            save.Size = New Size (100, 25)
            save.Text = "Save"
            AddHandler save.Click, AddressOf SaveClick
            ClientSize = New Size(400, 400)
            Controls.Add(dg)
            Controls.Add(save)
            Text = "Main Form"
            ResumeLayout(false)
        End Sub
       
        Sub SaveClick(ByVal sender As Object, ByVal e As EventArgs)
            da.Update(ds, "T1")
            ds.AcceptChanges
            dg.Refresh
        End Sub
    End Class
End Namespace
Avatar billede rastamand Nybegynder
26. januar 2005 - 19:41 #3
ok. vigtig info der.. Jeg er gået i krig med oledb istedet.

Har fundet følgene case/tutorial:

http://msdn.microsoft.com/vcsharp/downloads/samples/default.aspx?pull=/library/en-us/dnadonet/html/adon_wtaccessdb.asp

Man kan downloade koden(i toppen) eller her:

http://download.microsoft.com/download/c/b/9/cb93399c-2ecd-4d31-bde6-82bd74f4c79b/ADONETAccessDB.exe

(zip til c:\, så ryger projektet under en ny mappe Pets på inetpub\wwwroot)

Men når jeg i min browser skriver "localhost/Pets/PetForm.aspx" får jeg følgene fejl i filen web.config:

------------
Det er ikke tilladt at bruge et afsnit, der er registreret som allowDefinition='MachineToApplication', uden for programniveau. Fejlen kan være forårsaget af, at der er en virtuel mappe, der ikke er konfigureret som et program i IIS.

Kildefejl:


Linje 36:          "Passport" and "None"
Linje 37:    -->
Linje 38:    <authentication mode="Windows" />
Linje 39:
Linje 40:    <!--  APPLICATION-LEVEL TRACE LOGGING

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

Kan i forklare hvad der er galt her?? - Går ud fra at koden virker.. :-/ Jeg er logget ind som adm på min maskine og skulle have rettigheder til tingene
Avatar billede rastamand Nybegynder
26. januar 2005 - 19:43 #4
Har prøvet med <authentication mode="None" /> uden succec..
Avatar billede arne_v Ekspert
26. januar 2005 - 19:44 #5
Glem lige mit eksempel - det er win forms - jeg havde ikke lige bidt mærke i
at det var web forms
Avatar billede burningice Nybegynder
26. januar 2005 - 19:46 #6
prøv at slet din web.config-fil der ligger i mappen Pets
Avatar billede rastamand Nybegynder
26. januar 2005 - 20:18 #7
hvis jeg sletter web.config siger den:

'Pets.WebForm1' kunne ikke indlæses

Hva det så har med hinanden at gøre..?
Avatar billede burningice Nybegynder
26. januar 2005 - 22:19 #8
uhm... ligger der en bin-mappe under Pets?

du skal nok ind i din IIS-manager og konfigurere en applikation for Pets-folderen
Avatar billede rastamand Nybegynder
26. januar 2005 - 22:39 #9
der ligger inden bin mappe under pets. alt ligger i pets undtagen pets.mdb som ligger i pets/pets altså c:\inetpub\wwwroot\pets\pets. hvordan er det lige jeg konfigurer en applikation for pets-folderen?
Avatar billede burningice Nybegynder
27. januar 2005 - 00:27 #10
Avatar billede rastamand Nybegynder
27. januar 2005 - 06:22 #11
det virker nu, altså Pets projektet :-/ selvom det ikke fungere skide godt.

Jeg er ved at miste lidt tålmodigheden med dette nye smarte, fleksible ASP.Net!! Min koden er lavet til en Sql connection, men nu skal det "konverteres til oledb conn". Jeg er lidt i tvivl om hvorvidt resten skal rettes til eller om det kun relaterer sig til selve forbindelsen.. Jeg vil meget gerne have noget feedback på hvorvidt koden ser fornuftig ud! Jeg udlover ekstra karma... :-) Tak for enhver hjælp..

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

<%@ Page Language="c#" %>
<%@ import Namespace="System.Data" %>
<%@ import Namespace="System.Data.OleDb" %>
<script runat="server" debug="true">


    OleDbConnection myconnection = null;
    OleDbDataReader reader = null;

    protected void Page_Load(Object Src, EventArgs E)
    {
        myconnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; " +
                      "Data Source=" + Server.MapPath("Economy/Economy.mdb"));
        myconnection.Open();

        if (!IsPostBack)
            BindGrid();
    }

    public void BindGrid()
    {
        try
        {
          String sqlString = "Select Rec_ID, Company.Company, Date, Income, Currency_Inc, Expense, Balance from Economy, Company Where Economy.ID = 1";

          OleDbCommand cmd = new OleDbCommand(sqlString, myConnection);

          reader = cmd.ExeCuteReader();

          datagrid.DataSource = reader;
          datagrid.DataBind();
        }
//        catch (Exception e)
//      {
//          Response.Write(e.Message);
//          Response.End();
//        }
        finally
        {
          if (reader != null)  reader.Close();
          if (conn != null)  conn.Close();
        }

    }


    public void MyDataGrid_Edit(Object sender, DataGridCommandEventArgs E)
    {
        MyDataGrid.EditItemIndex = (int)E.Item.ItemIndex;
        BindGrid();
    }

    public void MyDataGrid_Cancel(Object sender, DataGridCommandEventArgs E)
    {
        MyDataGrid.EditItemIndex = -1;
        BindGrid();
    }

    public void MyDataGrid_Update(Object sender, DataGridCommandEventArgs E)
    {
        if (Page.IsValid)
        {
            String updateCmd = "UPDATE Economy SET Rec_Id = @recid, ID = @id, Date = @date, Income = @income, "
                + "Currency_Inc = @currency_inc, Expencse = @expense, Balance = @balance where ID = 1";
       

            SqlCommand myCommand = new SqlCommand(updateCmd, myConnection);

            myCommand.Parameters.Add(new SqlParameter("@recid", SqlDbType.NVarChar, 10));
            myCommand.Parameters.Add(new SqlParameter("@id", SqlDbType.NChar, 1));
            myCommand.Parameters.Add(new SqlParameter("@date", SqlDbType.NChar, 10));
            myCommand.Parameters.Add(new SqlParameter("@income", SqlDbType.NVarChar, 20));
            myCommand.Parameters.Add(new SqlParameter("@currency_inc", SqlDbType.NVarChar, 15));           
            myCommand.Parameters.Add(new SqlParameter("@expense", SqlDbType.NVarChar, 20));           
            myCommand.Parameters.Add(new SqlParameter("@balance", SqlDbType.NVarChar, 25));
           
            myCommand.Parameters["@recid"].Value = MyDataGrid.DataKeys[(int)E.Item.ItemIndex];

            String[] cols = {"id","date","income","currency_inc","expense","balance"};

            for (int i=0; i<6; i++)
            {
                String colvalue = ((System.Web.UI.WebControls.TextBox)
                    E.Item.FindControl(cols[i])).Text;
                myCommand.Parameters["@" + cols[i]].Value = colvalue;
            }

              myCommand.Parameters["@currency_inc"].Value = ((DropDownList)E.Item.FindControl("Currency_Inc")).SelectedItem.ToString();

            myCommand.Connection.Open();

            try
            {
                myCommand.ExecuteNonQuery();
                Message.InnerHtml = "<b>Record Updated</b><br>" + updateCmd;
                MyDataGrid.EditItemIndex = -1;
            }
            catch (SqlException e)
            {
                if (e.Number == 2627)
                    Message.InnerHtml = "ERROR: A record already exists with the same primary key";
                else
                    Message.InnerHtml = "ERROR: Could not update record, please ensure the fields are correctly filled out";
                Message.Style["color"] = "red";
            }

            myCommand.Connection.Close();

            BindGrid();
        }
        else
        {
            Message.InnerHtml = "ERROR: Please check each field for error conditions.";
            Message.Style["color"] = "red";
        }
    }

Rec_ID, Company.Company, Date, Income, Currency_Inc, Expense, Balance from Economy, Company Where Economy.ID = 1";

</script>
<html>
<head>
</head>
<body style="FONT: 10pt verdana">
    <form runat="server">
        <h3><font face="Verdana">Updating a Row of Data w/ Validation</font>
        </h3>
        <span id="Message" runat="server" enableviewstate="false">
        <p>
            <ASP:DataGrid id="MyDataGrid" runat="server" AutoGenerateColumns="false" DataKeyField="Rec_Id" OnUpdateCommand="MyDataGrid_Update" OnCancelCommand="MyDataGrid_Cancel" OnEditCommand="MyDataGrid_Edit" HeaderStyle-BackColor="#aaaadd" Font-Size="8pt" Font-Name="Verdana" CellSpacing="0" CellPadding="3" ShowFooter="false" BorderColor="black" BackColor="#ccccff" Width="800">
                <Columns>
                    <asp:EditCommandColumn EditText="Edit" CancelText="Cancel" UpdateText="Update" ItemStyle-Wrap="false" />
                    <asp:BoundColumn HeaderText="Record Id" SortExpression="Sort_Rec_Id" ReadOnly="True" DataField="Rec_Id" ItemStyle-Wrap="false" />
                    <asp:BoundColumn HeaderText="Company" SortExpression="Sort_Company" ReadOnly="True" DataField="Company" ItemStyle-Wrap="false" />
                    <asp:TemplateColumn HeaderText="Date" SortExpression="Sort_Date">
                        <ItemTemplate>
                            <asp:Label runat="server" text='<%# DataBinder.Eval(Container.DataItem, "Date") %>' />
                        </ItemTemplate>
                        <EditItemTemplate>
                            <nobr />
                            <asp:TextBox runat="server" id="Date" Text='<%# DataBinder.Eval(Container.DataItem, "Date") %>' />
                            <asp:RequiredFieldValidator id="Date_ReqVal" ControlToValidate="Date" Display="Dynamic" Font-Name="Verdana" Font-Size="12" runat="server">
                            &nbsp;*
                            </asp:RequiredFieldValidator>
                            <asp:RegularExpressionValidator id="Date_RegEx" ASPClass="RegularExpressionValidator" ControlToValidate="Date" ValidationExpression="(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d" Display="Dynamic" Font-Name="Arial" Font-Size="11" runat="server">
                            * Date must be in form: DD-MM-YYYY<br />
                            </asp:RegularExpressionValidator>
                        </EditItemTemplate>
                    </asp:TemplateColumn>
                    <asp:TemplateColumn HeaderText="Income" SortExpression="Sort_Income">
                        <ItemTemplate>
                            <asp:Label runat="server" text='<%# DataBinder.Eval(Container.DataItem, "Income") %>' />
                        </ItemTemplate>
                        <EditItemTemplate>
                            <nobr />
                            <asp:TextBox runat="server" id="Income" Text='<%# DataBinder.Eval(Container.DataItem, "Income") %>' />
                            <asp:RequiredFieldValidator id="Income_ReqVal" ControlToValidate="Income" Display="Dynamic" Font-Name="Verdana" Font-Size="12" runat="server">
                            &nbsp;*
                            </asp:RequiredFieldValidator>
                            <asp:RegularExpressionValidator id="Income_RegEx" ASPClass="RegularExpressionValidator" ControlToValidate="Income" ValidationExpression="
  • \d*" Display="Dynamic" Font-Name="Arial" Font-Size="11" runat="server">
                            * Numbers must be integers<br />
                            </asp:RegularExpressionValidator>
                        </EditItemTemplate>
                    </asp:TemplateColumn>
                    <asp:TemplateColumn HeaderText="Income Currency" SortExpression="Sort_Currency_Inc">
                        <ItemTemplate>
                            <asp:Label runat="server" text='<%# DataBinder.Eval(Container.DataItem, "Currency_inc") %>' />
                        </ItemTemplate>
                        <EditItemTemplate>
                            <asp:DropDownList runat="server" text='<%# DataBinder.Eval(Container.DataItem, "Currency_inc") %>' id="Currency_Inc">
                                <asp:ListItem>EUR</asp:ListItem>
                                <asp:ListItem>PLN</asp:ListItem>
                                <asp:ListItem>USD</asp:ListItem>
                                <asp:ListItem>GBP</asp:ListItem>
                            </asp:DropDownList>
                        </EditItemTemplate>
                    </asp:TemplateColumn>
                    <asp:TemplateColumn HeaderText="Expense" SortExpression="Sort_Expense">
                        <ItemTemplate>
                            <asp:Label runat="server" text='<%# DataBinder.Eval(Container.DataItem, "Expense") %>' />
                        </ItemTemplate>
                        <EditItemTemplate>
                            <nobr />
                            <asp:TextBox runat="server" id="Expense" Text='<%# DataBinder.Eval(Container.DataItem, "Expense") %>' />
                            <asp:RequiredFieldValidator id="Expense_ReqVal" ControlToValidate="Expense" Display="Dynamic" Font-Name="Verdana" Font-Size="12" runat="server">
                            &nbsp;*
                            </asp:RequiredFieldValidator>
                            <asp:RegularExpressionValidator id="Expense_RegEx" ASPClass="RegularExpressionValidator" ControlToValidate="Expense" ValidationExpression="
  • \d*" Display="Dynamic" Font-Name="Arial" Font-Size="11" runat="server">
                            * Numbers must be integers<br />
                            </asp:RegularExpressionValidator>
                        </EditItemTemplate>
                    </asp:TemplateColumn>
                    <asp:TemplateColumn HeaderText="Balance" SortExpression="Sort_Balance">
                        <ItemTemplate>
                            <asp:Label runat="server" text='<%# DataBinder.Eval(Container.DataItem, "Balance") %>' />
                        </ItemTemplate>
                        <EditItemTemplate>
                            <nobr />
                            <asp:TextBox runat="server" id="Balance" Text='<%# DataBinder.Eval(Container.DataItem, "Balance") %>' />
                            <asp:RequiredFieldValidator id="Balance_ReqVal" ControlToValidate="Balance" Display="Dynamic" Font-Name="Verdana" Font-Size="12" runat="server">
                            &nbsp;*
                            </asp:RequiredFieldValidator>
                            <asp:RegularExpressionValidator id="Balance_RegEx" ASPClass="RegularExpressionValidator" ControlToValidate="Balance" ValidationExpression="
  • \d*" Display="Dynamic" Font-Name="Arial" Font-Size="11" runat="server">
                            * Numbers must be integers <br />
                            </asp:RegularExpressionValidator>
                        </EditItemTemplate>
                    </asp:TemplateColumn>
                </Columns>
            </ASP:DataGrid>
        </p>
        </span>
    </form>
</body>
</html>
Avatar billede rastamand Nybegynder
27. januar 2005 - 06:26 #12
linien før </script> var en fejl da jeg pastede lige nu..
Avatar billede burningice Nybegynder
27. januar 2005 - 10:26 #13
hehe.. det er måske også noget riiiiimelig hæftig kode atkaste sig ud i som total nybegynder til asp.net.

Har du kigget på de Quickstarts der er på www.asp.net?

For at hente data fra en Access Database skal du bruge 3 ting

1) En connection (OleDbConnection)
2) En command der udfører din query (OleDbCommand)
3) og til sidst en reader eller adapter der indeholder dit resultat af querien (OleDbDataReader eller OleDbDataAdapter). I dette tilfælde vil jeg bruge en reader da den er lidt simplere

OleDbConnection conn = new OleDbConnection("din connection string");
OleDbCommand command = new OleDbCommand("SELECT noget FROM tabel", conn);
OleDbDataReader reader = command.ExecuteReader();

while (reader.Read()) {
  Response.Write(reader.GetString(0));
}

reader.Close();
conn.Close();


Sværere behøves det ikke at være !
Avatar billede rastamand Nybegynder
27. januar 2005 - 16:27 #14
ja det er ikke det bedste at starte på.. men det skal laves! - der var ingen bedre til det som havde tid :-/

så jeg vidt jeg har forstået skal man bruge datagrid, hvis man skal kunne update et table!?
Avatar billede rastamand Nybegynder
27. januar 2005 - 16:28 #15
Hvordan ser min MyDataGrid_Update funktion ud i forhold til oledb?
Avatar billede burningice Nybegynder
27. januar 2005 - 16:31 #16
update en tabel:

OleDbConnection conn = new OleDbConnection("din connection string");
OleDbCommand command = new OleDbCommand("UPDATE tabel SET felt = værdi, felt2 = værdi2", conn);
command.ExecuteNonQuery();
Avatar billede arne_v Ekspert
25. februar 2005 - 21:39 #17
rasta>

Tid at få afsluttet dette spørgsmål ?
Avatar billede rastamand Nybegynder
01. marts 2005 - 08:17 #18
jeg syntes faktisk hjælpen var lidt begrænset her og tillader mig ikke at uddele point.. sig til hvis i er uenige!
Avatar billede burningice Nybegynder
01. marts 2005 - 09:17 #19
til... og hvorfor jeg mener det? Lille hint:

det her er et hjælp_hinanden-forum, og ikke et lav_mine_ting_for_jeg_kan_ikke_finde_ud_af_det-forum
Avatar billede rastamand Nybegynder
01. marts 2005 - 09:52 #20
jeg mener heller ikke at i skal lave mine ting. jeg poster først ting når jeg har problemer eller ikke kan komme videre.

mht min begrundelse: jeg syntes der var ringe feedback på den kode jeg postede, selvom det nok var for meget at poste hele koden (men dog pænt formateret :)
men jeg spørger feks om MyDataGrid_Update funktionen. du skriver så hvordan man updater en tabel, fint nok, men koden er der faktisk, hvis du ser efter.

men læg et svar cyberfessor, så får du pointene! hvis du vil have flere point har jeg meget apropos oprettet et spørgsmål som har relevans til dette:

http://www.eksperten.dk/spm/595693
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