如何正确地将MySQL数据库与C#应用程序连接?

时间:2020-05-30 04:42:41

标签: c# mysql azure ado.net

我正在尝试将我的MySQL数据库与C#连接,但是没有建立连接。

我正在使用

static string connstring = @"server=my.live.ip;userid=user;password=123;database=db_name;port=3306";

但我还是得到

使用方法'mysql_native_password'为用户'user'托管'my.live.ip'的身份验证失败,并显示以下消息:用户'user'@'202.xxx.xxx.xxx'的访问被拒绝(使用密码:NO) `

我已经搜索过,但是没有找到合适的解决方案。

P.S::我正在使用的live IPazure。即MySQL数据库通过xampp

托管在azure服务器上

任何帮助将不胜感激

7 个答案:

答案 0 :(得分:1)

(using password: NO)说没有提供密码。我对C#的连接语法不熟悉,但是我怀疑

有问题
static string connstring =
     @"server=my.live.ip;userid=user;password=123;database=db_name;port=3306";

或者也许没有使用connstring

还要检查MySQL方面。根据您使用SHOW GRANTS FOR 'user'@'202%'还是SHOW GRANTS FOR 'user'@'202.xxx.xxx.xxx'作为“主机”,执行'202%''202.xxx.xxx.xxx'

您应该找回类似的东西

GRANT ... ON dbname.* TO 'user'@'202%' WITH AUTHENTICATION 'mysql_native_password';

注意:将主机名与IP地址相对应可能是个问题。

答案 1 :(得分:1)

可能要尝试的事情-

  1. 将连接字符串中的服务器名称与Azure门户上设置的名称相匹配。
  2. 您提到的用户名和密码看起来像是假的(很容易理解)。检查您的实际用户名或密码是否有任何特殊字符,您将必须对其进行适当编码以进行转义。

例如,如果您的密码是my> Pass,则连接字符串应如下所示。 static string connstring = @"server=servername;userid=user;password=my>Pass;database=db_name;port=3306";

如果您想探索,这里是full list

答案 2 :(得分:0)

using System;
using System.Threading.Tasks;
using MySql.Data.MySqlClient;
namespace AzureMySqlExample
{
class MySqlCreate
{
    static async Task Main(string[] args)
    {
        var builder = new MySqlConnectionStringBuilder
        {
            Server = "YOUR-SERVER.mysql.database.azure.com",
            Database = "YOUR-DATABASE",
            UserID = "USER@YOUR-SERVER",
            Password = "PASSWORD",
            SslMode = MySqlSslMode.Required,
        };

        using (var conn = new MySqlConnection(builder.ConnectionString))
        {
            Console.WriteLine("Opening connection");
            await conn.OpenAsync();

            using (var command = conn.CreateCommand())
            {
                command.CommandText = "DROP TABLE IF EXISTS inventory;";
                await command.ExecuteNonQueryAsync();
                Console.WriteLine("Finished dropping table (if existed)");

                command.CommandText = "CREATE TABLE inventory (id serial PRIMARY KEY, name VARCHAR(50), quantity INTEGER);";
                await command.ExecuteNonQueryAsync();
                Console.WriteLine("Finished creating table");

                command.CommandText = @"INSERT INTO inventory (name, quantity) VALUES (@name1, @quantity1),
                    (@name2, @quantity2), (@name3, @quantity3);";
                command.Parameters.AddWithValue("@name1", "banana");
                command.Parameters.AddWithValue("@quantity1", 150);
                command.Parameters.AddWithValue("@name2", "orange");
                command.Parameters.AddWithValue("@quantity2", 154);
                command.Parameters.AddWithValue("@name3", "apple");
                command.Parameters.AddWithValue("@quantity3", 100);

                int rowCount = await command.ExecuteNonQueryAsync();
                Console.WriteLine(String.Format("Number of rows inserted={0}", rowCount));
            }

            // connection will be closed by the 'using' block
            Console.WriteLine("Closing connection");
        }

        Console.WriteLine("Press RETURN to exit");
        Console.ReadLine();
    }
}

}

答案 3 :(得分:0)

您可以直接查找,但是无论如何我还是找到了以下代码:

将所有端口号用户名和密码数据库名称以及服务器ip替换为所需的内容。

代码:

using System;
using System.Windows;
using MySql.Data.MySqlClient;


namespace Deportes_WPF
{

public partial class Login : Window
{
private MySqlConnection connection;
private string server;
private string database;
private string user;
private string password;
private string port;
private string connectionString;
private string sslM;

public Login()
{
    InitializeComponent();

    server = "server_name";
    database = "database_name";
    user = "user_id";
    password = "password";
    port = "3306";
    sslM = "none";

    connectionString = String.Format("server={0};port={1};user id={2}; password={3}; database={4}; SslMode={5}", server, port, user, password, database, sslM);

    connection = new MySqlConnection(connectionString);
}

private void conexion()
{
    try
    {
        connection.Open();

        MessageBox.Show("successful connection");

        connection.Close();
    }
    catch (MySqlException ex)
    {
        MessageBox.Show(ex.Message + connectionString);
    }
}

private void btn1_Click(object sender, RoutedEventArgs e)
{
    conexion();
}
}

}

我希望这段代码对您有用。

对于您给我的错误,用户名或密码也无效。

答案 4 :(得分:0)

尝试一下:

const string connStr = "Server=my.live.ip; User=user; Database=db_name; Password=123; port=3306; 
    Allow Zero Datetime=true; Convert Zero Datetime=true;"; 

希望这会有所帮助。

答案 5 :(得分:0)

using System;
using System.Threading.Tasks;
using MySql.Data.MySqlClient;

namespace AzureMySqlExample
{
    class MySqlCreate
    {
        static async Task Main(string[] args)
        {
            var builder = new MySqlConnectionStringBuilder
            {
                Server = "YOUR-SERVER.mysql.database.azure.com",
                Database = "YOUR-DATABASE",
                UserID = "USER@YOUR-SERVER",
                Password = "PASSWORD",
                SslMode = MySqlSslMode.Required,
            };

            using (var conn = new MySqlConnection(builder.ConnectionString))
            {
                Console.WriteLine("Opening connection");
                await conn.OpenAsync();

                using (var command = conn.CreateCommand())
                {
                    command.CommandText = "DROP TABLE IF EXISTS inventory;";
                    await command.ExecuteNonQueryAsync();
                    Console.WriteLine("Finished dropping table (if existed)");

                    command.CommandText = "CREATE TABLE inventory (id serial PRIMARY KEY, name VARCHAR(50), quantity INTEGER);";
                    await command.ExecuteNonQueryAsync();
                    Console.WriteLine("Finished creating table");

                    command.CommandText = @"INSERT INTO inventory (name, quantity) VALUES (@name1, @quantity1),
                        (@name2, @quantity2), (@name3, @quantity3);";
                    command.Parameters.AddWithValue("@name1", "banana");
                    command.Parameters.AddWithValue("@quantity1", 150);
                    command.Parameters.AddWithValue("@name2", "orange");
                    command.Parameters.AddWithValue("@quantity2", 154);
                    command.Parameters.AddWithValue("@name3", "apple");
                    command.Parameters.AddWithValue("@quantity3", 100);

                    int rowCount = await command.ExecuteNonQueryAsync();
                    Console.WriteLine(String.Format("Number of rows inserted={0}", rowCount));
                }

                // connection will be closed by the 'using' block
                Console.WriteLine("Closing connection");
            }

            Console.WriteLine("Press RETURN to exit");
            Console.ReadLine();
        }
    }
}

您可以参考下面的链接,使用c#创建和访问mysql数据库。 https://docs.microsoft.com/en-us/azure/mysql/connect-csharp

答案 6 :(得分:0)

您的密码是否以ini或类似字符开头,并且存储在诸如null这样的配置文件中?

由于某些配置类型将某些特殊字符视为注释或其他字符,因此密码变为password=#strongP

要进行验证,请将密码更改为字母数字一次并进行测试。我像my $text_repl = '| ('; foreach my $x (@lc_words) { my $v = quotemeta $x->{word}; $v = '\b' . $v if $v =~ /^\w/; $v .= '\b' if $v =~ /\w$/; $text_repl .= "|$v"; } $text_repl .= ')';

一样使用密码来面对