[ Neznalica_sa_ugla @ 09.07.2008. 20:56 ] @
Imam program , koji se konektira na ms sql2005, i verziju koja se konektira na acces, zatim sam napravio verziju koja radi sa obe baze ali sam u kodu pravio if( baza="sql") <kod > if (baza="acc") <kod> to svaki put kada pravim konekciju , read ili data set i to mi je malo bezveze .Htio sam naoraviti jednu klasu koja bi mi vratila konekciju , reader , ili data set zavisno od vrijednosti varijable baza i to onoga tipa sql ili oledb , a poslije u cijelom programu koristio taj obijekt . Ali to nikako da uspijem .Probao sam sa #if , sa template , ..... . Da li ima neko neke preporuke ??? Unaprijed hvala.
[ bags @ 09.07.2008. 21:13 ] @
Jesi li probao sa staticnom klasom na nivou aplikacije?
[ Neznalica_sa_ugla @ 09.07.2008. 21:32 ] @
Da, ali mi problem koji obijekt vraca, moram ga definirati , a kada to ucinim onda moze biti drugi tip obijkta i prijavi gresku :
[ sallle @ 10.07.2008. 01:36 ] @
dve ideje:

1. koristi oledb drajver (i za mssql i za access), samo menjaj konekcioni string

2. u aplikaciji koristi staticke metode (koje ce u svom telu da imaju if (mssql) kod, if (acc) kod)
public static DataTable GetTable()
public static int ExecuteCmd()
public static int ExecuteSP
...
[ Neznalica_sa_ugla @ 10.07.2008. 10:48 ] @
PA taj slucaj sa if imam i bas mi izgled nezgrapno i ruzno , i sa puno if , if , if .Mislio sam kod uciniti preglednijim , i kvalitetnijim .Imam pusto ifova samo po sebi , (progrma ima preko 40 *.cs i svaki ima preko nekoliko stotina linija - do nekolko hiljada ) i kada dodam ovo izgleda stvarno traljavo , s tim da u svaku cs moram ukljuciti oledb i sql .Mislio sam da na nivou aplikacije postoji jednostavnije riješenje . Recimo klasa koja vrati tip veze , tim ridera , tip dataseta , zavisno od neke varijable koju i onako imamam u Registru
u kome jeste definirano koju ce bazu koristiti . Problem nastaje sa pisanjem te klase.. Ako ima jos ko kakvu ideju ......
[ Shaggy @ 10.07.2008. 11:59 ] @
Problem bi mogao da resis sa Interface-om

Definises interface IBaza koji ima metode GetDataTable, ExecuteScalar, ExecuteNonQuery, ExecuteSP... koje vec metode imas u tvojoj aplikaciji

Onda napravis dve klse koje nasledjuju IBaza

Jedna Klasa npr SQLBaza ce u svojim metodama imati kod koji radi sa SQL Bazom, a AccessBaza klasa ce u metodama imati kod koji radi sa AccessBazom
(Posto kalse nasledjuju interface IBaza one moraju imate metode - GetDataTable, ExecuteScalar, ExecuteNonQuery, ExecuteSP... ili se kod nece kompajlirati...)

I jedna klasa koja ce ti vracati odredjeni objekat u zavisnosti od settings-a:

npr:
public class DBCreator
public static IBaza GetDataBase()
{
IBaza baza = null;
if (SQL)
baza = new SQLBaza();
else
baza = new AccessBaza();
return baza;
}

Posle u drugim delovima aplikacije kad god treba da radis za bazom kazes:

IBaza baza = DBCreator.GetDataBase();
DataTable dt = baza.GetDataTale("SELECT * FROM TABELA");
DataGrid1.DataSource = dt;


Nadam se da je dovoljno od pomici...

Pozdrav,

Misa
[ Neznalica_sa_ugla @ 16.07.2008. 14:42 ] @
Jos kakvih ideja, pa zar niko to nije pokusao?????
[ Shaggy @ 16.07.2008. 16:22 ] @
Hm... Jesi li pokusao uopste ovo gore opisano?

To je standardan metod za resavanje problema Razlicitih Baza

Jedna aplikacija radi potpuno isto - bez obzira koja je baza u pozadini...

[ Neznalica_sa_ugla @ 16.07.2008. 20:06 ] @
Bicu iskren nisam, odgovor sam video tek poslije kada sam napisao poruku .Sada cu to prtobati !!!
[ Neznalica_sa_ugla @ 16.07.2008. 20:34 ] @
Cini mi se ovo obecava , ali problem : ExecuteNonQuery() kako to implementirati????
Kako stvoriti obijekte : konekcije, komande , dataset ?

[Ovu poruku je menjao Neznalica_sa_ugla dana 17.07.2008. u 02:55 GMT+1]
[ Neznalica_sa_ugla @ 22.07.2008. 14:45 ] @
Ljudi ovo nisam rjesio , POMAGAJ TE ::
[ DarkMan @ 22.07.2008. 20:41 ] @
Evo to primer klase kojom mozes da se konektujes na tri baze: MS Sql Server, Sql Server Compact Edition i Access.

Code:

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Data.OleDb;
using System.Data.SqlClient;
using System.Data.SqlServerCe;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication1
{
    public sealed class SQL
    {
        public static string CreateConnectionString(string server, string username, string password, string database)
        {
            int timeout = 10;
            server = (server != null && server.Length > 0 ? "Data Source=" + server + ";" : "Data Source=(local);");
            string login = "Integrated Security=SSPI;";
            if(username != null && username.Length > 0) {
                if(password != null && password.Length > 0)
                    login = "User ID=" + username + ";Password=" + password + ";";
                else
                    login = "User ID=" + username + ";Password=\"\";";
            }
            string catalog = "Initial Catalog=" + (database != null && database.Length > 0 ? database : "master");
            return server + login + catalog + (timeout > 0 ? ";Connect Timeout=10" : "");
        }

        public static string CreateConnectionString(string fileName, string password)
        {
            if(!string.IsNullOrEmpty(fileName)) {
                string cs = "Data Source=" + fileName;
                if(password != null && password.Length > 0) cs += ";Password=" + password + ";";
                return cs;
            }
            return "";
        }

        public static ConnectionStringType GetConnectionStringType(string connectionString)
        {
            if(!string.IsNullOrEmpty(connectionString)) {
                string connectionStringLower = connectionString.ToLower();
                if(connectionStringLower.Contains(".sdf")) return ConnectionStringType.SqlServerCe;
                if(connectionStringLower.Contains(".mdb")) return ConnectionStringType.Access;
                return ConnectionStringType.SqlServer;
            }
            return ConnectionStringType.None;
        }

        public static DbConnection GetConnection(string connectionString)
        {
            switch(GetConnectionStringType(connectionString)) {
                case ConnectionStringType.SqlServer:
                    return new SqlConnection(connectionString);
                case ConnectionStringType.SqlServerCe:
                    return new SqlCeConnection(connectionString);
                case ConnectionStringType.Access:
                    return new OleDbConnection(connectionString);
            }
            return null;
        }

        public static DbDataAdapter GetDataAdapter(string connectionString, string query)
        {
            switch(GetConnectionStringType(connectionString)) {
                case ConnectionStringType.SqlServer:
                    return new SqlDataAdapter(query, connectionString);
                case ConnectionStringType.SqlServerCe:
                    return new SqlCeDataAdapter(query, connectionString);
                case ConnectionStringType.Access:
                    return new OleDbDataAdapter(query, connectionString);
            }
            return null;
        }

        public static DbCommand GetCommand(string connectionString, string query)
        {
            DbConnection connection = GetConnection(connectionString);
            if(connection != null) {
                switch(GetConnectionStringType(connectionString)) {
                    case ConnectionStringType.SqlServer:
                        return new SqlCommand(query, connection as SqlConnection);
                    case ConnectionStringType.SqlServerCe:
                        return new SqlCeCommand(query, connection as SqlCeConnection);
                    case ConnectionStringType.Access:
                        return new OleDbCommand(query, connection as OleDbConnection);
                }
            }
            return null;
        }

        public static DataTable ExecuteQuery(string connectionString, string query)
        {
            DataTable dataTable = new DataTable();
            DbDataAdapter adapter = null;
            try {
                adapter = GetDataAdapter(connectionString, query);
                if(adapter != null) adapter.Fill(dataTable);
            } catch(Exception ex) {
                MessageBox.Show(ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            if(adapter != null) try { adapter.Dispose(); } catch { }
            return dataTable;
        }

        public static int ExecuteNonQuery(string connectionString, string statement)
        {
            if(!string.IsNullOrEmpty(statement)) {
                DbConnection con = null;
                DbCommand cmd = null;
                int result = -1;
                try {
                    con = GetConnection(connectionString);
                    con.Open();
                    cmd = con.CreateCommand();
                    cmd.CommandText = statement;
                    result = cmd.ExecuteNonQuery();
                } catch(Exception ex) {
                    MessageBox.Show(ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                if(cmd != null) try { cmd.Dispose(); } catch { }
                if(con != null) try { con.Close(); con.Dispose(); } catch { }
                return result;
            }
            return 0;
        }


        public static void DisplayDataTable(DataTable table)
        {
            Form form = new Form();
            DataGridView grid = new DataGridView();
            grid.DataSource = table;
            grid.Dock = DockStyle.Fill;
            form.Controls.Add(grid);
            form.Size = new Size(800, 600);
            form.StartPosition = FormStartPosition.CenterScreen;
            form.ShowDialog();
            grid.Dispose();
            form.Dispose();
        }
        
    }

    public enum ConnectionStringType
    {
        None,
        SqlServer,
        SqlServerCe,
        Access
    }
}



Evo ti primer konektovanja na Sql Server.
Code:

            string connectionString = SQL.CreateConnectionString("", "", "", "PROBA");
            DataTable dataTable = SQL.ExecuteQuery(connectionString, "select * from dbo.sysobjects"); 
            SQL.DisplayDataTable(dataTable);


Nadam se da ce ti pomoci.
Pozdrav.
[ Neznalica_sa_ugla @ 25.07.2008. 01:15 ] @
Da ,ovo je pomoglo . HVALA .
Sam sam kriv koliko izmjena ?? *--- auuu */-
Ipak puno hvala !!!!