C# MSSQL oszlopok adatainak kinyerése selectból

C# MSSQL oszlopok adatainak kinyerése selectból
2010-12-22T13:16:50+01:00
2010-12-22T14:52:12+01:00
2022-11-20T06:30:37+01:00
kgabber
Sziasztok!

Magánszorgalomból belefogtam egy szép kis dologba. Nagyon sok olyan programot kell írnom, ami select eredményét jeleníti meg, illetve táblákat töltök fel, illetve kezelek C# windows felületen keresztül.

Arra az elképzelésre jutottam, hogy mint olysok mindent, ezt is lehetne automatizálni. Elkezdtem írni rá egy programot.

Annyit szeretnék megcsinálni, hogy egy megadott táblára illetve select-re egy általam megírt algoritmus C# class-okat generájon le. Elkezdtem megírni a programot, és odáig sikeresen eljutottam, hogy egy táblából sikeresen tudtam objektumot csinálni kódból, ebből ugyebár gyerekjáték formot generálni. Viszont ezt úgy tudtam megoldani, hogy egy általam megírt generáló proginak átadom a managment studio által generált create table scriptet és ebből ki tudom nyerni az adatokat.

Viszont szükségem lenne arra is, hogy egy összetett lekérdezés eredményére is tudjak objektumot generálni.

Erre nem találtam a neten semmi használhatót, a tippem az lett volna, hogy DataSet-t hozok létre és abból kiszedem, de az sajnos ahogy neten néztem nem megoldható.

Valakinek esetleg lenne valami ötlete, hogy honnan tudnám ezt megoldani?

Nem kódot szeretnék, hanem vmit, amiből meg tudom csinálni, amiből el tudom kezdeni.

Köszönöm!
Mutasd a teljes hozzászólást!
A DataSet-ből ki tudod szedni ezeket az infókat:
dataser.Tables[0].Columns[0].DataType dataser.Tables[0].Columns[0].ColumnName

És ezeket még akkor is visszaadja ha nem ad vissza sort a select.



Mutasd a teljes hozzászólást!

  • Miért nem használsz LINQ to SQL-t? Az kb pont azt tudja amit csinálni akarsz.
    ScottGu's Blog - Using LINQ to SQL (Part 1)
    http://tudastar.netacademia.net/default.aspx?upid=22484
    Mutasd a teljes hozzászólást!
  • Szia!

    Az igazság az, hogy én már elkezdtem megírni ezt, és bár tudom, hogy felesleges megírni, ha a linq to sql ugyanezt a módzsert csinálja amit én elkezdtem, de nem tudtam eddig erről, linq-t szoktam használni néha, szeretném megírni. Tudom, hogy időigáényes, de egyszer megdolgozok vele és utána csak használni kell, és nem mellékesen a saját munkám, tehát ott bővíytem ahol szeretném. Igazából az első hozzászólásomban leírt problémát, ha meg tudom oldani, akkor már semmilyen akadály nincs előttem.
    Mutasd a teljes hozzászólást!
  • Ez a függvény egy tetszőleges DataRow-ból feltölt egy object-et, ha annak az object-nek a property-einek a nevei megegyeznek a DataRow oszlopainak neveivel.


    Kb így kell meghívni:


    Valami _newObject = new Valami(); _newObject = GetObject(datarow, _newObject);

    public static object GetObject(DataRow row, object newObj) { System.Reflection.PropertyInfo[] properties = newObj.GetType().GetProperties(); for (int i = 0; i < properties.Length; i++) { if (!properties[i].CanWrite) { continue; } if (!row.Table.Columns.Contains(properties[i].Name)) { continue; } if (row[properties[i].Name] == DBNull.Value) { continue; } if (properties[i].PropertyType == typeof(string)) { properties[i].SetValue(newObj, row[properties[i].Name], null); } else if (properties[i].PropertyType == typeof(double)) { properties[i].SetValue(newObj, double.Parse(row[properties[i].Name].ToString()), null); } else if (properties[i].PropertyType == typeof(int)) { properties[i].SetValue(newObj, int.Parse(row[properties[i].Name].ToString()), null); } else if (properties[i].PropertyType == typeof(int?)) { if (row[properties[i].Name] != null) properties[i].SetValue(newObj, int.Parse(row[properties[i].Name].ToString()), null); } else if (properties[i].PropertyType == typeof(long)) { properties[i].SetValue(newObj, long.Parse(row[properties[i].Name].ToString()), null); } else if (properties[i].PropertyType == typeof(DateTime)) { properties[i].SetValue(newObj, DateTime.Parse(row[properties[i].Name].ToString()), null); } else if (properties[i].PropertyType == typeof(decimal)) { properties[i].SetValue(newObj, Decimal.Parse(row[properties[i].Name].ToString()), null); } else if (properties[i].PropertyType == typeof(bool)) { properties[i].SetValue(newObj, bool.Parse(row[properties[i].Name].ToString()), null); } } return newObj; }
    Mutasd a teljes hozzászólást!
  • Ez így tetszik nekem, még egy kérdésem lenne ezzel a kóddal kapcsolatban, ha azt meg tudom oldani, akkor ezt át tudom írni a saját librarym-be. Nekem az objectet akkor kell létrehoznom, mikor a select lefut, tehát a kódgeneráló progimnak megadok egy sql-t amiből datatable-t csinálok. Viszont nekem pont az kellene, hogy a datatable oszlopainak mi a típusa, ez minden esetben kell, mert ez alapján generálom le az objetet, és később használtaos selecteket futtató fg-ket, tehát akkor is ki kell szednem belőle az oszlop típusokat, ha nem ad vissza eredményt a query.

    Tehát így gondolom:
    1. Van egy select:
    select * from valamai1, valami2 where valami1.o=valami2.i

    2. Lefut a query, lesz egy datatable

    3. Ebből a datatable-ből kellene kiszednem a mezők típusait, hogy az alábbi dolgot véghez tudjam vinni:
    mező típusa: int, neve: valtozo, akkor az objektumkódba ilyet generálok:
    private int valtozo;

    A select eredménye ekkor nem érdekes, mert használva később lesz, amikor e legenerált class-okat projektekbe beleépítem.

    Remélem jól foglmaztam meg.

    A te általad mutatott kód, pont az objektum propertijének a típusát kérdezi, pedig sajnos azt a datatable-ből kell megtudnom.
    Mutasd a teljes hozzászólást!
  • A DataSet-ből ki tudod szedni ezeket az infókat:
    dataser.Tables[0].Columns[0].DataType dataser.Tables[0].Columns[0].ColumnName

    És ezeket még akkor is visszaadja ha nem ad vissza sort a select.



    Mutasd a teljes hozzászólást!
  • Köszönöm szépen a segítséged, így már menni, fog a pont a tied.

    Mutasd a teljes hozzászólást!
  • Szerintem rossz úton haladtok. Ami kellene:
    SQLCommand.Execute(CommandBehavior.SchemaOnly)
    SQLDataReader.GetName() és GetFieldType()
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd