Avatar billede decrypto Nybegynder
11. marts 2006 - 12:59 Der er 28 kommentarer og
1 løsning

Array af Hashtables

Jeg forsøger at bygge et array op af hastables.

            Hashtable[] arguments = new Hashtable[5];
            arguments[0].Add("@productGroupID", _productGroupID);
            arguments[1].Add("@brandID", _brandID);
            arguments[2].Add("@countryID", _countryID);
            arguments[3].Add("@productName", _productName);
            arguments[4].Add("@commercialName", _commercialName);

Som man kan se burde det her jo virke, men jeg får en "Object reference not set to an instance of an object" exception, ligeså snart jeg prøver at smide værdier ind i første array index.

Er der nogen, der kan give mig et fingerpeg.
Avatar billede decrypto Nybegynder
11. marts 2006 - 13:05 #1
Hashtable[] arguments = new Hashtable[5];
arguments[0].Add("@productGroupID", _productGroupID);<- "Object reference not set to an instance of an object"
arguments[1].Add("@brandID", _brandID);
arguments[2].Add("@countryID", _countryID);
arguments[3].Add("@productName", _productName);
arguments[4].Add("@commercialName", _commercialName);
Avatar billede decrypto Nybegynder
11. marts 2006 - 13:13 #2
Hmmm jeg tror, jeg har fundet ud af at jeg jo i virkeligheden ikke har brug for et array af hastables, men blot et hashtable...prøver lige....
Avatar billede driis Nybegynder
11. marts 2006 - 13:13 #3
Du opretter et nyt array af hashtables med din new, men de enkelte pladser er stadig null, indtil de bliver tildelt en reference til en HashTable. Så du kan:
Hashtable[] arguments = new Hashtable[5];
for(int i = 0 ; i < 5 ;i++ )
  arguments[i] = new Hashtable();

...
Avatar billede driis Nybegynder
11. marts 2006 - 13:14 #4
Koden ser lidt suspekt ud, jeg tror også blot du er ude efter en enkelt Hashtable ?
Avatar billede decrypto Nybegynder
11. marts 2006 - 13:39 #5
Det fandt jeg også ud af, efter jeg lige fik tænkt mig om.
Avatar billede decrypto Nybegynder
11. marts 2006 - 13:45 #6
Nu har jeg endeligt fået min hashtable(_arguments) videre frem i systemet.
Men hvordan gør jeg følgende (Kig i koden)

SqlParameter[] prms = new SqlParameter[_arguments.Count]; // Dynamisk
for(int i=0;i<_arguments.Count;i++)
{
  prms[i].ParameterName = _arguments.(Her vil jeg gerne smide navnet på min key i ParameterName, Hvordan???);
  prms[i].Value = _arguments.(Her vil jeg gerne smide værdien på min value i ParameterName, Hvordan???);
}

Det er det sidste jeg mangler, kan nogen give et hint?
Avatar billede decrypto Nybegynder
11. marts 2006 - 13:54 #7
Er det bare mig eller er det bedst at gøre brug af to-dimensionelt array istedet for en hashtable??
Avatar billede decrypto Nybegynder
11. marts 2006 - 14:07 #8
Prøver lige denne:

      foreach (DictionaryEntry myDE in myCol )
        Console.WriteLine( "  {0,-5} : {1}", myDE.Key, myDE.Value );
        Console.WriteLine();
      }
Avatar billede mikkelbm Nybegynder
11. marts 2006 - 14:20 #9
"Er det bare mig eller er det bedst at gøre brug af to-dimensionelt array istedet for en hashtable??"

Fordelen ved en hashtable er at du selv kan bestemme hvilken key du vil lagre din value med. Og på den måde lave lynhurtige opslag.

Den funktionalitet opnår du ikke med et to-dimensionelt array - tværtimod.
Avatar billede decrypto Nybegynder
11. marts 2006 - 14:24 #10
Jeg tror ikke jeg skal bruge hashtables men dictionary. Jeg skal faktisk ikke slå noget op, men blot sende værdier med ned.
Avatar billede decrypto Nybegynder
11. marts 2006 - 14:28 #11
Jeg tror dette er lige det jeg har brug for.

ICollection MyKeys;


if (MyTable.Count == 0)
      MessageBox.Show("The hashtable is empty");
else
{
      MessageBox.Show("Accessing keys property to return keys collection");
      MyKeys = MyTable.Keys;

      foreach (object Key in MyKeys)
      {
        MessageBox.Show(Key.ToString());
      }
}
Avatar billede mikkelbm Nybegynder
11. marts 2006 - 14:32 #12
Jeg vil gerne lige høre, hvad det er du skal bruge det til? For umiddelbart ser det ud til at du kan nøjes med at bruge en Collection klasse.
Avatar billede decrypto Nybegynder
11. marts 2006 - 14:36 #13
Jeg tror jeg er ret tæt på:

ICollection keys;

keys = _arguments.Keys;
int i=0;
foreach (object key in keys)
{
      prms[i].ParameterName = key.ToString(); <- Jeg får en "Object reference not set to an instance of an object"
      i++;
}
Avatar billede decrypto Nybegynder
11. marts 2006 - 14:42 #14
Jeg skal lave en database access klasse med to simple metoder.

Den ene metode er en ExecuteUpdate metode og den anden er en ExeceuteQuery.
ExecuteUpdate er en void, der kun modtager stored proc og deres argumenter til INSERTS, UPDATE og DELETE.

ExeceuteQuery metoden modtager også navn på st. proc og argumenter som parameter, men returnerer et dataset.

Jeg gør brug af Microsoft Application Block, som jeg faktisk sætter mit eget lille personlige præg på, ved at sende navn på stored proc, samt det sæt af argumenter til stored proceduren. Navnet på st. proc er jo ikke svært at sende med, men at jeg kan bygge en hashtable af mine argumenter er det jeg forsøger.
Avatar billede mikkelbm Nybegynder
11. marts 2006 - 14:42 #15
Jeg forstår stadig ikke hvad du vil opnå med den kode du har der. Umiddelbart så sætter du bare et ParameterName på dine parameters. Hvad med value?

Og til det problem du får lige der, så er det nok fordi du ikke har en instans af den Parameter du prøver at sætte et navn på.

Prøv:

foreach (object key in keys)
{
      prms[i] = new SqlParameter ();
      prms[i].ParameterName = key.ToString(); <- Jeg får en "Object reference not set to an instance of an object"
      i++;
}


Nu ved jeg ikke om det er SqlParameters du bruger, men ellers skifter du det bare ud.
Avatar billede decrypto Nybegynder
11. marts 2006 - 14:46 #16
Her er min kode som jeg leger med:
-----------------------------------------------------

public void ExecuteUpdate(string cmdTxt, Hashtable arguments)
{
    _cmdTxt = cmdTxt;
    _arguments = arguments;

    SqlParameter[] prms = new SqlParameter[_arguments.Count]; // Dynamisk
       
    ICollection keys;

    keys = _arguments.Keys;
    int i=0;

    foreach (object key in keys)
    {
      prms[i].ParameterName = key.ToString();
      i++;
    }

    SqlHelper.ExecuteNonQuery(_conn, CommandType.StoredProcedure, _cmdTxt, prms);
    CloseDB(_conn);
}
Avatar billede decrypto Nybegynder
11. marts 2006 - 14:47 #17
Alle mine variabler med _ prefix indholder værdier.

Hashtable[] arguments = new Hashtable[5];
arguments[0].Add("@productGroupID", _productGroupID);<- "Object reference not set to an instance of an object"
arguments[1].Add("@brandID", _brandID);
arguments[2].Add("@countryID", _countryID);
arguments[3].Add("@productName", _productName);
arguments[4].Add("@commercialName", _commercialName);
Avatar billede decrypto Nybegynder
11. marts 2006 - 14:49 #18
Jo, men foregår instansieringen ikke i min kode længere oppe:

SqlParameter[] prms = new SqlParameter[_arguments.Count];

Eller er det mig, der bare er helt ved siden af?
Avatar billede decrypto Nybegynder
11. marts 2006 - 14:50 #19
Yes, du havde ret. Jeg skal instansiere i min løkke.
Avatar billede mikkelbm Nybegynder
11. marts 2006 - 14:51 #20
public void ExecuteUpdate(string cmdTxt, Hashtable arguments)
{
    _cmdTxt = cmdTxt;
    _arguments = arguments;

    SqlParameter[] prms = new SqlParameter[_arguments.Count]; // Dynamisk
     
    int i=0;

    foreach (object key in _arguments.Keys)
    {
      prms[i] = new SqlParameter (key.ToString(), _arguments[key]);
      i++;
    }

    SqlHelper.ExecuteNonQuery(_conn, CommandType.StoredProcedure, _cmdTxt, prms);
    CloseDB(_conn);
}

................
Og din Hashtable oprettes som følgende:

Hashtable arguments = new Hashtable();
arguments.Add("@productGroupID", _productGroupID);
arguments.Add("@brandID", _brandID);
arguments.Add("@countryID", _countryID);
arguments.Add("@productName", _productName);
arguments.Add("@commercialName", _commercialName);
Avatar billede decrypto Nybegynder
11. marts 2006 - 14:51 #21
I eksemplet løber jeg jo min keys igennem i min løkke, jeg kan vælg også få fat i mine værdier på nøglerne i samme løkke, ikk?
Avatar billede mikkelbm Nybegynder
11. marts 2006 - 14:54 #22
Jo, prøv at se eksemplet jeg lige gav.
Avatar billede mikkelbm Nybegynder
11. marts 2006 - 14:56 #23
Og den kan gøre pænere:

public void ExecuteUpdate(string cmdTxt, Hashtable arguments)
{
    SqlParameter[] prms = new SqlParameter[_arguments.Count]; // Dynamisk
   
    int i=0;

    foreach (object key in _arguments.Keys)
    {
      prms[i] = new SqlParameter (key.ToString(), arguments[key]);
      i++;
    }

    SqlHelper.ExecuteNonQuery(_conn, CommandType.StoredProcedure, cmdTxt, prms);
    CloseDB(_conn);
}

Jeg ved ikke hvorfor du har nogle globale variabler du sætter? Bruger du _arguments og _cmdText til noget andet?
Avatar billede mikkelbm Nybegynder
11. marts 2006 - 14:57 #24
Og underscore skal så lige fjernes fra arguments :)
Avatar billede decrypto Nybegynder
11. marts 2006 - 15:01 #25
Nope, det er min private variable, som sættes lig med arguments et andetsteds. Jeg fik ikke kopieret det hele med kan jeg se.

Jeg har dog stadigvæk problemer med at få mine values ud i den samme løkke.
Avatar billede mikkelbm Nybegynder
11. marts 2006 - 15:03 #26
Hvad er det for problemer?

I mit sidste eksempel sættes value i constructoren på SqlParameter. Og det er ikke til at sige om fejlen kommer i den kode du har vist eller om den kommer i din SqlHelper.
Avatar billede decrypto Nybegynder
11. marts 2006 - 15:07 #27
Hmm, jeg ved ikke om det blev et hack. Men følgende giver mig det jeg ønskede.

Løkke{
      prms[i] = new SqlParameter();
      prms[i].ParameterName = key.ToString();
      prms[i].Value = _arguments[prms[i].ParameterName].ToString();
}
Avatar billede decrypto Nybegynder
11. marts 2006 - 15:08 #28
Smid et svar ind. Jeg giver dig point, fordi du kunne guide mig lidt igennem. Mange tak. :O)
Avatar billede mikkelbm Nybegynder
11. marts 2006 - 15:10 #29
prms[i] = new SqlParameter(key.ToString(), _arguments[key].ToString());

Burde give det samme :)
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