Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将C#数据传递到MySQL_C#_Mysql - Fatal编程技术网

将C#数据传递到MySQL

将C#数据传递到MySQL,c#,mysql,C#,Mysql,我试图将数据从C#中的一些文本框传递到MySQL数据库,但每次我从C#应用程序中单击submit时,该行都会创建空白,就好像我的文本框是空的一样 public void Insert() { string query = "insert into albertolpz94.miembros(usuario,contraseña,permisos,nombre,apellidos) values('" + userAdmin.registroUsuario.Text + "','" + u

我试图将数据从C#中的一些文本框传递到MySQL数据库,但每次我从C#应用程序中单击submit时,该行都会创建空白,就好像我的文本框是空的一样

public void Insert()
{
    string query = "insert into albertolpz94.miembros(usuario,contraseña,permisos,nombre,apellidos) values('" + userAdmin.registroUsuario.Text + "','" + userAdmin.registroContraseña.Text + "','" + userAdmin.registropermisos2 + "','" + userAdmin.registroNombre.Text + "','" + userAdmin.registroApellidos.Text + "');";
    //open connection
    if (this.OpenConnection() == true)
    {
        //create command and assign the query and connection from the constructor
        MySqlCommand cmd = new MySqlCommand(query, connection);

        //Execute command
         cmd.ExecuteNonQuery();

        //close connection
        this.CloseConnection();
    }
} 

例如,registroUsuario是我的userAdmin类中的一个公共文本框,数据库名为“albertolpz94”,表名为“miembros”。我想知道为什么会发生这种情况,或者如何使用参数(正如有人建议的那样),因为我是Mysql>C#

的新手,最好的选择是调试并确定输入是否到达查询部分。同样,确保在执行查询之前打开连接。像您这样提及输入变量不是最佳做法。相反,请尝试以下方法:

public void Insert()
    {
        string query = "insert into albertolpz94.miembros(usuario,contraseña,permisos,nombre,apellidos) values('{0}','{1}','{2}','{3}','{4}')", userAdmin.registroUsuario, userAdmin.registroContraseña, userAdmin.registropermisos2, userAdmin.registroNombre, userAdmin.registroApellidos;
        //DOUBLECHECK IF YOU REALLY OPENED A CONNECTION

        if (this.OpenConnection() == true)
        {
            //create command and assign the query and connection from the constructor
            MySqlCommand cmd = new MySqlCommand(query, connection);

            //Execute command
             cmd.ExecuteNonQuery();

            //close connection
            this.CloseConnection();
        }
    }  

另外,检查
连接的有效性

对您来说,最好的选择是调试并确定输入是否到达查询部分。同样,确保在执行查询之前打开连接。像您这样提及输入变量不是最佳做法。相反,请尝试以下方法:

public void Insert()
    {
        string query = "insert into albertolpz94.miembros(usuario,contraseña,permisos,nombre,apellidos) values('{0}','{1}','{2}','{3}','{4}')", userAdmin.registroUsuario, userAdmin.registroContraseña, userAdmin.registropermisos2, userAdmin.registroNombre, userAdmin.registroApellidos;
        //DOUBLECHECK IF YOU REALLY OPENED A CONNECTION

        if (this.OpenConnection() == true)
        {
            //create command and assign the query and connection from the constructor
            MySqlCommand cmd = new MySqlCommand(query, connection);

            //Execute command
             cmd.ExecuteNonQuery();

            //close connection
            this.CloseConnection();
        }
    }  

另外,首先检查
连接的有效性,知道需要正确处理连接和命令变量。我们通过使用
块来确保这一点,如下所示:

using (MySqlConnection conn = new MySqlConnection())
    using (MySqlCommand cmd = new MySqlCommand()) {

    // ensure your connection is set
    conn.ConnectionString = "your connection string";
    cmd.Connection = conn;

}
然后,使用
@ParamName
对您的
CommandText
进行运算,以表示参数:

using (MySqlConnection conn = new MySqlConnection())
    using (MySqlCommand cmd = new MySqlCommand()) {

    // ensure your connection is set
    conn.ConnectionString = "your connection string";
    cmd.Connection = conn;

    cmd.CommandText = "INSERT INTO ThisTable (Field1, Field2) VALUES (@Param1, @Param2);";

}
接下来,使用cmd.Parameters.AddWithValue()插入值。应该这样做,以便框架能够避免SQL注入攻击(Rustam的回答非常危险,正如您所做的那样):

最后,您可以打开连接并执行它:

using (MySqlConnection conn = new MySqlConnection())
    using (MySqlCommand cmd = new MySqlCommand()) {

    // ensure your connection is set
    conn.ConnectionString = "your connection string";
    cmd.Connection = conn;

    cmd.CommandText = "INSERT INTO ThisTable (Field1, Field2) VALUES (@Param1, @Param2);";

    cmd.Parameters.AddWithValue("@Param1", userAdmin.YourProperty);
    cmd.Parameters.AddWithValue("@Param2", userAdmin.YourOtherProperty);


    cmd.Connection.Open();
    cmd.ExecuteNonQuery();
    cmd.Connection.Close();
}
最后,认识到当这些命令和连接变量退出
using
块时,它们将被正确地处理。
使用
块确保了正确的处理,而不管可能引发的任何异常或我们是否忘记关闭/处理自己

现在,为了进行有用的调试,将核心执行和连接打开包装在
try/catch
块中,如果存在异常,则将异常写入输出窗口:

using (MySqlConnection conn = new MySqlConnection())
    using (MySqlCommand cmd = new MySqlCommand()) {

    // ensure your connection is set
    conn.ConnectionString = "your connection string";
    cmd.Connection = conn;

    cmd.CommandText = "INSERT INTO ThisTable (Field1, Field2) VALUES (@Param1, @Param2);";

    cmd.Parameters.AddWithValue("@Param1", userAdmin.YourProperty);
    cmd.Parameters.AddWithValue("@Param2", userAdmin.YourOtherProperty);

    try {
        cmd.Connection.Open();
        cmd.ExecuteNonQuery();
        cmd.Connection.Close();
    } catch (Exception e) {
        System.Diagnostics.Debug.WriteLine("EXCEPTION: " + e.ToString());
    }
}
此时,您在异常捕获上设置了一个断点,并检查本地窗口以查看您的状态。。。在局部变量中,您应该看到您的
cmd
变量。。。展开它,查找
参数
集合,展开它,检查计数和值等,如图所示:


首先,要知道需要正确处理连接和命令变量。我们通过使用
块来确保这一点,如下所示:

using (MySqlConnection conn = new MySqlConnection())
    using (MySqlCommand cmd = new MySqlCommand()) {

    // ensure your connection is set
    conn.ConnectionString = "your connection string";
    cmd.Connection = conn;

}
然后,使用
@ParamName
对您的
CommandText
进行运算,以表示参数:

using (MySqlConnection conn = new MySqlConnection())
    using (MySqlCommand cmd = new MySqlCommand()) {

    // ensure your connection is set
    conn.ConnectionString = "your connection string";
    cmd.Connection = conn;

    cmd.CommandText = "INSERT INTO ThisTable (Field1, Field2) VALUES (@Param1, @Param2);";

}
接下来,使用cmd.Parameters.AddWithValue()插入值。应该这样做,以便框架能够避免SQL注入攻击(Rustam的回答非常危险,正如您所做的那样):

最后,您可以打开连接并执行它:

using (MySqlConnection conn = new MySqlConnection())
    using (MySqlCommand cmd = new MySqlCommand()) {

    // ensure your connection is set
    conn.ConnectionString = "your connection string";
    cmd.Connection = conn;

    cmd.CommandText = "INSERT INTO ThisTable (Field1, Field2) VALUES (@Param1, @Param2);";

    cmd.Parameters.AddWithValue("@Param1", userAdmin.YourProperty);
    cmd.Parameters.AddWithValue("@Param2", userAdmin.YourOtherProperty);


    cmd.Connection.Open();
    cmd.ExecuteNonQuery();
    cmd.Connection.Close();
}
最后,认识到当这些命令和连接变量退出
using
块时,它们将被正确地处理。
使用
块确保了正确的处理,而不管可能引发的任何异常或我们是否忘记关闭/处理自己

现在,为了进行有用的调试,将核心执行和连接打开包装在
try/catch
块中,如果存在异常,则将异常写入输出窗口:

using (MySqlConnection conn = new MySqlConnection())
    using (MySqlCommand cmd = new MySqlCommand()) {

    // ensure your connection is set
    conn.ConnectionString = "your connection string";
    cmd.Connection = conn;

    cmd.CommandText = "INSERT INTO ThisTable (Field1, Field2) VALUES (@Param1, @Param2);";

    cmd.Parameters.AddWithValue("@Param1", userAdmin.YourProperty);
    cmd.Parameters.AddWithValue("@Param2", userAdmin.YourOtherProperty);

    try {
        cmd.Connection.Open();
        cmd.ExecuteNonQuery();
        cmd.Connection.Close();
    } catch (Exception e) {
        System.Diagnostics.Debug.WriteLine("EXCEPTION: " + e.ToString());
    }
}
此时,您在异常捕获上设置了一个断点,并检查本地窗口以查看您的状态。。。在局部变量中,您应该看到您的
cmd
变量。。。展开它,查找
参数
集合,展开它,检查计数和值等,如图所示:


尝试使用参数化查询-所以?插入一个调试器,设置一个断点,然后查看您如此笨拙地组合在一起的SQL(而不是使用参数)。这行创建空白是什么意思?您的表中有一个新行,而这一行没有数据?是的,这就是我的意思。它在表中创建新行,值为空。(即使我将它们设置为NotNull)我对如何在列上具有NotNull约束的一行空值感到困惑。。。我知道MySQL非常古怪,但这很荒谬。尝试使用参数化查询-那么?插入一个调试器,设置一个断点,然后查看您如此笨拙地组合在一起的SQL(而不是使用参数)。这行创建空白是什么意思?您的表中有一个新行,而这一行没有数据?是的,这就是我的意思。它在表中创建新行,值为空。(即使我将它们设置为NotNull)我对如何在列上具有NotNull约束的一行空值感到困惑。。。我知道MySQL非常奇怪,但这很荒谬。抱歉,但下一票是建议将非参数化格式化字符串放入查询字符串,而不是正确确保连接处理。抱歉,但下一票是建议将非参数化格式化字符串放入查询字符串,如果将我的参数设置为userAdmin.textBox 1,这就是我的数据库接收到的:“System.Windows.Forms.textBox,Text:”,如果将我的参数设置为userAdmin.textBox1.Text,我会得到空白。在这种情况下,这听起来像是textBox的绑定问题。您请求文本框本身的值时似乎返回null或空字符串。。。你能证实这一点吗?(例如,在开始执行任何db工作之前,抛出一个断点并使用即时窗口进行检查,或将值输出到输出窗口,如我的答案的catch块中所述)如果将我的参数设置为userAdmin.textBox 1,这就是我的数据库接收到的:“System.Windows.Forms.textBox,Text:”,如果将我的参数设置为userAdmin.textBox1.text,我会得到空白。在这种情况下,听起来像是t的绑定问题