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.
Connektiranje na više baza
Zaključano
Zakačeno
Jesi li probao sa staticnom klasom na nivou aplikacije?
Potpis
Free advice is seldom cheap.
Da, ali mi problem koji obijekt vraca, moram ga definirati , a kada to ucinim onda moze biti drugi tip obijkta i prijavi gresku :
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
...
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
...
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 ......
u kome jeste definirano koju ce bazu koristiti . Problem nastaje sa pisanjem te klase.. Ako ima jos ko kakvu ideju ......
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
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
Potpis
Misa Simic
MCSD .NET
MCSD .NET
Jos kakvih ideja, pa zar niko to nije pokusao?????
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...
To je standardan metod za resavanje problema Razlicitih Baza
Jedna aplikacija radi potpuno isto - bez obzira koja je baza u pozadini...
Potpis
Misa Simic
MCSD .NET
MCSD .NET
Bicu iskren nisam, odgovor sam video tek poslije kada sam napisao poruku .Sada cu to prtobati !!!
izmenjeno 1 put, poslednji put Neznalica_sa_ugla 17.07.2008. u 02:55
Izmene poruke
- Neznalica_sa_ugla17.07.2008. u 02:55zapis iz teksta poruke
Cini mi se ovo obecava , ali problem : ExecuteNonQuery() kako to implementirati????
Kako stvoriti obijekte : konekcije, komande , dataset ?
Kako stvoriti obijekte : konekcije, komande , dataset ?
Ljudi ovo nisam rjesio , POMAGAJ TE ::
Evo to primer klase kojom mozes da se konektujes na tri baze: MS Sql Server, Sql Server Compact Edition i Access.
Evo ti primer konektovanja na Sql Server.
Nadam se da ce ti pomoci.
Pozdrav.
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
}
}
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);
string connectionString = SQL.CreateConnectionString("", "", "", "PROBA");
DataTable dataTable = SQL.ExecuteQuery(connectionString, "select * from dbo.sysobjects");
SQL.DisplayDataTable(dataTable);
Nadam se da ce ti pomoci.
Pozdrav.
Da ,ovo je pomoglo . HVALA .
Sam sam kriv koliko izmjena ?? *--- auuu */-
Ipak puno hvala !!!!
Sam sam kriv koliko izmjena ?? *--- auuu */-
Ipak puno hvala !!!!