» »

Napaka pri povezavi z bazo - c#

Napaka pri povezavi z bazo - c#

KernelPanic ::

Spostovani!

Spet bi prosil za pomoc, za katero se vam vnaprej zahvaljujem. Namrec, probam se povezati na tabelo, ki sem jo skreiral, da iz nje preberem dolocene podatke. Tukaj je koda:
        private static bool dbAccuLoadTableExists(string strTableName,
            dsPinusTableAdapters.ACCULOAD_TRANSACTIONSTableAdapter ta)
        {
            bool bSuccess = false;  // function returns this flag

            using (SqlConnection connection = new SqlConnection(ta.Connection.ConnectionString))
            {
                string strQueryCheckTable = String.Format(
                    "IF OBJECT_ID('{0}', 'U') IS NOT NULL SELECT 'true' ELSE SELECT 'false'",
                    strTableName);

                SqlCommand command = new SqlCommand(strQueryCheckTable,
                    ta.Connection);
                command.CommandType = CommandType.Text;
                try
                {
                    connection.Open();
                    bSuccess = Convert.ToBoolean(command.ExecuteScalar());
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
                connection.Close();
            }   // using

            return bSuccess;
        }   // dbAccuLoadTableExists
Ob klicu te funkcije mi try-catch blok vrze exception z vsebino:
ExecuteScalar requires an open and available Connection. The connection's current state is closed.
Torej, ce odprem povezavo do baze, zakaj mi jo server takoj zapre in ko probam pognati query, seveda pride do napake, ker je connection down. Pogledal sem nastavitve serverja, na katerega se povezujem in prejemanje eksternih povezav je VKLOPLJENO. Na racunalniku, kamor se konektam, je izklopljen firewall, tako da res ne vem, kaj bi se bilo. Mi lahko prosim pomagate z kaksnim nasvetom?

S spostovanjem,
M.

Mitja Bonča ::

Očitno ni odprete povezave.
Probaj tako:
 private static bool dbAccuLoadTableExists(string strTableName,
    dsPinusTableAdapters.ACCULOAD_TRANSACTIONSTableAdapter ta)
        {
            bool bSuccess = false;  // function returns this flag 

            using (SqlConnection connection = new SqlConnection(ta.Connection.ConnectionString))
            {
                string strQueryCheckTable = String.Format(
                    "IF OBJECT_ID('{0}', 'U') IS NOT NULL SELECT 'true' ELSE SELECT 'false'",
                    strTableName);

                SqlCommand command = new SqlCommand(strQueryCheckTable,
                    connection); //Spremenil tukaj!
                command.CommandType = CommandType.Text;
                connection.Open();
                try
                {
                    bSuccess = Convert.ToBoolean(command.ExecuteScalar());
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
            return bSuccess;
        }   //  


Če uporablajš "using" keyword, ni potrebno zapirati povezave, ker se samodejno zapre ob izstopu in using bloka.

KernelPanic ::

UUU hvala, zdej pa dela!!!! :D Hvala!!!

Samo se nekaj, zakaj je pa ta metoda staticna? Nasel sem jo preko googla ...

Zgodovina sprememb…

dolenc ::

Da jo lahko direktno kličeš imeRazreda.Funkcija(), ne rabiš objekta delat, rabi pa ne biti statična, odvisno kaj potrebuješ. Pa pri try/catch dodajaj zraven še finally kjer zapiraš konekcijo, dobra praska, če ti kje kdaj kej odleti :)

Mitja Bonča ::

static pomeni, da če imaš to metodo v nekem drugem razredu, ti ni potrebno delati nove instance tega razreda, ampak dostopaš do te metode v tem razredu kar direktono:

//ti si sedaj tukaj (kar v even razredu):
int value = 11;
bool bChecking = Pregled.AliJeToStevilo(value);
if(bChecking)
     MessageBox.Show(Vrednost he število.");
else
     MessageBox.Show("Vrednost ni število.");

//en drug razred za kontrolo:
static class Preged
{
    public static bool AliJeToStevilo(string value)
    {
        int stevilo = 0;
        if(int.TryParse(value, out stevilo))
            return true;
        else
            return false;
    }
}


To je en tak simple primer, zakaj je dobro uporablajti static razrede in metode.
V primeru da metoda "AliJeToStevilo" ni static (in niti ne razred - Pregled), bi moral narediti:
Pregled p = new Pregled();
bool bChecking = p.AliJeToStevilo(value);


Se opazi razliko med ustvaritvijo nove instance razreda in direktnega dostopanaj metode v static razredu?

Zgodovina sprememb…

KernelPanic ::

Ja hvala, takoj mi je bilo jasno!

Ericssony ::

Using uporabi tudi za SqlCommand saj je le-ta tudi IDisposable.

using (SqlConnection sqlConnection = new SqlConnection(ConnectionString))
{
    using (SqlCommand sqlCommand = new SqlCommand())
    {
        try
        {
            sqlCommand.CommandText = "SQL Query";

            sqlCommand.CommandType = CommandType.Text;

            sqlCommand.Connection = sqlConnection;

            sqlConnection.Open();

            sqlCommand.ExecuteNonQuery();
        }
        catch
        {
        }
        finally
        {
            sqlConnection.Close();
        }
    }
}

Mitja Bonča ::

Yep. Prvilno. Drugače bo za GC (Garbage Collector) poskrbel za Dispose objekta. Ampak je vseeno bolje on 100% da to nareiš ti.
Se pravi z uporabo using besede, ali da da kliče instanco razreda sqlCommand:
sqlCommand.Dispose()
;


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

SQL problem

Oddelek: Programiranje
141546 (1164) win64
»

C# INSERT statment ne vpise podatkov

Oddelek: Programiranje
111045 (919) darkolord
»

[Visual C#] TableAdapter

Oddelek: Programiranje
61053 (929) detroit
»

Statistika dijakov, pomoc

Oddelek: Programiranje
211665 (1149) Mitja Bonča
»

[C#] Query in code

Oddelek: Programiranje
261738 (1482) iggy1

Več podobnih tem