Dynamiska parametrar för SP:s med Generic.List
Förord
När ett projekt skall kopplas mot en datakälla som ex. en MySql databas kan det vara bra att återanvända koden för att hämta data. Det är också rekommenderat att använda parametrar för att styra input till SQL frågan vare sig man använder Stored Procedures eller ej, eftersom detta förhindrar att skadliga frågor körs mot databasen då parametrar bara behandlas som parametrar och aldrig som ett kommando.Innehåll
I detta exempel kallar vi denna klass för dbClass i namnrymden WebPuclic. Kom ihåg att deklarera att vi använder MySql.Data.MySqlClient för att koppla upp oss mot datakällan:
using MySql.Data.MySqlClient;
namespace WebPublic
{
public class dbClass
{
public dbClass()
{
}
}
}
public DataTable dtGetBySP(string strStoredProcedure, SPCollection collection)
{
try
{
// Skapa connection mot DB. Hämta connectionstring från web.config
MySqlConnection mySqlConn = new MySqlConnection(ConfigurationManager.ConnectionStrings["MySql"].ToString());
MySqlCommand mySqlCmd = new MySqlCommand(strStoredProcedure, mySqlConn);
mySqlCmd.CommandType = CommandType.StoredProcedure;
// 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();
}
// Instansiera DataAdaptern
MySqlDataAdapter da = new MySqlDataAdapter(mySqlCmd);
// Skapa DataTable och fyll den med data via DataAdaptern
DataTable dt = new DataTable();
da.Fill(dt);
da.Dispose();
// Städa upp
mySqlCmd.Dispose();
mySqlConn.Close();
mySqlConn.Dispose();
return dt;
}
catch
{
return null;
}
}
Först skapar vi en struktur som heter SPType. Där definerar vi de propertys som skall finnas med i vår lista senare, i detta fall då Namn som sträng, värde som objekt och typ som MySqlDbType.
public struct SPType
{
public string Name;
public object Value;
public MySqlDbType Type;
public SPType(string name, object value, MySqlDbType type)
{
Name = name;
Value = value;
Type = type;
}
}
using System.Collections.Generic;
public class SPCollection : List
{
// Skriver över Add() metoden i Generic.List
public void Add(string name, object value, MySqlDbType type)
{
this.Add(new SPType(name, value, type));
}
}
// Konstruktor för dbClass
WebPublic.dbClass db = new WebPublic.dbClass();
// Lägg till SP till vår kollektion
Data.SPCollection collection = new Data.SPCollection();
collection.Add(new db.SPType("startDate", "2006-08-21", MySqlDbType.Date));
collection.Add(new db.SPType("stopDate", "2006-08-27", MySqlDbType.Date));
// Hämta resultatet till en DataTable
DataTable tCurrentAct = db.dtGetBySP("getActivity", collection);
// ... implementation
På detta sätt kan vi skicka in hur många parametrar vi vill till Stored Proceduren vilket är bra eftersom detta oftast varierar.
0 Kommentarer