połączenie z bazą .sdf w C#

Odpowiedz Nowy wątek
2011-07-24 10:11
0

Witam serdecznie i proszę o pomoc.

Piszę aplikację okienkową w C# (Visual C# 2010 Express) napisałem fukcję własną (w pliku Program.cs) pod funkcją main(). Jedynym zadaniem mojej funkcji jest pobrać z dane z tabeli bazy danych, aby później do wyników tego wyszukania odwołać się w innyej funkcji. Kod wygląda tak:

 
using System;
....
 
namespace AAA
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
 
        double o_c(string opis); // deklaracja mojej funcji
        static void Main()
        {
            "(...)"
        }
        double o_c(string opis)
        {
            SqlCeConnection ocena = new SqlCeConnection("(...).sdf");
            ocena.Open();
 
            string o_o = opis;
            SqlCeDataAdapter DA_oc = new SqlCeDataAdapter("SELECT (...)", ocena);
            DataSet d_o = new DataSet();
            d_o.Tables.Add("w_s");
            DA_oc.Fill(d_o, "w_s");
 
            foreach (DataRow r_o in d_o.Tables[0].Rows)
            {
                string op_o = r_o["w_s"].ToString();
                double o_oc = Convert.ToDouble(op_o);
 
                return o_oc;
            }
 
            ocena.Close();
        }
    }

Proszę o pomoc gdzie popełniam błąd, że Visuala C# zgłasza następujący błąd "not all code paths return a value". Z góry dziękuję za wszystkie podpowiedzi i sugestie dla owicjusza jakim jestem.

Pozdrawiam

Pozostało 580 znaków

2011-07-24 10:14
0

Przecież kompilator jasno Ci mówi, że nie zawsze zwracasz wartość z funkcji. Co będzie, jeżeli d_o.Tables[0].Rows będzie puste, czyli pętla się nie wykona? Jaką wartość zwróci funkcja?

Pozostało 580 znaków

2011-07-24 10:16
0

return jest w ogóle w złym miejscu, bo wewnątrz pętli.

Pozostało 580 znaków

2011-07-24 15:56
0

Błąd bierze się stąd, że jeśli pętla foreach nie wykona się ani razu, to ani razu nie zostanie wywołany return, a tak być przecież nie może - metoda (nie void) zawsze musi coś zwrócić.

Skoro foreach wykonuje się tylko raz, to równie dobrze mogłoby go nie być.
Metoda o_c (BTW, nazewnictwo jest w tym kodzie genialne) zwraca double. Dedukuję, że z bazy też jest pobierana pojedyncza wartość. Może zatem zamiast używać DataAdapterów i DataSetów lepiej byłoby użyć zwykłego SqlCommand i metody ExecuteScalar?


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."

Pozostało 580 znaków

2011-07-24 20:18
0

Witam ponownie,

idąc tropem waszych podpowiedzi kombinuję tak:

 
using System;
// (...)
namespace AAA
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
 
        double o_c(string opis);
        static void Main()
        {
            // (...)
        }
        double o_c(string opis)
        {
            SqlCeConnection oc = new SqlCeConnection("(...).sdf");
            oc.Open();
 
            string op_o = opis;
            SqlCeDataAdapter DA_oc = new SqlCeDataAdapter("SELECT (...) WHERE aaa ='" + opis_oceny + "'", oc);
            DataSet ds_oc = new DataSet();
            ds_oc.Tables.Add("w_s");
            DA_oc.Fill(ds_oc, "w_s");
            // policzyć liczbę wierszy w wynikowej tabeli "w_s"
            int liczba_wierszy = ds_oc.Tables["w_s"].Rows.Count;
 
            if (liczba_wierszy != 0)
            {
            foreach (DataRow row_ocena in dataset_ocena.Tables[0].Rows)
                {
                string op_oceny = row_ocena["wartość_stopnia"].ToString();
                double o_oceny = Convert.ToDouble(op_oceny);
                return o_oceny;
                }
            }
            else
            {
            double o_oceny = 0;
            return o_oceny;
            }
 
            oc.Close();
        }
    }
}

Wiem, że robię błąd ale problem w tym, że nie wiem gdzie? Proszę wskarzcie mi te błędy. Z góry dziękuję.

Pozostało 580 znaków

2011-07-24 21:20
0

Pozwolę sobie zacytować siebie:
Co będzie, jeżeli d_o.Tables[0].Rows będzie puste, czyli pętla się nie wykona?
Masz powiedzieć kompilatorowi jasno, co wtedy funkcja ma zwrócić.

edytowany 1x, ostatnio: Afish, 2011-07-24 21:20

Pozostało 580 znaków

2011-07-25 16:18
0

Witam,

Oto co wykombinowałem do tej pory:

 
using System;
// (...)
namespace AAA
{
    static class Program
    {
        double o_c(string opis); //Error    1: 'ocena_cechy': cannot declare instance members in a static class 
        [STAThread]
        static void Main()
        {
            // (...)
        }
        double o_c(string opis) //Error 2: Type 'AAA.Program' already defines a member called 'ocena_cechy' with the same parameter types; Error 3: 'o_c': cannot declare instance members in a static class
 
        {
            SqlCeConnection ocena = new SqlCeConnection("(...).sdf");
            ocena.Open();
 
            string op_o = opis;
            SqlCeDataAdapter DA_ocena = new SqlCeDataAdapter("SELECT (...) WHERE opis_st ='" + opis_oceny + "', ocena);
            DataTable datatable_oc = new DataTable();
            DA_ocena.Fill(datatable_oc);
 
            if (datatable_oc.Rows.Count == 0)
            {
                double o_oceny = 0;
                return o_oceny;
            }
            else
            {
                string op_oceny = datatable_oc.Rows.ToString();
                double o_oceny = Convert.ToDouble(op_oceny);
                return o_oceny;
            }            
        }
    }
}

W kod wpisałem również również komunikaty, które wyrzuca Visual C# 2010 Express. Z góry dziękuję za podpowiedzieć co z nimi zrobić?

Pozdrawiam

Pozostało 580 znaków

2011-07-25 18:59
1

Umiesz czytać? Wiesz, co po polsku oznacza "cannot declare instance members in a static class" ?

Pozostało 580 znaków

2011-07-25 21:24
0

Ok doczytałem o "cannot ...". Może dostanę jakąś wskazówkę gdzie doczytać, lub jak się pozbyć Error: Type 'AAA.Program' already defines a member called ' ' with the same parameter types.

Z góry dziękuję.

Pozdrawiam

Pozostało 580 znaków

2011-07-25 21:48
0
zxcvbnm1 napisał(a)

Ok doczytałem o "cannot ...". Może dostanę jakąś wskazówkę gdzie doczytać, lub jak się pozbyć Error: Type 'AAA.Program' already defines a member called ' ' with the same parameter types.

Z góry dziękuję.

Pozdrawiam

dwa razy napisałeś funkcję o tej samej nazwie i tych samych parametrach

w C# nie ma czegoś takiego jak "deklaracja funkcji" (forward declaration) i nie jest potrzebna bo kolejność implementacji funkcji jest bez znaczenia


Pół giga extra na dropboxie? Pół giga extra na dropboxie! Tyle wygrać! >>Klik here<<
edytowany 4x, ostatnio: unikalna_nazwa, 2011-07-25 21:59

Pozostało 580 znaków

2011-07-26 08:57
0

Ok, usunołem deklaracje funkcji z Program.cs ale pojawił się kolejny błąd (nadmienię, że idąc tym tropem usunołem również deklarację funkcji z pliku samoocena (jedno z okienek mojej aplikacji), w którym odwołuje się do wyników tej funkcji:

 
double o_cechy_01 = o_c(opis_01); // podstawiam wynik funkcji 

Problem polega na tym, że kompilator woła "Error 1: The name 'o_c' does not exist in the current context"

Co robić?

Z góry dziękuję za odpowiedź.

Pozdrawiam.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0