C# i MySQL

0

Znalazłem taki kod na necie:

MySqlConnection conDatabase = new MySqlConnection("Data Source=localhost;" +
			                         "Persist Security Info=yes;" +
			                         "UserId=root; PWD=Whatever;");
MySqlCommand cmdDatabase = new MySqlCommand("CREATE DATABASE BCR1;", conDatabase);
			
			conDatabase.Open();
			
			cmdDatabase.ExecuteNonQuery();
			conDatabase.Close();

Mam za zadanie połączyć się z MySQL i utworzyć bazę ale gdy dałem instrukcję try-except to wywala błąd unammend command czy coś takiego. O co chodzi? Jak się połączyć nie podając database bo dopiero chcę ją utworzyć i dopiero połączyć ;)

0

podaj treśc błędu bo może się okazać, że nie masz zainstalowanego "łącznika" z bazą.

0

Chyba wszystko mam zainstalowane, bo wystarczy że dodam database=mysql; to się łączy a błąd oczywiście bez parametru database to - Unknown command

0

No ale o ile mnie pamięć nie myli, musisz powiązać command z connection, najlepiej będzie użyc metody CreateCommand z klasy MySqlConnection.
Czyli coś takiego:

MySqlConnection conDatabase = new MySqlConnection("Data Source=localhost;" +
                                                 "Persist Security Info=yes;" +
                                                 "UserId=root; PWD=Whatever;");
MySqlCommand cmdDatabase = conDatabase.CreateCommand(); 

cmdDatabase.CommandText = "CREATE DATABASE BCR1;", conDatabase;
                       
                        conDatabase.Open();
                       
                        cmdDatabase.ExecuteNonQuery();
                        conDatabase.Close();

Pisane z pamięci, więc mogą byc literówki

0
MySqlConnection conDatabase = new MySqlConnection("Data Source=localhost;" +
                                                 "Persist Security Info=yes;" +
                                                 "UserId=root; PWD=admin;");

                MySqlCommand cmdDatabase = conDatabase.CreateCommand();

                cmdDatabase.CommandText = ("CREATE DATABASE BCR1;");
                       
                conDatabase.Open();
                       
                cmdDatabase.ExecuteNonQuery();

                conDatabase.Close();

Taki kod nadal nie działa.

0

Kolejność powinna być taka:

MySqlConnection conDatabase = new MySqlConnection("Data Source=localhost;" +
                                                 "Persist Security Info=yes;" +
                                                 "UserId=root; PWD=admin;");
                conDatabase.Open();

                MySqlCommand cmdDatabase = conDatabase.CreateCommand();

                cmdDatabase.CommandText = ("CREATE DATABASE BCR1;");
                       

                       
                cmdDatabase.ExecuteNonQuery();

                conDatabase.Close();
0

Jeśli dam tak to działa:

MySqlConnection conDatabase = new MySqlConnection("Data Source=localhost;" + "database=mysql;"+
                                                 "Persist Security Info=yes;" +
                                                 "UserId=root; PWD=admin;");
                conDatabase.Open();
                MySqlCommand cmdDatabase = conDatabase.CreateCommand();
                cmdDatabase.CommandText = ("CREATE DATABASE BCR1;");
                cmdDatabase.ExecuteNonQuery();
                conDatabase.Close();

Ale jeśli dam bez parametru database to niestety nawet kolejność nie pomaga:

MySqlConnection conDatabase = new MySqlConnection("Data Source=localhost;" + 
                                                 "Persist Security Info=yes;" +
                                                 "UserId=root; PWD=admin;");
                conDatabase.Open();
                MySqlCommand cmdDatabase = conDatabase.CreateCommand();
                cmdDatabase.CommandText = ("CREATE DATABASE BCR1;");
                cmdDatabase.ExecuteNonQuery();
                conDatabase.Close();

Naprawdę nie chcę podawać tego parametru!!!

0

a próbowałeś

MySqlConnection conDatabase = new MySqlConnection("Data Source=localhost;" + "database=;"+
                                                 "Persist Security Info=yes;" +
                                                 "UserId=root; PWD=admin;");

Nigdy z bazami danych nie pracowałem, wiec nie wiem, ale może ruszy.

0

Ja używam takiego connection stringa:
"server=;user=;database=;port=3306;password=;"

0

rev.pl - kpisz z nich, czy ja o czyms nie wiem dot. providera mysql? :) ja rozumiem ze mozna liczyc ze przy nie-wybraniu bazy serwer wybierze domyslna 'mysql' czy 'master' pod mssql, no ale bez przesady z ta pustoscia..

autorze: a jelsi mozna wiedziec, to czemu nie chcesz podawac nazwy bazy w connectionstringu? wydaje mi sie ze chcesz osiagnac cos nie tą droga co nalezaloby

0

Przepraszam, podam za chwilę wszystkie dane dostępowe do mojego serwera.

0
quetzalcoatl napisał(a)

autorze: a jelsi mozna wiedziec, to czemu nie chcesz podawac nazwy bazy w connectionstringu? wydaje mi sie ze chcesz osiagnac cos nie tą droga co nalezaloby

Ale jak ma w connectionstringu podać nazwę bazy, którą dopiero chce utworzyć? :)

Ja nie wiem, co tu jest nie tak, MSSQL coś takiego łyka, może MySQL jest upośledzony po prostu?

0

Dokładnie, to jak mam połączyć się z bazą którą chcę dopiero stworzyć.

A oprócz MySQLConnection da się jakoś utworzyć bazę w MySQL?

0

Daj pustą nazwę, tak:

MySqlConnection conDatabase = new MySqlConnection("Data Source=localhost;" + "database=;"+
                                                 "Persist Security Info=yes;" +
                                                 "UserId=root; PWD=admin;");

Tak jak hubert_nnn napisał, to powinno zadziałać.

0

A może da się inną metodą utworzyć bazę i dopiero w dalszej części programu już łączyć się za pomocą MySQLConnection?

0

Nie, chyba ze sie polaczysz za pomoca innego narzedzia i utworzysz ta twoją bazę. Albo innym sposobem pod .NET (przez odbc na przykład). Tylko po co?

0

A możesz zdradzić dokładną treść błędu? Bo u mnie na świeżo zainstalowanym MySql poszło bez problemu bez podawania bazy i po wykonaniu komendy z powodzeniem utworzyło bazę. Upewnij się czy użytkownik (nawet jeśli to root) ma odpowiednie prawa. Jeśli ma tylko dostęp do jednej bazy, to połączenie bez podania nazwy bazy danych się nie uda.

0
somekind napisał(a)

Ale jak ma w connectionstringu podać nazwę bazy, którą dopiero chce utworzyć? :)

no ładnie.. ostatnio chyba mam problemy z czytaniem:/

0

Witam, ja z kolei szukając rozwiązania swojego problemu trafiłem do tego tematu i prawie rozwiązał on mój problem, z małym tylko wyjątkiem. Skopiowałem ponoć działający (i w sumie faktycznie działający w programie tekstowym) kod z posta i teraz mój programik wygląda tak:

using (...)
namespace SZDW
{
	public class Wydatki : Form
	{
		MySqlConnection CnDB = new MySqlConnection("Data Source=localhost;" + 
						"database=mysql;"+
                                                "Persist Security Info=yes;" +
                                                "UserId=root; PWD=admin;");
-------->	CnDB.Open();
		public Wydatki()
		{(...)}
		private void FDodajDomownika(object sender, System.EventArgs e)
		{
			(...)
		MySqlCommand CommandDB = CnDB.CreateCommand();
            	CommandDB.CommandText = ("INSERT INTO osoby VALUES ('1',TDodajDomownika.Text);");
            	CommandDB.ExecuteNonQuery();
			(...)
		}
		(...)
		public static void Main(string[] args)
		{
			Application.Run(new Wydatki());
		}
	}
}

I przy kompilacji wyskakuje błąd: error CS1519: Invalid token '(' in class, struct, or interface member declaration.
Po usunięciu nawiasów po wskazanym CnDB.Open, czepia się też średnika, po usunięciu jego wyrzuca błąd:
error CS1585: Member modifier 'private' must precede the member type and name
Próbowałem przenieść całe MySqlConnecion do Maina, ale wtedy czepiał się, że CnDB z funkcji FDodajDomownika odwołuje się do czegoś co nie istnieje.
Spędziłem nad tym kilka godzin i już brak mi sił, tym bardziej, że powyższy kod zastosowałem jako rozwiązanie problemu, który rozwiązywałem przez poprzednie kilka godzin (pierwszy raz łączę się w C# z bazą danych i udaje mi się to w programie tekstowym, a w formularzu już nie.)

Jakby co, używam MySQL 5.0.67, program piszę w notatniku Notepad++.

Z góry dzięki za odpowiedź.

0

CommandDB.CommandText = ("INSERT INTO osoby VALUES ('1',TDodajDomownika.Text);");
Popraw to.

0

A mógłbyś powiedzieć co w tym zapytaniu jest nie tak i ewentualnie jak je poprawić ??
I w jaki sposób poprawienie zapytania sprawi, że kompilator przestanie się czepiać otwierania połączenia ??
Poza tym po wykomentowaniu i po zmianach w zapytaniu, błąd pozostaje bez zmian.
Ponadto składnia zapytania w linii poleceń MySQL oraz w zwykłym programie tekstowym działa bez zarzutu.

EDIT:
Formuła działa, jeśli wszystko jest obok siebie, w Main();
Jeśli oprócz tego spróbuję utworzyć jeszcze jedno polecenie MySQL w funkcji FDodajDomownika, wszystko się sypie. Wszystko w Main(); jest wtedy według niego błędne.

0

Zrób przed zapytaniem CnDB.Open();
a potem:

CommandDB.CommandText = ("INSERT INTO osoby VALUES ('1',TDodajDomownika.Text);");

zamień na:

CommandDB.CommandText = "INSERT INTO `osoby` (`nazwakol1`, `nazwakol2`) VALUES ('1', '".TDodajDomownika.Text."'";
0

sorry, Open już masz

0

Niestety, nie rozwiązało to mojego problemu... Jak było, tak jest.
Moim zdaniem problem nie leży w strukturze zapytania, tylko gdzieś indziej.

0

Problem rozwiązałem z kolegą, nawet dokładnie nie jestem pewien co rozwiązało problem, więc nie podzielę się rozwiązaniem, przypuszczam tylko, że faktycznie mogło chodzić o składnię zapytania :)
Dzięki za pomoc.
Mój program wygląda teraz tak, może ktoś wywnioskuje z tego rozwiązanie na własne potrzeby:

namespace SZDW
{
	public class Wydatki : Form
	{
		//Tworzenie połączenia SQL
		MySqlConnection CnDB = new MySqlConnection("Data Source=localhost;Database=wydatki;User ID=root;Password=admin");
		public Wydatki()
		{		
			
		}
		
		private void FDodajDomownika(object sender, System.EventArgs e)
		{
			CnDB.Open();
			MySqlCommand KDD = CnDB.CreateCommand();
			KDD.CommandText = ("INSERT INTO osoby VALUES ('NULL','"+TDodajDomownika.Text+"');");
			KDD.ExecuteNonQuery();
			CnDB.Close();
			MessageBox.Show(TDodajDomownika.Text+" dodany(a)","Dodawanie Domownika");
			Application.Restart();
		}
		
		public static void Main(string[] args)
		{
			Application.Run(new Wydatki());
		}
	}
}
0

SQL Injection jeee. Do tego zalogowany na roota ;).

1 użytkowników online, w tym zalogowanych: 0, gości: 1