Tema: Re: MSSQL ir duomenu masyvai
Autorius: Jornada Del Muerto
Data: 2011-08-29 15:24:57
    Va cia irgi idomu :) tiesiog pakolkas naudoju savo suburta funcionaluma :) kuris tiesa pasakius kaip ir veikia ir veikia greitai, bet ner pats geriausias sprendimas kada ant web serviso metodo uzkabinamas procesas kuris ciklu kruva duomenu irasineja i db... tarp kitko del to teko labai rimtai ziureti indeksavima ir visa kita DB performance, kad toks procesas vyktu greitai, dabar taip ir veikia, bet pats suprantu kad tai ne idealus sprendimas ir ner labai gerai taip daryti :)

    Siuo metu paduodama funkcijai: 
    1. SQL uzklausos pattern'as, pvz.: EXEC SqlProcedura {0}, {1}, {2}
    2. DataTable - kurioje tik kintantys duomenys
    3. string[] { 'patterno format tvarka', ' einantys laukai' } 

    Tiesiog jeigu 3 parametro masyve string prasideda @ simboliu tai suprantama kaip stulpelio is DataTable duomenu laukas, jei priekyj ner @ tai rasoma reiksme esanti 3 parametro string. Viskas labai paprasta :)

    Gal ka sudomins tokia egzotika, nes atvejais kada duomenu ner labai daug tai dar priimtina:

  public void SqlBulkQuery (
   string pattern,
   DataTable table,
   string[] values)
  {
   Authorize ();
   
   string sql = string.Empty;

   try
   {
    // let's decode pattern
    string decodedPattern = Decrypt.Ecryption.Decrypt (pattern);

    // prepare simple values
    List<string> cleanValues = new List<string> ();

    foreach (string value in values)
    {
     if (value[0].Equals ('@'))
     {
      cleanValues.Add (value);
     }
     else
     {
      cleanValues.Add (Fix.FixString (value));    // fixString apsauga nuo injekciju
     }
    }

    _Db.Connect (true, true);

    foreach (DataRow row in table.Rows)
    {
     List<object> parameters = new List<object> ();

     foreach (string value in cleanValues)
     {
      if (value[0].Equals ('@'))
      {
       object rawRowValue = row[value.Substring (1)];

       // analizuojam DataTable value tipa ir pagal tai atliekam formatavima, paprastai decimal naudoju
       // paprastai decimal naudoju money tipui
       if(rawRowValue is decimal)
       {
        parameters.Add (rawRowValue.ToString ().Replace (",", "."));
       }
       else if (rawRowValue is Boolean)
       {
        parameters.Add (Fix.FixBool (Convert.ToBoolean (rawRowValue)));    // bool paverciamas 1/0
       }
       else
       {
        parameters.Add (Fix.FixString (rawRowValue.ToString ()));    // anti injekcinis string apdirbimas, sudvigubinamos sql kabutes  ' ir t.t... tada jas galima saugiai irasineti i db
       }
       
      }
      else
      {
       // just value
       parameters.Add (value);
      }
     }

     sql = string.Format (
      decodedPattern,
      parameters.ToArray());

     _Db.Execute (sql);
    }

    // no errors, commit
    _Db.Close (true);
   }
   catch (Exception ex)
   {
    // errors found, rolling back
    _Db.TransactionStop (false);
    _Db.Close ();
    throw new AlphaException (
     "Gateway::SqlBulkQuery [" + sql + "] error [" + ex.Message + "]",
     ex);
   }
  }

Gan paprasta ir perdavineti reikia tik duomenis table ir taupu nes statines reiksmes perduoda kaip reiksmes, pvz.:

DataTable t = new DataTable('T');
t.Columns.Add("id");
t.Columns.Add("data");

// daleiskim sourceDataTable laiko id ir data reiksmes kuriu mum reikia
// nauja table formuojama tam kad neimti kitu sourceDataTable reiksmiu kuriu nereik webservisui
foreach( DataRow sourceRow  in sourceDataTable.Rows){
    DataRow newRow = t.NewRow();

    newRow["id"] = sourceRow["id"];
    newRow["data"] = sourceRow["data"];

    t.Rows.Add(newRow);
}

Helpers.SqlBulkQuery (
    "ProcedurosVardas {0}, '{1}', {2}",
    t,
    new string [] { "@id", "@data", "7" });

7 yra 3 sql proceduros parametras, kadangi priekyje ner @ tai bus imama tiesiog 7, jei butu @ butu imamas laukas is datatable, viskas trivialiai.

JDM.


"zZz" <zZz@zirzilia.lt> wrote in message news:j3fdor$glr$1@trimpas.omnitel.net...
> Jei xml netiks - gali apsirašyt User-Defined Table Types'ą ir siuntinėti kaip datatable :)
> 
> "Jornada Del Muerto" <Jornada@Lythum.lt> wrote in message news:j3b6r1$gr1$1@trimpas.omnitel.net...
>> Sveiki,
>> 
>>    Ieskau metodo kaip i MSSQL nukrauti kazkoki masyva informacijos, na procedurai eina paduoti parametrus, bet ne masyva, pvz yra n irasu kuriuos reikia irasyti i DB... 
>> 
>>    Manoji sistema tai webservisas kuris per universalia funkcija cikliuku visus apdirba, bet tai nera labai gerai jei duomenu daug... kiek zinau nuo MSSQL 2005 galima savo MSSQL Assembly parasyti, gal su jais eina?
>> 
>>    Kalba ne apie masyvus string[] ar int[], o apie didelius masyvus, kaip datatable su pvz 5-10 lauku prie kiekvieno iraso, kur pvz. prie kazkokio DB iraso i kita lenta generuojama pvz 300 ir daugiau irasu, ar net medine struktura, geriausiai butu viska atiduot MSSQL vykdyti, o ne ciklais su Webservisu irasineti, nes jei servas durnai konfiguruotas tai at tokio proceso pamano kad jis pakibo nes ilgai nerespondina ir ji killina...
>> 
>>    Jei kas nors kazka panasaus darete ir galit info pasidalint kokiu budu,  tai butu didelis dekui, tiesiog kuriu sistema imonei kur kartais kuriami uzsakymai, pvz reklamos platinimui per visa lietuva ir susizymi ivairias apskritis, miestus, rajonus, laiskanesiu zonas kur kiek jos pristatyti, tai kuriant nauja uzsakyma eina prie jo daug info, bet ne vien tam, niekas nedaroma tiesiogiai per ADO.NET, o keliauja i Webservice...
>> 
>> JDM.