C# i MySQL

0

Znalazłem taki kod na necie:

Kopiuj
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ć ;)

angel2953
  • Rejestracja:ponad 22 lata
  • Ostatnio:prawie 7 lat
  • Postów:750
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

OT
  • Rejestracja:ponad 20 lat
  • Ostatnio:ponad 11 lat
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:

Kopiuj
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
Kopiuj
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.

KA
  • Rejestracja:ponad 22 lata
  • Ostatnio:ponad 4 lata
  • Lokalizacja:Gród Króla Kraka
0

Kolejność powinna być taka:

Kopiuj
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();

Hey ho!
0

Jeśli dam tak to działa:

Kopiuj
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:

Kopiuj
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!!!

HN
  • Rejestracja:ponad 17 lat
  • Ostatnio:około 11 lat
0

a próbowałeś

Kopiuj
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.

RE
Moderator
  • Rejestracja:około 18 lat
  • Ostatnio:około rok
0

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

quetzalcoatl
  • Rejestracja:ponad 18 lat
  • Ostatnio:ponad 6 lat
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


no to pojechałem z nieobecnością.. chwila przerwy i prawie rok przeleciał
RE
Moderator
  • Rejestracja:około 18 lat
  • Ostatnio:około rok
0

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

somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 6 godzin
  • Lokalizacja:Wrocław
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?

OT
  • Rejestracja:ponad 20 lat
  • Ostatnio:ponad 11 lat
0

Daj pustą nazwę, tak:

Kopiuj
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?

OT
  • Rejestracja:ponad 20 lat
  • Ostatnio:ponad 11 lat
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?

GU
  • Rejestracja:ponad 15 lat
  • Ostatnio:około 14 lat
  • Postów:41
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.


Pozdrawiam,
gufiak
quetzalcoatl
  • Rejestracja:ponad 18 lat
  • Ostatnio:ponad 6 lat
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:/


no to pojechałem z nieobecnością.. chwila przerwy i prawie rok przeleciał
HA
  • Rejestracja:ponad 15 lat
  • Ostatnio:prawie 13 lat
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:

Kopiuj
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.

HA
  • Rejestracja:ponad 15 lat
  • Ostatnio:prawie 13 lat
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:

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

zamień na:

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

sorry, Open już masz

HA
  • Rejestracja:ponad 15 lat
  • Ostatnio:prawie 13 lat
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.

HA
  • Rejestracja:ponad 15 lat
  • Ostatnio:prawie 13 lat
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:

Kopiuj
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());
		}
	}
}
RE
Moderator
  • Rejestracja:około 18 lat
  • Ostatnio:około rok
0

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.