Avatar billede fileto Seniormester
04. februar 2004 - 17:11 Der er 4 kommentarer og
1 løsning

Flere problemer med indkapsling

Hej

Jeg forsøger at indcapsle OleDbDataAdapter således at jeg i mine scripts ikke skal refferere direkte til dette navn men
i stedet kan refferere til mit eget navn DbDataAdapter. På den måde kan jeg altid nemt skifte til feks ODBC hvis jeg skulle få lyst.

Men når jeg eksekvere koden siger compileren :

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Nedensåtende linie highlightes af compileren :
Db.DbDataAdapter.Fill(DbDataSet, "MyTabel"); 


Min kode ser sådan ud :


using System.Data;
using System.Data.OleDb;
//using Databaseenv;
namespace Databaselag {
    public class classDbConnstr {
        public string dbConnStr {
          get {
              return "Myconnectionstring";
          }
        }
    }
    public class Database {
        public OleDbConnection DbConnection;
        public OleDbDataAdapter DbDataAdapter;
        public OleDbCommand DbCommand;
        classDbConnstr DbConnStr = new classDbConnstr(); // connection string //
        public void MdbConnect () {
            DbConnection = new OleDbConnection(DbConnStr.dbConnStr);
        }
        public void MdbPassSqlstring(string SqlString) {
          OleDbDataAdapter DbDataAdapter = new  OleDbDataAdapter(SqlString,DbConnection);
        }
    }

}

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

        Database Db = new Database(); // instans af databaselag
        DataSet DbDataSet = new DataSet(); // Dataadapter

        void Page_Load(object sender, EventArgs e) {
                Db.MdbConnect();
        }

        void UpdateDb(object sender, EventArgs e) {

            String InsertCmd = "insert into MyTable (Name, Address, Registred) values (@Name, @Address, @Registred)";
            Db.DbCommand = new OleDbCommand(InsertCmd, Db.DbConnection);

            Db.DbCommand.Parameters.Add(new OleDbParameter("@Name", OleDbType.VarChar, 30));
            Db.DbCommand.Parameters["@Name"].Value = HttpUtility.HtmlEncode(Name.Text);

            Db.DbCommand.Parameters.Add(new OleDbParameter("@Address", OleDbType.VarChar, 30));
            Db.DbCommand.Parameters["@Address"].Value = HttpUtility.HtmlEncode(Address.Text);

            Db.DbCommand.Parameters.Add(new OleDbParameter("@Registred", OleDbType.VarChar, 20));
            Db.DbCommand.Parameters["@Registred"].Value = DateTime.Now;

            Db.DbCommand.Connection.Open();
            Db.DbCommand.ExecuteNonQuery();
            Db.DbCommand.Connection.Close();

            Label1.Text = HttpUtility.HtmlEncode(Name.Text);
        }

        void TestDb(object sender, EventArgs e) {

    //          OleDbDataAdapter DbDataAdapter = new  OleDbDataAdapter("select * from MyTable", Db.DbConnection);
    //          DbDataAdapter.Fill(DbDataSet, "MyTable");

              Db.MdbPassSqlstring("select * from MyTable");
              Db.DbDataAdapter.Fill(DbDataSet, "MyTable");

              MyDatagrid.DataSource=DbDataSet.Tables["MyTable"].DefaultView;
              MyDatagrid.DataBind();
        }

</script>


Det eneste jeg kan få til at virke er hvis jeg indsætter følgende kode :

              OleDbDataAdapter DbDataAdapter = new  OleDbDataAdapter("select * from MyTable", Db.DbConnection);
              DbDataAdapter.Fill(DbDataSet, "MyTable");


i stedet for følgende :

              Db.MdbPassSqlstring("select * from MyTable");
              Db.DbDataAdapter.Fill(DbDataSet, "MyTable");

Men så står der jo igen oleDbDataAdapter i mit script, og så er der jo ikke indkapslet noget. :-(


Hvad gør jeg galt ? Er der nogen der kan hjælpe?
Avatar billede arne_v Ekspert
04. februar 2004 - 17:25 #1
Erstat:

        public void MdbPassSqlstring(string SqlString) {
          OleDbDataAdapter DbDataAdapter = new  OleDbDataAdapter(SqlString,DbConnection);
        }
   
med:

        public void MdbPassSqlstring(string SqlString) {
          DbDataAdapter = new  OleDbDataAdapter(SqlString,DbConnection);
        }
Avatar billede fileto Seniormester
04. februar 2004 - 19:35 #2
Hej arne v
Nu virker det :-)
Post lige et svar til points
Avatar billede arne_v Ekspert
04. februar 2004 - 19:42 #3
svar
Avatar billede arne_v Ekspert
04. februar 2004 - 19:44 #4
Lidt forklaring: problemet var at der blev erklæret en lokal variabel
med samme navn som en instans variabel og at den lokale variabel
blev sat til at pege på et objekt mens instans variablen stadig
var null.
Avatar billede fileto Seniormester
05. februar 2004 - 08:30 #5
Takker
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