Ok
obiekt dokumentu nie pobiera danych z bazy, dane ma dostarczane przez fabrykę po jego utworzeniu, Obiekt posiada repozytorium do pobierania słowników z bazy.
klasa danych
Zdefiniowana tak
[DataContract]
public class TDaneDokRozny
{
[DataMember]
public TCialoRozny Cialo { get; set; } = null;
[DataMember]
public int dok_id { get; set; } = 0;
[DataMember]
public string NazwaDziennika { get; set; } = "";
[DataMember]
public int NumerDziennika { get; set; } = 0;
...
Kod ładujący dane do obiektu podejście klasyczne
string sql = "SELECT dok_id, nazwadziennika,mies, rok, dziennik, kontrachent_id, " +
" numerdok, datarej, datadok, dataop, datapod, dokwwal ,typdok, waluta, kurs, datakurs, tabelakurs, przelicznik, " +
" brutto, bruttoww, obrotywn, obrotyma, opis" +
" FROM ksiegi_dokumenty_nag where dok_id=" + dok_id.ToString() + ";";
NpgsqlConnection conn = new NpgsqlConnection(connstring);
conn.Open();
Npgsql.NpgsqlCommand cmd = new Npgsql.NpgsqlCommand(sql, conn);
Npgsql.NpgsqlDataReader reader = cmd.ExecuteReader();
reader.Read();
TDaneDokRozny ta = new TDaneDokRozny();
ta.dok_id = reader.IsDBNull(0) ? 0 : reader.GetInt32(0);
ta.NazwaDziennika = reader.IsDBNull(1) ? "" : reader.GetString(1);
ta.miesiac = reader.IsDBNull(2) ? 0 : Int32.Parse(reader.GetString(2));
ta.rok = reader.IsDBNull(3) ? 0 : Int32.Parse(reader.GetString(3));
ta.NumerDziennika = reader.IsDBNull(4) ? 0 : reader.GetInt32(4);
ta.Kontrahent_id = reader.IsDBNull(5) ? 0 : reader.GetInt32(5);
ta.NumerDokumentu = reader.IsDBNull(6) ? "" : reader.GetString(6);
ta.datarej = reader.IsDBNull(7) ? DateTime.Now : reader.GetDateTime(7);
ta.datadok = reader.IsDBNull(8) ? DateTime.Now : reader.GetDateTime(8);
ta.datapod = reader.IsDBNull(9) ? DateTime.Now : reader.GetDateTime(9);
ta.TypDokumentu = reader.IsDBNull(12) ? "" : reader.GetString(12);
reader.Close();
cmd.CommandText = "SELECT dok_id,main_id,waluta,kurs, " +
"nazwa,brutto,bruttoww,kontown,kontoma, " +
"opis,data,datakursu,status,waluta_przelicznik, " +
"datakurs,tabelakurs,datakurs_vat,tabelakurs_vat,przelicznik, " +
"kurs_vat,obrotywn,obrotyma,vat_ue,intrastat,doksiag,rejestrvat,koldek " +
" FROM ksiegi_dokumenty_cialo where main_id=" + dok_id.ToString() + ";";
reader = cmd.ExecuteReader();
//bool wynik = reader.Read();
while (reader.Read())
{
ta.Cialo.Add(new TCialoRoznyRow(reader.IsDBNull(0) ? 0 : reader.GetInt32(0),
reader.IsDBNull(1) ? 0 : reader.GetInt32(1),
reader.IsDBNull(4) ? "" : reader.GetString(4),
reader.IsDBNull(5) ? 0 : reader.GetDecimal(5),
reader.IsDBNull(6) ? 0 : reader.GetDecimal(6),
reader.IsDBNull(7) ? "" : reader.GetString(7),
reader.IsDBNull(8) ? "" : reader.GetString(8),
reader.IsDBNull(4) ? "" : reader.GetString(4)));
}
conn.Close();
FileStream stream1 = new FileStream("C:\\Users\\Admin\\Desktop\\plik.JSON", FileMode.OpenOrCreate);
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(TDaneDokRozny));
ser.WriteObject(stream1, ta);
return ta;
ładowanie danych nowe podejście
string sql = "SELECT dok_id, dokument FROM ksiegidokumenty where dokument ->> 'rok'='2017' and dokument ->> 'miesiac'='1' and dokument ->> 'NazwaDziennika'='inne';";
NpgsqlConnection conn = new NpgsqlConnection(connstring);
conn.Open();
Npgsql.NpgsqlCommand cmd = new Npgsql.NpgsqlCommand(sql, conn);
Npgsql.NpgsqlDataReader reader = cmd.ExecuteReader();
reader.Read();
return = reader.IsDBNull(0) ? 0 : reader.GetInt32(0);
Korzyści z 2 zapytań mamy jedno kod dużo prostszy, pilnowanie tylko jednej tabeli w bazie.
Zauważcie że obiekt danych ma
[DataContract] i [DataMember] co umożliwia automatyzację serializacji i znacząco upraszcza tworzenie aplikacji.