Witam.
Mam spory problem z którym nie mogę dojść do ładu. Może opiszę wszystko po kolei. Posiadam połączenie z serwerem baz danych i zachowuje sobie w "Zmiennych" nazwy tabel, kolumn i różne inne potrzebne mi dane. Dla uproszczenia podam jak to wygląda na przykładzie:
- zapisane nazwy tabel moge miec (w sumie w 3 wersjach):
z distinctem:
string tabSQL = test, test2, t3, t4, t5
string tabXML = test, t3, t5, t6
bez:
//dokladnie tyle ile jest kolumn, jest to zasluga selecta.
string tabSQL = test test test test test2 t3 t3 t3 t4 t5 t5 t5 //12
string tabXML = test test test t3 t3 t3 t5 t5 t6 //9
lub z ich odpowiadającymi kolumnami - punkt 3
- zapisane nazwy kolumn:
string kolSQL = dan1 dan2 dan3 dan4 dan1 dan1 dan2 dan3 dan1 dan2 dan3 dan4 //12
string kolXML = dan2 dan3 dan5 dan1 dan2 dan3 dan2 dan3 dan1 //9
- mozna zapisac rownie dobrze w jednym stringu nazwe tabeli z odpowiadajaca jej kolumną, wtedy stringi beda wygladaly tak jak w Query:
string tabkolSQL =
test dan1
test dan2
test dan3 wyswietlamy poniewaz rozni sie - zawiera dan4 i nie zawiera dan5 z tabkolXML
test dan4
test2 dan1 pomijamy poniewaz nie wystepuje w tabkolXML
t3 dan1
t3 dan2 pomijamy poniewaz posiada identyczne nazwy tabel jak tabkolXML
t3 dan3
t4 dan1 pomijamy poniewaz nie wystepuje w tabkolXML
t5 dan2
t5 dan3 wyswietlamy poniewaz rozni sie - zawiera dan4, ktorej nie ma w tabkolXML
t5 dan4
string tabkolXML =
test dan1
test dan2 wyswietlamy poniewaz rozni sie - zawiera dan5 i nie zawiera dan4 z tabkolSQL
test dan5
t3 dan1
t3 dan2 pomijamy poniewaz posiada identyczne nazwy tabel jak tabkolSQL
t3 dan3
t5 dan2
t5 dan3 wyswietlamy poniewaz rozni sie - nie zawiera dan4 z tabkolSQL
t6 dan1 pomijamy poniewaz nie wystepuje w tabkolSQL
Ale wydaje mi się, że tak zapisane ciężej będzie porównać?
----------------- Btw. kresek nie wyświetlam, dodałem tutaj żeby było lepiej widać :P
- Z założenia:
if tabSQL.Contains(tabXML) // w wyniku powinny być nazwy tabel: test, t3, t5 poniewaz sie powtarzają - to działa
kolumn1 != kolum2 // tutaj ma spr różnice w kolumnach dla odpowiadających im tabel, jesli są to wynik - z tym mam problem
wynik = tab1 // wynik powinien byc nazwami tabel w ktorych sie roznia kolumny
w tym wypadku: wynik = test, t5
- Nazwy wyciągam w ten sposób:
SqlCommand cmd = new SqlCommand();
SqlDataReader reader;
cmd.CommandText = "Use " + comboBox3.Text + "; select TABLE_NAME, COLUMN_NAME from information_schema.columns;";
cmd.CommandType = CommandType.Text;
cmd.Connection = Connection.myConnection;
reader = cmd.ExecuteReader();
string columSQL = "";
string tablSQL = "";
int SQLcount = 0;
while (reader.Read())
{
tablSQL += reader.GetString(0) + "\n";
columSQL += reader.GetString(1) + "\n";
//columSQL += reader.GetString(0) + "\n";
SQLcount += 1;
}
reader.Close();
Następnie rozbijam splitem dla porównań (a w razie potrzeby jeśli nie chce powtórzeń dokładam Distinct):
var kolSQL = columSQL.Split('\n'); //kolumny
var tabSQL = tablSQL.Split('\n'); //tabele
var kolXML = columXML.Split('\n'); //kolumny
var tabXML = tablXML.Split('\n'); //tabele
- Funkcja nad którą pracowałem do tej pory (tak wiem, że nie działa :P - dodaje mimo wszystko też nazwy tabeli których kolumny są takie same):
for (int i = 0; i < SQLcount; i++)
{
for (int j = 0; j < XMLcount; j++)
{
if (tabSQL[i].Contains(tabXML[j]))
{
if (kolSQL[i] != kolXML[j])
{
richTextBox3.Text += "Tabela: " + tabSQL[i] + "\n";
}
}
}
}
Nie mogę rozkminić na mój ciasny rozumek jak to powinno wyglądać :P Bardzo proszę o jakąś pomoc, może kodzik na podstawie którego ruszę dalej, gdyż podobnych funkcji będę potrzebował jeszcze kilka sobie zrobić.