如何在C#中的变量中保存SQL“Select”结果

时间:2011-04-22 04:35:29

标签: c# mysql sql

我正在使用Visual C#连接到MySQL进行学习,当他输入已存在的用户名时,我一直在向用户抛出错误。

将事物放入数据库的当前代码(一旦我的问题可能更多地关于SQL,它可能毫无用处):

s = new sql(); // This calls a class that works as an adapter to connect form with the database
Conn = s.Connection;
Conn.Open();
coma = Conn.CreateCommand();
coma.CommandText = "INSERT INTO test.test (`user`,`password`) VALUES ('"+username.Text+"','"+password.Text+"');";

coma.ExecuteNonQuery();

我想要做的是将“username.Text”(“username”是一个TextBox)与数据库的“test”表上的值进行比较,如果某个值匹配,则调用MessageBox.Show (“嘿伙计,这个用户名已经在使用了!尝试不同的东西)

2 个答案:

答案 0 :(得分:5)

关于代码示例的一些要点

  1. 您希望确保丢弃连接和命令对象。对于我的回答,我已将它们包含在using语句中,这些语句将为我处理。
  2. 您不想使用unsanitized inputs转到数据库。我将在示例中使用参数化查询。
  3. 以纯文本格式存储密码不是一个好主意。 我不会展示更安全的技术,只需知道look for information about encrypting passwords,盐键等。
  4. 现在有些代码了。在这里,我正在使用OleDb个对象,对您的特定数据库进行改造。当然,为表格,列等提供适当的名称。

    using (OleDbConnection connection = SomeMethodReturningConnection())
    using (OleDbCommand command = SomeMethodReturningCommand())
    {
        command.Parameters.Add(new OleDbParameter("@username", username));
        command.CommandText = "Select Count(*) From Users where Username = @username";
        connection.Open();
        int output = (int)command.ExecuteScalar();
    
        if (output > 0)
        {
            // username already exists, provide appropriate action
        }
        else
        {
            // perform insert 
            // note: @username parameter already exists, do not need to add again
            command.Parameters.Add(new OleDbParameter("@password", password));
            command.CommandText = "Insert Into Users (Username, Password) Values (@username, @password)";
            command.ExecuteNonQuery();
        }
    }
    

答案 1 :(得分:1)

谢谢安东尼!你的回答让我走上正轨。虽然有些东西会阅读这篇文章的人应该改变你的代码,以便让它使用Odbc连接器:解析参数的方式和提取文本框内容的方式:

using (OdbcConnection connection = SomeMethodReturningConnection())
using (OdbcCommand command = SomeMethodReturningCommand())
{
    command.Parameters.Add(new OdbcParameter("@username", username.Text));
    command.CommandText = "Select Count(*) From Users where Username = ?";
    connection.Open();
    int output = (int)command.ExecuteScalar();

    if (output > 0)
    {
        // username already exists, provide appropriate action
    }
    else
    {
        // perform insert 
        // note: @username parameter already exists, do not need to add again
        command.Parameters.Add(new OdbcParameter("@password", password.Text));
        command.CommandText = "Insert Into Users (Username, Password) Values (?,?)**";
        command.ExecuteNonQuery();
    }
}

无论如何,谢谢!