Treba vam CSV lista sa kolonama iz tabele?
Koristite CURSOR?
Nemojte više, može mnogo brže :)


USE Northwind
GO

DECLARE @Lista nvarchar(max) = ''

SELECT @Lista = @Lista + ', ' + CustomerID
FROM Customers
ORDER BY CustomerID

-- na kraju malo seckanja stringa i ispis
PRINT SUBSTRING (@Lista, 3, LEN (@Lista)-2)


Rezultat:

ALFKI, ANATR, ANTON, AROUT, BERGS, BLAUS, BLONP,...

SQL Server 2008 nudi build-in opcije za rad sa sertifikatima, simetricnim i asimetricnim kljucevima.
TDE (Transparent Data Encryption) nudi mogućnost kriptovanja fajlova baze podataka.
Ovo služi kao odbrana od krađe fajlova baze i ni na koji način ne ograničava sve ostale korisnike da normalno rade sa podacima.

Međutim, moguće je uraditi i kriptovanje na nivou kolone, što može biti jako korisno jer niko (pa ni sa) ne može videti podatke ako nema odgovarajući sertifikat.

Sledi step-by-step TSQL koji ilustruje sve ovo, a na kraju se nalazi clean up segment koji vraća SQL Server u stanje pre pokretanja primera:


 -- 1: Kreiramo test bazu
USE master
GO
CREATE DATABASE EncryptTest

--2: Kreiramo test tabelu i ubacujemo malo podataka
USE EncryptTest
GO
CREATE TABLE TestTable (FirstCol INT, SecondCol VARCHAR(50))
GO
INSERT INTO TestTable (FirstCol, SecondCol)
VALUES
(1,'First'),
(2,'Second'),
(3,'Third'),
(4,'Fourth')

-- Proverimo sadrzaj tabele
USE EncryptTest
GO
SELECT *
FROM TestTable


-- 3: Kreiramo Database Master Key
USE EncryptTest
GO
CREATE MASTER KEY ENCRYPTION BY
PASSWORD = 'SQLAuthority'

-- 4: Kreiramo Encryption sertifikat
USE EncryptTest
GO
CREATE CERTIFICATE EncryptTestCert
    WITH SUBJECT = 'SQLAuthority'

-- 5: Kreiramo simetricni kljuc sa TRIPLE_DES enkripcijom
-- od ostalih simetricnih algoritama na raspolaganju su:
-- DES, TRIPLE_DES, TRIPLE_DES_3KEY, RC2, RC4, RC4_128, DESX, AES_128, AES_192, AES_256
USE EncryptTest
GO
CREATE SYMMETRIC KEY TestTableKey
    WITH ALGORITHM = TRIPLE_DES
    ENCRYPTION BY CERTIFICATE EncryptTestCert

-- Opciono ali vrrrrlo preporucljivo
-- Na fajl sistem snimiti i spremiti na sigurnu lokaciju privatni kljuc i sertifikat
-- i sve to zajedno zastiti passwordom
 USE EncryptTest ;
 GO
 BACKUP CERTIFICATE EncryptTestCert TO FILE =
  'c:\EncryptTestCert_Certificate.cer'
  WITH PRIVATE KEY ( FILE =
  'c:\EncryptTestCert_Cert_Key.pvk',
  ENCRYPTION BY PASSWORD =
  'User-Provided Password' ) ;

-- RESTORE ovako backupovanog sertifikata bi uradili na sledeci nacin:
-- (ne postoji RESTORE CERTIFICATE naredba, vec se koristi CREATE sa 'FROM FILE' klauzulom)
USE EncryptTest;
CREATE CERTIFICATE EncryptTestCert
    FROM FILE = 'c:\EncryptTestCert_Certificate.cer'
    WITH PRIVATE KEY (FILE = 'c:\EncryptTestCert_Cert_Key.pvk',
    DECRYPTION BY PASSWORD ='User-Provided Password');

--6:  Dodajemo kolonu ciji sadrzaj hocemo da kriptijemo (mora biti tipa binary)
USE EncryptTest
GO
ALTER TABLE TestTable
ADD EncryptSecondCol VARBINARY(256)

-- 7:  Azuriramo novu kolonu sa kriptovanim podacima iz kolone "SecondCol"
USE EncryptTest
GO
OPEN SYMMETRIC KEY TestTableKey
DECRYPTION BY CERTIFICATE EncryptTestCert
UPDATE TestTable
SET EncryptSecondCol = ENCRYPTBYKEY(KEY_GUID('TestTableKey'),SecondCol)

-- 8: Pogledamo sadrzaj tabele
USE EncryptTest
GO
SELECT *
FROM TestTable

-- 9: Na kraju kako prikazati dekriptovati podatke iz kolone EncruptSecondCol
USE EncryptTest
GO
OPEN SYMMETRIC KEY TestTableKey
DECRYPTION BY CERTIFICATE EncryptTestCert
SELECT CONVERT(VARCHAR(50),DECRYPTBYKEY(EncryptSecondCol)) AS DecryptSecondCol
FROM TestTable

-- Clean up...
USE EncryptTest
GO
CLOSE SYMMETRIC KEY TestTableKey
GO
DROP SYMMETRIC KEY TestTableKey
GO
DROP CERTIFICATE EncryptTestCert
GO
DROP MASTER KEY
GO
USE master
GO
DROP DATABASE EncryptTest
GO

 

Prilikom instalacije SQL 2005 Developer i Express verzije, dva puta mi se dogodilo da se jednostavno ne instalira MSXML6.0 komponenta, pa samim tim ni database engine i još štošta.
Kada sam probao da instaliram samo MSXML6.0, odmah dobijam sledeću (čudnu) poruku:
"The system administrator has set policies to prevent this installation"

Nije u pitanju Vista, tj. Administrator je stvarno Administrator i sve je radjeno na XP SP2.

Pošto sam eliminisao sve sumnjive polise, različite Antivirusne i Antispy programe i pogasio sve živo od servisa što bi i izdaleka moglo da smeta, našao sam pravo rešenje:

Problem je što se Windows Installer zbog nečega zaglupi i potrebno je resetovati njegov interni info vezan za MSXML6.0.
Na sreću, dragi nam MS je obezbedio alat za to: http://support.microsoft.com/kb/290301

Skinite ga, instalirajte, pokrenite i resetujte settings za MSXML6.0.
Posle ovoga sve radi kako treba.

E sada, zašto se Win Installer zaglupeo još nisam saznao...Party!!!

Posted by Milos.Milosavljevic | with no comments
Filed under:

Slično predhodnom postu, korišćenje XML Open SDK za čitanje komentara iz Word 2007 dokumeta.

Kôd (C#):

string comments;
using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(@"C:\DocSaKomentarima.docx", true))
{
  MainDocumentPart mainPart = wordDoc.MainDocumentPart;
  CommentsPart commentsPart = mainPart.CommentsPart;

  using (StreamReader streamReader = new StreamReader(commentsPart.GetStream()))
  {
    comments = streamReader.ReadToEnd();
    MessageBox.Show (comments);
  }
}

// kraj primera

Da bi ovo radilo napravite nov Word dokument na lokaciji:
C:\DocSaKomentarima.docx i dodajte par komentara.

Rezultat je u var. comments i predstavlja XML prezentaciju komentara u dokumentu sa svim njihovim atributima.
Možda još malo XPath upita i možete izvući sve što vam je potrebno.

U sledećem primeru je prikazano kreiranje novog Word 2007 dokumenta pomoću Open XML SDK.

Prvo je potrebno da preuzmete i instalirate Microsoft SDK for Open XML Formats i u projektu referencirate:

  • Microsoft.Office.DocumentFormat.OpenXml
  • Windows.Base

Pisanje olakšavaju i sledeće using direktive:

  • using Microsoft.Office.DocumentFormat.OpenXml.Packaging;
  • using System.IO;
  • using System.Xml;

Kôd (C#):

const string wordNamespace = "http://schemas.openxmlformats.org/wordprocessingml/2006/main";

using (WordprocessingDocument wordDoc = WordprocessingDocument.Create(@"c:\TestDokument.docx", WordprocessingDocumentType.Document))
{
// Glavni deo dokumenta
MainDocumentPart mainPart = wordDoc.AddMainDocumentPart();
Stream stream = mainPart.GetStream();

XmlWriterSettings settings = new XmlWriterSettings();
settings.Encoding = Encoding.UTF8;
settings.Indent = true;

XmlWriter writer = XmlWriter.Create(stream, settings);
writer.WriteStartDocument(true);
writer.WriteStartElement("w", "document", wordNamespace);
writer.WriteStartElement("w", "body", wordNamespace);

writer.WriteStartElement("w", "p", wordNamespace); // paragraf
writer.WriteStartElement("w", "r", wordNamespace); // red
writer.WriteElementString("w", "t", wordNamespace, "Neki tekst"); //tekst
writer.WriteEndElement(); // end red
writer.WriteEndElement(); // end paragraf

writer.WriteEndElement(); // end body
writer.WriteEndElement(); // end doc
writer.Flush();
writer.Close();
}  
// otvori dokument
System.Diagnostics.Process.Start(@"c:\TestDokument.docx");
Application.Exit();
// kraj primera

Primer kreira Word 2007 dokument na c:\TestDokument.docx

Umesto "Neki tekst" probajte bilo šta drugo, na primer podatke iz baze i sl.

Posted by Milos.Milosavljevic | with no comments
Filed under: , ,

Kada programski kreirate Word 2007 dokument, neophodni minimum predstavljaju sledeći fajlovi:

  • [Content Types].xml
  • .rels
  • i document.xml

raspoređeni u folderima kao što je prikazano na slici.

document.xml naravno predstavlja sadržaj dokumenta.

Posle kreiranja ove strukture, potrebno je sve zipovati i promeniti ekstenziju u docx.


 

Nedavno je Microsoft publikovao set .NET klasa koje značajno olakšavaju rad sa Open XML formatom Office 2007 dokumenata.

Sada je veoma jednostavno pročitati, izmeniti i od nule programski kreirati Word, Excel i PowerPoint dokumente. Urađena je enkapsulacija postupaka koje smo ranije morali ručno da uradimo.

Radi na VS 2005 i naravno na VS2008.

Instalacija je veličine 2.8MB i možete je preuzeti ovde.

Da bi rezultat SELECT naredbe sortirali po slučajnom redosledu prilikom svakog poziva, zgodno je koristiti SQL Server funkciju  NEWID().

Za razliku od, na primer, funkcija RAND (..) i GETDATE(), funkcija NEWID() se procesira za svaki slog result seta.

Na primer:

SELECT *
FROM Person.Address
ORDER BY NEWID()

 Primene zamislite sami Geeked

Nedavno mi je trebalo da, zavisno od situacije, programski prebacim input language na ćirilicu ili latinicu.

Jedna linija koda:

InputLanguage.CurrentInputLanguage = InputLanguage.FromCulture(System.Globalization.CultureInfo.CreateSpecificCulture("sr-Cyrl-CS"));

Za latinicu treba za kulturu uneti: "sr-Latn-CS"

Za US english: "en-US"

Posted by Milos.Milosavljevic | with no comments
Filed under: , ,

Sitan tip... 

Uvek koristim Send To opciju za razne stvari, a zapravo najčešće da otvorim sadržaj bilo kog fajla u Notepad-u.
U Visti se Send To folder ne nalazi na istom mestu gde je bio u XP-u.

U Visti je najjednostavnije u Run dijalogu otkucati: %APPDATA%\Microsoft\Windows\SendTo

%APPDATA% je enviroment varijabla koja se mapira na direktorijum C:\Users\[ime korisnika]\AppData\Roaming

Sad ovde jednostavno napravite potrebne prečice i sve funkcioniše kao i ranije.

Posted by Milos.Milosavljevic | 1 comment(s)
Filed under:

Opet, još jedan jako interesantan članak.
Kako isti kod upotrebiti u Win Forms i Mobile aplikaciji.

Preporuke za portovanje i savlađivanje razlika između ove dve platforme + primer za download.

Link: http://msdn.microsoft.com/msdnmag/issues/07/07/ShareCode/

Posted by Milos.Milosavljevic | with no comments
Filed under:

Interesantan članak o Microsoft Synchronization Services 1.0 API-ju i novom Sync Designeru.

Keš tehnologija koja poboljšava perfomanse i smanjuje latenciju prilikom sinhronizacije podataka + grafičko dizajniranje.

Vredi pogledati:

http://www.ftponline.com/vsm/2007_05/magazine/features/rjennings/

Posted by Milos.Milosavljevic | with no comments

Kada je trebalo automatski generisati primarni ključ tabele koji će biti jedinstven na globalnom nivou standardno se koristilo polje tipa uniqueidentifier i default NewID(). Ovo je bilo bitno ako su se podaci skupljali sa više SQL Servera na jednom centralnom. Scenarije za ovakvu upotrebu nalazimo na svakom koraku.

Problem je u tome što NewID() funkcija generiše vrednosti koje nisu inkrementalne - vrednosti nemaju nikakve veze sa realnim redosledom unosa slogova u tabeli. Ovo je znalo da pravi probleme u smislu perfomansi, jer je uvek optimalnije da vrednosti primarnog ključa u tabeli budu sekvencijane zbog načina kreiranja indeksa koji ide uz primarni ključ i pakovanja podataka u strane. Kod clustered indeksa ovo je još izraženije.

Zbog ovoga u SQL Serveru 2005 je uvedena nova funkcija: NewSequentialID () koja radi slično kao NewID() ali ovog *** generiše sekvencijalne vrednosti.

Probajte sledeći skript:

USE TempDB
GO
CREATE TABLE Test
(
IdentityKolona int identity,
Sekvenca uniqueidentifier DEFAULT NEWSEQUENTIALID()
)

DECLARE @i int
SET @i=0
WHILE @i <= 60000
BEGIN
 INSERT INTO Test DEFAULT VALUES
 SET @i=@i+1
END

-- sortiraj po identity koloni
SELECT * FROM Test ORDER BY IdentityKolona
-- Sortiraj po sekvenci
SELECT * FROM Test ORDER BY Sekvenca
DROP TABLE Test

Na žalost SQL Mobile za sada ne podržava ovu funkciju.

Posted by Milos.Milosavljevic | with no comments
Filed under:

U jednom projektu koji uključuje veliki broj stored procedura na SQL 2005, došlo se do ideje da se napravi jedna generićka funkcija koja za zadati naziv stored procedure i niz objekata (parametri stored procedure) odrađuje sav posao poziva i prosleđivanja parametara.

Da bi ovo napravili bilo je naravno potrebno da se pročitaju parametri i njihovi atributi kako bi se ispravno napravila Parameters kolekcija. Mozda nekome bude interesantna ovakva varijanta SQL upita koji za zadato ime stored procedure vraća definiciju parametara. U primeru korišćena stara dobra Northwind baza i njena stored procedura 'SalesByCategory'. Upit radi na SQL 2000 i 2005 korišćenjem syscolumns sistemske tabele. Probajte:

select
  colid as 'Redosled',
  name as 'Ime parametra',
  type_name(xusertype) as 'Tip',
  xusertype as 'SQLTip',
  length as 'Zauzima bajtova', 
  case when type_name(xtype) = 'uniqueidentifier'
    then xprec 
  else OdbcPrec(xtype, length, xprec)
  end as 'Velicina',
  OdbcScale(xtype,xscale) as 'Skala',
  isoutparam as 'Output param'
from syscolumns
where id = object_id ('SalesByCategory')
order by colid

 

Ako želite da programski otvorite korisniku mobilnog uređaja dijalog za slikanje ili snimanje videa nema potrebe da se mučite sa API pozivima.
Na uređajima sa Windows Mobile 5.0 i 6.0 .NET Compact framework ima sve što je potrebno.

U namespace-u Microsoft.WindowsMobile.Forms se nalaze potrebne klase.
Napravite referencu na ovaj namespace i unesite ga u using direktivu.
Code snippet koji radi slikanje i sliku prikazuje u PictureBox kontroli:

string fileName = string.Empty;
CameraCaptureDialog ccd = new CameraCaptureDialog();
ccd.Mode = CameraCaptureMode.Still;
// ako hocete mozete snimiti i video bez ili sa zvukom, zavisno od toga sta podrzava konkretni uredjaj
//ccd.Mode = CameraCaptureMode.VideoOnly;
//ccd.Mode = CameraCaptureMode.VideoWithAudio;
ccd.Resolution = new Size(800, 600); // ovde vodite racuna da mob. podrzava zadatu rezoluciju
ccd.StillQuality = CameraCaptureStillQuality.High;
ccd.ShowDialog();
fileName = ccd.FileName; // pokupimo ime fajla gde je snimljena slika / video
MessageBox.Show(fileName); // test
pictureBox1.Image = new Bitmap(fileName); // i prikazemo sliku na formi
ccd.Dispose();

Jednostavno Cool
Osim ove funkcionalnosti, Microsoft.WindowsMobile.Forms namespace ima i klase za izbor kontakta i slike sa mobilnog uređaja.
Probajte...