Host is not allowed to connect to this mysql database - c#

I'm making a web api chat application in ASP.NET Razor Pages in VS Code with SignalR and with MySQL database. (Microsoft SQL Server Management Studio)
I wanted to store the messages and the users in a table, but when I made the MySQL connection I got an error message:
MySql.Data.MySqlClient.MySqlException (0x80004005): Host '' is not allowed to connect to this MySQL server
It can cause, that I connected to the database before in appsettings.json file with ConnectionString?
Here is the ChatHub.cs code:
using Microsoft.AspNetCore.SignalR;
using System.Threading.Tasks;
using System;
using MySql.Data;
using MySql.Data.MySqlClient;
using probagetrequest.Models;
namespace SignalRChat.Hubs
{
public class ChatHub : Hub
{
public async Task SendMessage(string user, string message)
{
string connn = "Server=localhost;Database=DBChatApp;user id=sa;password=xxx";
MySqlConnection con = new MySqlConnection(connn);
try {
Console.WriteLine("Connecting to MySql...");
con.Open();
string cmddd = "INSERT INTO Messages (Username,Message) VALUES (#Usernamee,#Messagee)";
MySqlCommand cmd = new MySqlCommand(cmddd, con);
cmd.Parameters.Add("#Usernamee", MySqlDbType.VarString).Value = user;
cmd.Parameters.Add("#Messagee", MySqlDbType.VarString).Value = message;
}
catch (Exception exc)
{
Console.WriteLine(exc.ToString());
}
con.Close();
Console.WriteLine("Done!!!!!");
Console.WriteLine($"user={user}, message={message}");
await Clients.All.SendAsync("ReceiveMessage", user, message);
}
}
}

Did you try logging into MySQL DB through mysql client CLI. I think it's a problem with "mysql user" privileges mentioned in your project to connect to the MySQL DB.
In general, the error you mentioned comes when a new database is setup but left un-configured.
Try the following commands logging into MySQL as super user
mysql> CREATE USER 'root'#'%' IDENTIFIED BY 'root';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'#'%' WITH GRANT OPTION;

Related

C# code is unable to connect to Azure SQL database

I am trying to connect to a sample database I have created in Azure using C# (.NET Core 3.1)
I have enabled my IP address within Azure's Firewall rules.
I am able to use VS2019's SQL Server Object Explorer to connect and view the database within with no problems.
However, when I run a simple C# app on the same PC to execute a query to count the number of records in a table, it throws the following exception at the point where the connection is opened (conn.Open());
A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: TCP Provider, error: 0 - The requested address is not valid in its context.)
The C# code;
using System;
using System.Data.SqlClient;
namespace AzureSql2
{
class Program
{
static void Main(string[] args)
{
string connStr = " Server=tcp:beaconsqlsql.database.windows.net,1433;Initial Catalog=MRP2;Persist Security Info=False;User ID=beaconadmin;Password=********;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;";
Console.WriteLine("Building connection");
try
{
using (var conn = new SqlConnection(connStr))
{
Console.WriteLine("Creating command");
using (var command = conn.CreateCommand())
{
command.CommandText = "SELECT COUNT(*) FROM [dbo].[Table]";
Console.WriteLine("Opening connection");
conn.Open();
Console.WriteLine("Reading database");
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
Console.WriteLine("Record count: {0}", reader.GetInt32(0));
}
}
}
}
}
catch (Exception ex)
{
Console.WriteLine("Exception: " + ex.Message);
}
Console.WriteLine("Press Enter to exit");
Console.ReadLine();
}
}
}
I've tried temporarily turning off the firewall on my PC, but that made no difference.
The fact that SQL Server Object Explorer can connect but the C# code cannot makes it sound like there's a problem with the C# code, but I can't see any differences between it and the samples I've looked at.
I created one Azure SQL database and allowed my client IP like below :-
I created one .Net Console application and ran your code, I replaced
using System.Data.SqlClient
with
using Microsoft.Data.SqlClient
You can use any of the above packages.
Copied connection string from Azure Portal > Azure SQL server > Connection string refer below :-
C# Code:-
using System;
using System.Linq.Expressions;
using Microsoft.Data.SqlClient;
namespace AzureSql2
{
class Program
{
static void Main(string[] args)
{
string connStr = "Server=tcp:sqlservername.database.windows.net,1433;Initial Catalog=sqldbname;Persist Security Info=False;User ID=username;Password=password;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;";
Console.WriteLine("Building connection");
try
{
using (var conn = new SqlConnection(connStr))
{
Console.WriteLine("Creating command");
using (var command = conn.CreateCommand())
{
command.CommandText = "SELECT * FROM Products";
Console.WriteLine("Opening connection");
conn.Open();
Console.WriteLine("Reading database");
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
Console.WriteLine("Record count: {0}", reader.GetInt32(0));
}
}
}
}
}
catch (Exception ex)
{
Console.WriteLine("Exception: " + ex.Message);
}
Console.WriteLine("Press Enter to exit");
Console.ReadLine();
}
}
}
Output :-
I tried to run the code with the connection string format you mentioned in the comments :-
Data Source=azuresqlservername.database.windows.net;Initial Catalog=databasename;User ID=siliconuser;Password=password;Connect Timeout=30;Encrypt=True;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False
And I was able to run the same code above and got the desired output:-
When I tried to change the Azure SQL server name in the connection string, I got the same error code as yours, refer below :-
Verify if your connection string has any syntax missing and validate it from Azure Portal.
I ended up taking a copy of the project home and running it on my home PC, and it worked correctly and reliably (after telling Azure to allow that IP address as well)
It turned out the answer was embarrassingly obvious - in addition to the standard Windows 10 firewall, my work PC is running another virus protection/firewall software, and that also needed to be told to allow the app thru.
Definitely one to remember for next time... Although I am kind of intrigued that on two occasions (once mentioned above, once afterwards) out of a few hundred attempts the app did manage to get thru and connect.
Thank you everyone for your answers and help.

Connecting Visual Studio to a SSH Tunneled MySQL Server

I was looking for a workaround for configuring my database connection.
I saw that opening 3306 port is dangerous and we should be using SSH Tunnel instead to connect to the database.
I configured my MySQL server using docker and successfully connected it using MySQL Workbench
Now I have to configure and connect it to Visual Studio 2022 to be able to query to the database.
Visual Studio 2022 is only supported by MySQL Data thru NuGet packages which doesn't have a gui connection setup.
I installed Visual Studio 2019 which is officially supported by MySQL Database and can be configured thru Data Source.
How can I setup MySQL Database connection to my Visual Studio if it's SSH Tunnel configured.
Add Connection window only shows basic information about the connection. I'm not sure how to configure this over a SSH Tunnel.
Thank you in advance.
For security reasons, sometimes the database server can only be accessed through SSH. For example, the MySql service is installed on server A, and machine A can only be accessed by machine B, and the deployment environment may be on machine C. In this case, C The server connects to the A server through the B server. At this time, SSH connection is required, and the SSH.NET class library is required:
code show as below:
using MySql.Data.MySqlClient;
using Renci.SshNet;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace SSHMySql
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
SSHConnectMySql();
}
public void SSHConnectMySql()
{
string SSHHost = "*.*.*.*"; // SSH address
int SSHPort = ; // SSH port
string SSHUser = "user"; // SSH username
string SSHPassword = "pwd"; // SSH password
string sqlIPA = "127.0.0.1";// Map addresses In fact, it is possible to write other MySql on Linux My.cnf bind-address can be set to 0.0.0.0 or not
string sqlHost = "192.168.1.20"; // The IP address of the machine installed by mysql can also be an intranet IP, for example: 192.168.1.20
uint sqlport = ; // Database port and mapping port
string sqlConn = "Database=mysql;Data Source=" + sqlIPA + ";Port=" + sqlport + ";User Id=user;Password=pwd;CharSet=utf8";
string sqlSELECT = "select * from user";
PasswordConnectionInfo connectionInfo = new PasswordConnectionInfo(SSHHost, SSHPort, SSHUser, SSHPassword);
connectionInfo.Timeout = TimeSpan.FromSeconds();
using (var client = new SshClient(connectionInfo))
{
try
{
client.Connect();
if (!client.IsConnected)
{
MessageBox.Show("SSH connect failed");
}
var portFwdL = new ForwardedPortLocal(sqlIPA, sqlport, sqlHost, sqlport); // map to local port
client.AddForwardedPort(portFwdL);
portFwdL.Start();
if (!client.IsConnected)
{
MessageBox.Show("port forwarding failed");
}
MySqlConnection conn = new MySqlConnection(sqlConn);
MySqlDataAdapter myDataAdapter = new MySqlDataAdapter();
myDataAdapter.SelectCommand = new MySqlCommand(sqlSELECT, conn);
try
{
conn.Open();
DataSet ds = new DataSet();
myDataAdapter.Fill(ds);
dataGridView1.DataSource = ds.Tables[];
}
catch (Exception ee)
{
MessageBox.Show(ee.Message);
}
finally
{
conn.Close();
}
client.Disconnect();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}
}
Note: If an error occurs, you can stop the MySql service on the local (development machine).
Required dll: SSHDLL.rar
You can fill in the following information to configure the connection to the MySql database.
Server name: Enter the IP address of MySQL, which is 127.0.0.1 as seen in your SSL connection information.
User name: Enter the user name of Mysql
Password: Enter the password of Mysql
Database name: Enter a test database
Hope it can help you

How do I connect to Google Cloud SQL Server using C#?

I just set up a SQL Server on the "Google Cloud Platform." I created a database and tables there. I used Microsoft's "SQL Server Management Studio" (SSMS) to connect and create the database and tables. That all worked. I set up a proxy address 127.0.0.1:1443 according to Google's Cloud SQL instructions. That all worked.
However, what I want to do is connect to this remote server using a C# application. I have no problem using the C# program to connect to the SQL Server on my machine, but I can't figure out how to configure to connect to the one on the remote one on the Google Cloud Platform.
For my code I'm using the System.Data.SqlClient library.
My connection string is below. The code below is hopefully enough to tell you what is going on. When I call loadInfoFromDatabase(), it fails when it hits `connection.Open(). I wrote "FAILS HERE" next to it in the code below.
The connection string is a bit of a guess after trying different things. Any help would be appreciated.
Thanks!
public string _connectionString = #"Server=127.0.0.1:1443;Database=MarsDatabase;User Id=sqlserver;Password=AAABBBCCC";
private void loadInfoFromDatabase()
{
string firstName, middleName, lastName, email, password, assignedTables;
string connectionString;
SqlDataReader dataReader;
connectionString = _connectionString;
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open(); //FAILS HERE...
SqlCommand command = connection.CreateCommand();
SqlTransaction transaction;
// Start a local transaction.
transaction = connection.BeginTransaction("loadInfoFromDatabse");
// Must assign both transaction object and connection
// to Command object for a pending local transaction
command.Connection = connection;
command.Transaction = transaction;
try
{
command.CommandText = "Select * From Info";
// Attempt to commit the transaction.
dataReader = command.ExecuteReader();
while (dataReader.Read())
{
...
}
dataReader.Close();
command.Dispose();
// connection.Close();
transaction.Commit();
Console.WriteLine("Selection from managers table worked.");
}
catch (Exception ex)
{
}
}
}
I see that you're using Cloud SQL Proxy to connect to the SQL Server instance using TCP.
The problem is with your connection string because you're missing the TCP prefix. By looking at Server on ConnectionString property you can see the description where:
The TCP format must start with the prefix "tcp:". (ex. server=tcp:servername, portnumber)
To fix the issue, change your connection string to:
#"Server=tcp:127.0.0.1,1443;Database=MarsDatabase;User ID=sqlserver;Password=AAABBBCCC";

Connect and insert data from my computer to server's MySQL DB table with the help of C#.NET

I want to connect with a server's MySql DB(cpanel) . Though there are no errors every time I'm getting a message for Messegebox : unable to connect to any of the specified any of the MySql hosts.
using MySql.Data.MySqlClient;
connString = "SERVER = ********;PORT=3306;DATABASE=********;UID=**********;PASSWORD=*********";
try
{
conn = new MySqlConnection();
conn.ConnectionString = connString;
conn.Open();
MessageBox.Show("Server is online");
}
catch (MySql.Data.MySqlClient.MySqlException ex)
{ MessageBox.Show(ex.Message);}
If you try to connect to your MySQL server externally, external connections need to be enabled.
Be aware that it is a security hole if you provide your app to others which contain the DB information. To go around that, you need to create a Web-API.
The first step to connect to your app to a remote server MySql Server is verify if it allows external connections, for default the root user is locked, to allow local you can try to connect with the root user typing the following command in MySql:
GRANT ALL PRIVILEGES ON *.* TO 'root'#'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
FLUSH PRIVILEGES;
'root': You can change it with your user.
'%': allows all connections, you can limit it typing an IP.
Second step is verify your MySql .net connector
Cheers!
I would look into using ConnectionStringBuilder. Also note the use of 'using'. This will ensure resources are disposed once finished with.
private MySqlConnectionStringBuilder sConnString = new MySqlConnectionStringBuilder
{
Server = "",
UserID = "",
Password = "",
Database = ""
};
private void Test(){
// open connection to db
using (MySqlConnection conn = new MySqlConnection(sConnString.ToString()))
{
using (MySqlCommand cmd = conn.CreateCommand())
{
try
{
conn.Open();
cmd.CommandText = "SELECT * FROM foo WHERE OrderID = #OrderID";
// Add any params
cmd.Parameters.AddWithValue("#OrderID", "1111");
cmd.Prepare();
cmd.ExecuteNonQuery();
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
return;
}
}
}
}

unable to connect to other machine's mysql server using C#?

i need to connect to the other machine's mysql server using C# coding,below is my coding:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MySql.Data.MySqlClient;
namespace c_mysql
{
class Program
{
static void Main(string[] args)
{
string connection = "SERVER=192.168.1.5; Database=b2b; Uid=root;";
MySqlConnection con = new MySqlConnection(connection);
con.Open();
MySqlCommand cmd = new MySqlCommand("select * from area",con);
MySqlDataReader dr = cmd.ExecuteReader();
if (dr.Read())
{
Console.WriteLine("connection successfull");
}
else
{
Console.WriteLine("not connected...");
}
}
}
}
the ip address 192.168.1.5 is the ip address of other computer which is in LAN,I am able to connect through 192.168.1.5/phpmyadmin in url bar but when connecting through C# coding it says,
Host 'pc1' is not allowed to connect to this MySQL server
Pc 1 is my pc on which i am coding.
please help me.
Enable Remote Root Access to MySql. click here for more details
Snippet taken from above:
create a new HOST for root and allow root to login from anywhere.
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'#'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;
mysql> exit

Categories

Resources