webForumDet fria alternativet

Märkligt fel

.NET

12 svar · 396 visningar · startad av Prästen

Medlem sedan dec. 2000537 inlägg
Frågan#1

Compiler Error Message: CS1501: No overload for method 'Fill' takes '2' arguments

Source Error:

Line 17: System.Data.IDbDataAdapter dataAdapter = new System.Data.OleDb.OleDbDataAdapter();
Line 18: dataAdapter.SelectCommand = dbCommand;
Line 19: dataAdapter.Fill(mittDataSet,"svarsalt");
Line 20:
Line 21: return mittDataSet;

va i fasicken?.. ska man inte kunna namnge sin lilla tabell eller?

och om jag tar bort parameter 2 på "Fill" så blir det såhär:

Exception Details: System.Data.OleDb.OleDbException: No value given for one or more required parameters.

Source Error:

Line 17: System.Data.IDbDataAdapter dataAdapter = new System.Data.OleDb.OleDbDataAdapter();
Line 18: dataAdapter.SelectCommand = dbCommand;
Line 19: dataAdapter.Fill(mittDataSet); (denna är markerad röd)
Line 20:
Line 21: return mittDataSet;

SQL satsen som verkar generera felet är :

DropDownList1.DataSource=MyQueryMethod("SELECT * FROM svarsalt WHERE fragor.ID=svarsalt.fragaID AND svarsalt.fragaID=5");

för att ändrar jag den till detta:

DropDownList1.DataSource=MyQueryMethod("SELECT * FROM svarsalt WHERE fragor.ID=svarsalt.fragaID AND svarsalt.fragaID=5");

då funkar den korrekt.

och MyQueryMethod ser ut såhär:

        System.Data.DataSet MyQueryMethod(string sqlstring) {
            System.Data.DataSet mittDataSet=new System.Data.DataSet();
            string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Ole DB Services=-4; Data Source=C:\\Documents and Settings\\Administratör\\Mina dokument\\WebMatrixServer\\codebehind\\access\\test.mdb";
            System.Data.IDbConnection dbConnection = new System.Data.OleDb.OleDbConnection(connectionString);

            System.Data.IDbCommand dbCommand = new System.Data.OleDb.OleDbCommand();
            dbCommand.CommandText = sqlstring;
            dbCommand.Connection = dbConnection;

            System.Data.IDbDataAdapter dataAdapter = new System.Data.OleDb.OleDbDataAdapter();
            dataAdapter.SelectCommand = dbCommand;
            dataAdapter.Fill(mittDataSet);

            return mittDataSet;
        }

Redigerat: Angav [kod] samt

tagar för att förenkla läsning av denna tråd /renholm

Medlem sedan apr. 20012 266 inlägg
#2

Testa att istället för att köra med IDbDataAdapter kör med OleDbDataAdapter.

Line 17: System.Data.IDbDataAdapter dataAdapter = new System.Data.OleDb.OleDbDataAdapter();
Line 17: System.Data.OleDb.OleDbDataAdapter dataAdapter = new System.Data.OleDb.OleDbDataAdapter();

Vid felmeddelanden är det lämpligt att använda

taggarna samt vid kod är [kod] taggarna lämpliga.

Medlem sedan dec. 2000537 inlägg
#3
<%@ Page Language="C#" Debug="true" %>
<%@ Register TagPrefix="wmx" Namespace="Microsoft.Matrix.Framework.Web.UI" Assembly="Microsoft.Matrix.Framework, Version=0.6.0.0, Culture=neutral, PublicKeyToken=6f763c9966660626" %>
<script runat="server">

    // Insert page code here
    //
    
        System.Data.DataSet MyQueryMethod(string sqlstring) {
            System.Data.DataSet mittDataSet=new System.Data.DataSet();
            string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Ole DB Services=-4; Data Source=C:\\Documents and Settings\\Administratör\\Mina dokument\\WebMatrixServer\\codebehind\\access\\test.mdb";
            System.Data.IDbConnection dbConnection = new System.Data.OleDb.OleDbConnection(connectionString);
    
            System.Data.IDbCommand dbCommand = new System.Data.OleDb.OleDbCommand();
            dbCommand.CommandText = sqlstring;
            dbCommand.Connection = dbConnection;
    
            System.Data.IDbDataAdapter dataAdapter = new System.Data.OleDb.OleDbDataAdapter();
            dataAdapter.SelectCommand = dbCommand;
            dataAdapter.Fill(mittDataSet);
    
            return mittDataSet;
        }
    
    
    void Page_Load() {
    System.Data.DataSet mittDataSet=new System.Data.DataSet();
    mittDataSet=MyQueryMethod("SELECT * FROM fragor WHERE fragor.svarsaltID=0");
    Label1.Text=mittDataSet.Tables["Table"].Rows[0]["fraga"].ToString();
    
    
    DropDownList1.DataTextField = "alternativ"; //vilket kolumn som ska visas i dropdownlisten.
    DropDownList1.DataValueField="ID"; // och vilket kolumn som ska vara osynlig
    
    
    // DENNA ÄR DET SOM ÄR FEL, TA BORT RELATIONEN SÅ FUNKAR DET.
    DropDownList1.DataSource=MyQueryMethod("SELECT * FROM svarsalt WHERE fragor.ID=svarsalt.fragaID AND svarsalt.fragaID=5");
    
    DropDownList1.DataBind();
    }
    
    
    
    void DropDownList1_SelectedIndexChanged(object sender, EventArgs e) {
    System.Data.DataSet mittDataSet=new System.Data.DataSet();
    mittDataSet=MyQueryMethod("SELECT * FROM fragor WHERE fragor.svarsaltID=" + DropDownList1.SelectedItem.Value);
    
    Label1.Text=mittDataSet.Tables["Table"].Rows[0]["fraga"].ToString();
    Label2.Text=DropDownList1.SelectedItem.Text + DropDownList1.SelectedItem.Value;
    
    
    DropDownList1.DataSource=MyQueryMethod("SELECT * FROM svarsalt WHERE svarsalt.fragaID=6");
    DropDownList1.DataBind();
    
    
    
    }

</script>
<html>
<head>
</head>
<body>
    <form runat="server">
        <asp:Label id="Label1" runat="server">Label</asp:Label>&nbsp; 
        <asp:DropDownList id="DropDownList1" runat="server" Width="339px" AutoPostBack="True" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged"></asp:DropDownList>
        <asp:Label id="Label2" runat="server">Label</asp:Label>
    </form>
</body>
</html>

här är hela min kod, kanske lättare att se då. jag misstänker att det är när jag gör en relationsSQL som det blir fel, för att tar jag bort relationen "fragor.ID=svarsalt.fragaID" så funkar det.

Medlem sedan dec. 2000537 inlägg
#4

renholm vad är det för skillnad på IDbDataAdapter och odbcDataAdapter?

Medlem sedan maj 20012 812 inlägg
#5

IDbDataAdapter är ett Interface medans odbcDataAdapter är en klass.

Skillnaden på Interface och klasser orkar jag inte ta upp här, finns massor att läsa på nätet om du orkar, skulle dock rekomender en bok på svenska, då det kan vara lite svårt att förstå.

Just när det gäller klasser som typ SqlDataReader och OleDbDataReader, så är Interfacen jättebra. Här kommer ett litet exempel.

Du vill skapa dig en DataAccessklass som du kan använda när du vill koppla dig till olika databaser.

Du kan då skapa 2 olika funktioner som returnerar antingen SqlDataReader eller OleDbDataReader, det tråkiga här är att du i ditt affärslager alltså måste vet vad du har för databas, som om du byter från access till SQL Server så måste du koda om en massa eftersom du inte längre vill använda OleDbDataReader utan SqlDataReader.

Om din DataAccess klass istället returnerar IDbDataReader så behöver ditt affärslager inte veta vilken databas den kör på eftersom den alltid kommer att få tillbaka en IDbDataReader.

Du använder sedan IDbDataReader precis som en SqlDataReader. Nu är det bara din DataAccess klass som behöver vet vilken databas som används.

- M

Medlem sedan apr. 20012 266 inlägg
#6

Precis som Gladh säger bör man bygga sitt affärslager och dataaccess lager för att klara av flera olika databaser. Att du t.ex skapar ett överliggande lager som retunerar en IDataAdapter från en OleDbDataAdapter. På så sätt får ditt presentationslager/business lager möjligheten att via IDataAdapter hantera flera olika databas format och datakällor.

Medlem sedan dec. 2000537 inlägg
#7

1. Kan man inte bara ha en funktion som alltid returnerar ett Dataset då?.

2.Vad är en DataReader för nåt?

Medlem sedan dec. 20003 563 inlägg
#8

1. Jo

function ds() as dataset
   return Datasettet
end function

2. En komponent i ado.net som läser igenom data från t.ex. en sql-fråga

Medlem sedan dec. 2000537 inlägg
#9

vad är det för skillnad på en datareader och ett dataset?

Medlem sedan apr. 20012 266 inlägg
#10

Den största skillnaden är nog att DataReadern är ansluten till databasen under den tid den används medan DataSet läser datan och sedan stänger anslutningen och låter dig fortfarande läsa och använda den.

Medlem sedan dec. 2000537 inlägg
#11

men är inte dataset bättre då?. eller vilken är bättre, och vilken används oftast?.

Medlem sedan apr. 20012 266 inlägg
#12

Beror på omständigheterna, ett dataset ligger i serverns minne mer än en DataReader så vida du inte spar ner datan från datareadern i något objekt.

Medlem sedan dec. 20003 563 inlägg
#13

Det här kan man ju göra tester på och om jag inte missminner mig så har det gjorts en del tester.

DataReadern har tydligen varit snabbast de flesta gångerna men då måste man göra ett tillägg och säga att den är tvungen att vara kopplad mot databasen under hela koden som läser av datan. Detta kan ju ta ett tag om man ska formatera utdatan med funktioner m.m.

Om du slänger in allt i ett dataset och sedan stänger databaskopplingen så är ju det problemet ur världen. Sen kan du formatera den tabellstruktur och värden som nu ligger i ditt dataset.

Så om du bara ska få ut ett värde eller en väldigt kort text så är nog datareader snabbast och bäst så kopplingstiden är försumbar.

Handlar det om större data som du vill hantera på många fler olika sätt än presentation "pager, sorting, etc" så är nog dataset bättre.

259 ms totalt · 4 externa anrop · v20260731065814-full.e96017d9
121 ms — deklarationer (db)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)
122 ms — ändringar (db)