Hej! I exemplet används en lagrad procedur, medan du manuellt slänger in SQL-satsen. >Saken är den att jag vill kunna skicka in obegränsat med parametrar till min klass Okej, tack så mycket magnus, dock så har jag delat upp din kod lite grann för att få lite mer förståelse i koden när man använder den. Då ville jag gärna ha en metod för insert, en för delete, en för update så därför gjorde jag även en egen metod för att skapa parametrarna så att jag slipper skriva samma kod tre gånger. Jag har även lagt in lite frågor i koden som jag hoppas att du eller någon kan besvara. Som i din foreach sats så kommer jag inte åt p.Name osv utan har du ärvt classen Parameter i classen DataConnection eller hur har du tänkt det där för jag kan ju inte skapa en ny instans av parameter där för då förlorar jag ju alla värden i den och är det inte dumt att döpa classen till parameter då det redan finns ett inbyggt object eller vad man säger som heter parameter, borde inte ett smartare namn på classen vara ParameterName eller något så att jag inte skriver över "den inbyggda parameter" i fall att jag skulle vilja använda mig utav ms sql istället för mysql nångång? Var nästan mitt i natten så jag trodde inte ens min kod dkulle kompilera :-)Skapa en class
Det är som så att jag sitter och försöker bygga en databasclass i C# som ska kopplas ihop med en mysql databas. Saken är den att jag har kört fast, stenfast. På en vanlig sida för att lägga till lite information kan man t.ex. skriva såhär. MySqlConnection cnn = new MySqlConnection();
try
{
cnn.ConnectionString = strCon;
//Parametrar
MySqlParameter subject = new MySqlParameter("subject", txtSubject.Text);
MySqlParameter news = new MySqlParameter("news", txtNews.Text);
MySqlCommand cmd = new MySqlCommand();
cmd.Connection = cnn;
cmd.CommandText = "INSERT INTO test_news (subject, news) " +
"VALUES (?subject, ?news)";
cmd.Parameters.Add(subject);
cmd.Parameters.Add(news);
cnn.Open();
cmd.ExecuteNonQuery();
}
catch (MySqlException ex)
{
Response.Write( "Något gick fel (" + ex.Message + ")");
}
finally
{
cnn.Close();
}
Saken är den att jag vill kunna skicka in obegränsat med parametrar till min class.
Jag hittade den har artikeln här på pellesoft, det verkar vara något liknande det jag är ute efter http://www.pellesoft.se/area/articles/article.aspx?artid=973
Dock så förstår jag inte allt riktigt, vart t.ex. har han sin CommandText där han i sitt fall ska köra en SELECT sats?
Jag skulle uppskatta om någon kunde hjälpa mig att få det här att fungera. Visa hur man kan dela upp koden som jag visade och visa hur man använder sig utav classen ute på vanliga sidan.
Säg att man t.ex. har gjort en egen metod utav Parametersatsen i classenpublic void MakeParameter()
{
// Skapa parametrar utifrån de som sparats i kollektionen
for (int i = 0; i < collection.Count; i++)
{
mySqlCmd.Parameters.Add(collection[i].Name.ToString(), collection[i].type).Value = collection[i].Value.ToString();
}
}
Och då visa hur jag skriver på min vanlig sidan (ex. Default.aspx.cs)
För att lägga till mina parametrar i den metoden. Ja visa hur det här fungerar som sagt för jag har kört fast och behöver få se hur det här fungerar.
Hoppas att ni förstår vad jag är ute efter, fråga annars.
Hjälpa mig med att bygga en metod i classen som antingen lägger till eller skriver ut information så att jag ser hur det funkar, får man se en del så förstår man ska bygga vidare med resten.
Sv: Skapa en class
Är det tänkt att du ska ha en metod som sköter alla dina databasanrop eller ska du bara köra mot en och samma tabell med 0-n parametrar?
Det enklaste sättet är att göra som i exemplet, genom att ha som inparameter någon form av collection. Du kan egentligen använda vad du vill: ArrayList, Hashtable, List<>.
Väldigt förenklat exempel:
public static void DatabaseCall(ArrayList parameters)
{
MySqlConnection cnn = new MySqlConnection();
MySqlCommand cmd = new MySqlCommand();
cmd.Connection = cnn;
string strParaName = "";
string strParaVal = "";
foreach (Parameter p in parameters)
{
cmd.Parameters.Add(new MySqlParameter(p.Name, p.Value)
strParaName = strParaName + "," + p.Name;
strParaVal = strParaVal + ",?" + p.Name;
}
cmd.CommandText = "INSERT INTO test_news (" + strParaName + ")VALUES(?" + strParaVal + ");";
cnn.Open();
cmd.ExecuteNonQuery();
cnn.Close();
}
Väldigt enkelt och inte det snyggaste sättet direkt.
För att detta ska funka behöver du klassen Parameter:
public class Parameter
{
public Parameter(string name, string val)
{
Name = name;
Value = val;
}
public string Name;
public string Value;
}
För att göra databasanropet gör du följande:
ArrayList lista = new ArrayList();
lista.Add(new Parameter("subject", "Träning"));
lista.Add(new Parameter("news", "Statistik har visat att träning ger färdighet."));
// Forsätt lägg till parametrar tills du tröttnar.
DataBaseCall(lista);
Detta är ett fult exempel, klockan är sent :-)
Sv: Skapa en class
Varför det? Klassen skall väl innesluta något objekt och ha metoder för att skapa, hämta och uppdatera objektet. Objektet måste väl ha ett begränsat antal fält som kan förändras.
(Vad menar du med att skicka parametrar till en klass?)Sv:Skapa en class
public class DataConnection
{
//variabler
string _strTableName;
string _strParaName = "";
string _strParaValue = "";
MySqlConnection cnn = new MySqlConnection();
MySqlCommand cmd = new MySqlCommand();
public DataConnection()
{
//
// TODO: Add constructor logic here
//
}
public String TableName
{
get { return _strTableName; }
set { _strTableName = value; }
}
public void MakeParameters(ArrayList parameters)
{
foreach (Parameter p in parameters)
{
//Här hittar jag inte p.Name osv, har du använt dig utav arv eller något liknande?
cmd.Parameters.Add(new MySqlParameter(p.Name, p.Value));
_strParaName = _strParaName + "," + p.Name;
_strParaValue = _strParaValue + "," + p.Value;
}
}
public void Insert()
{
try
{
cmd.Connection = cnn;
cmd.CommandText = "INSERT INTO " + _strTableName + "(" + _strParaName + ")VALUES(?" + _strParaValue + ");";
cnn.Open();
cmd.ExecuteNonQuery();
}
catch
{
//Finns det något man kan lägga till i catch? O.o
}
finally
{
cnn.Close();
}
}
}
public class Parameter
{
//Variabler
string Name;
string Value;
public Parameter(string name, string value)
{
Name = name;
Value = value;
}
}
private void AddData()
{
DataConnection DataCon = new DataConnection();
DataCon.TableName = "test_news";
ArrayList lista = new ArrayList();
lista.Add(new Parameter("subject", "Min första nyhet"));
lista.Add(new Parameter("news", "Det här var skoj, äntligen händer det lite på sidan"));
DataCon.MakeParameters(lista);
DataCon.Insert();
}
Finns det något bättre sätt att lösa det här på eller är det här sättet helt fel på något sätt?
Martin > Kolla på vad magnus svarade, han förstod vad jag menade och jag vill kunna skicka in obegränsat med parametrar för att kunna använda samma klass på olika sidor.
Sv: Skapa en class
Anledningen till att du inte kommer åt p.Name är att du deklarerat variablerna i klassen som privata. Anger du inte åtkomst-level blir de automatiskt privata.
Parameter-klasen borde i så fall se ut som så här kanske:
public class Parameter
{
private string m_name;
private string m_value;
public Parameter(string name, string val)
{
m_name = name;
m_value = val;
}
public string Name
{
get{return m_name;}
}
public string Value
{
get{return m_value;}
}
}
Sen är det alltid bra att fånga exceptions i catch-statements och sen logga dem någonstans. Annars har du inte alls samma koll på var och hur ofta din kod kraschar.
Du kan till och med fånga specifika exceptions om du vill göra olika saker med dem.
try
{
// Gör lite grejer
}
catch (SqlException ex)
{
// Specifikt databasrelaterat fel
}
catch (Exception ex)
{
// alla andra fel
}
Personligen föredrar jag att skapa olika klasser för olika objekt, göra de statiska och köra statiska metoder. Det blir en hel del mer kodande, men det händer ofta att man vill göra något speciellt i metoderna, och då blir det jobbigt om allt är samlat i ett. Funkar kanske helt ok för insert och delete, men select brukar man alltid tweaka SQL:en ordentligt efter ett tag.
Ett annat tips är att kolla lite på lagrade procedurer, då flyttar du över mycket av själva databas-exekveringen till databasen och det blir snyggare och enklare kod.